当前位置: 首页 > news >正文

网站建设完工报告网站开发晋升空间 路径

网站建设完工报告,网站开发晋升空间 路径,徐州网站制作报价,wordpress最好的免费主题2018游戏背景介绍 贪吃蛇游戏是一款经典的小游戏#xff0c;它的玩法很简单#xff0c;就是控制蛇吃食物#xff0c;每吃一个食物蛇的长度就会加一#xff0c;直到蛇撞到墙壁或者撞到自己时游戏结束#xff0c;最终的得分是蛇的长度减一。 JavaFX 用Java开发桌面端首选就是J…游戏背景介绍 贪吃蛇游戏是一款经典的小游戏它的玩法很简单就是控制蛇吃食物每吃一个食物蛇的长度就会加一直到蛇撞到墙壁或者撞到自己时游戏结束最终的得分是蛇的长度减一。 JavaFX 用Java开发桌面端首选就是JavaFX它的推出用来取代Swing一个古老的Java桌面端框架。 虽然都说Java开发桌面端性能不行但是我们的Java开发工具IntelliJ IDEA的界面是由JavaFX构建的。最开始的我的世界Minecraft这款游戏是Java开发的虽然没有使用Java标准GUI库它自己的游戏引擎和自定义的用户界面但也足以证明Java的魅力。 游戏规则 初始时蛇的长度为一位于游戏界面的中心位置。每次随机生成一块食物食物不能出现在蛇的身体上。蛇可以通过四个方向键上下左右移动不能撞到墙壁或自己的身体。每吃一块食物蛇的长度加一。穿过左边的墙壁出现在右边穿过上边的墙壁出现在下面反之亦然。游戏结束时弹出得分对话框点击重新开始新游戏。 代码结构 本教程主要涉及的代码文件是SnakeGame.java整个代码文件的框架如下 import java.util.ArrayDeque; import java.util.Deque; import javafx.animation.AnimationTimer; import javafx.application.Application; import javafx.geometry.Pos; import javafx.scene.Scene; import javafx.scene.canvas.Canvas; import javafx.scene.canvas.GraphicsContext; import javafx.scene.control.Alert; import javafx.scene.control.Alert.AlertType; import javafx.scene.input.KeyCode; import javafx.scene.layout.StackPane; import javafx.stage.Stage;public class SnakeGame extends Application {// 游戏界面的宽度private static final int WIDTH 20;// 游戏界面的高度private static final int HEIGHT 20;// 每个格子的大小private static final int SIZE 20;// 蛇的速度private static final int SPEED 5;// 蛇的身体private DequePoint snake new ArrayDeque();// 蛇的初始方向private Direction direction Direction.RIGHT;// 食物的位置private Point food;// 游戏是否结束private boolean gameOver false;// 游戏是否暂停private boolean gamePaused false;Overridepublic void start(Stage primaryStage) throws Exception {// 界面初始化// ...// 初始化游戏// ...// 动画循环// ...}// 界面初始化方法private void initGUI() {// ...}// 初始化游戏方法private void initGame() {// ...}// 蛇的移动方法private void move() {// ...}// 检测碰撞方法private void checkCollision() {// ...}// 生成食物方法private void generateFood() {// ...}// 绘制游戏画面方法private void paint(GraphicsContext gc) {// ...}// 显示游戏结束对话框方法private void showGameOverDialog() {// ...}// 方向枚举类private enum Direction {UP, DOWN, LEFT, RIGHT}// 坐标点类private static class Point {private int x;private int y;public Point(int x, int y) {this.x x;this.y y;}public int getX() {return x;}public int getY() {return y;}Overridepublic boolean equals(Object o) {// ...}Overridepublic int hashCode() {// ...}}public static void main(String[] args) {launch(args);}}逻辑分析 在实现贪吃蛇游戏之前我们需要先了解一下游戏的逻辑。 在游戏界面内不断地移动蛇的位置。蛇的移动方向可以通过键盘上的上下左右四个方向键来控制。当蛇头碰到边界或碰到自己的身体时游戏结束。当蛇头碰到食物时就会吃掉食物长度加1随后继续向前移动。吃掉食物后会重新生成一个新的食物判断新食物的位置是否和已有的蛇的位置冲突。 实现步骤 下面分步骤进行实现每一个步骤都结合代码逻辑清晰。 步骤1界面初始化 在start方法中进行界面的初始化包括创建Canvas、GraphicsContext等并将Canvas添加到StackPane作为根节点最后显示舞台。代码如下 Override public void start(Stage primaryStage) throws Exception {// 创建CanvasCanvas canvas new Canvas(WIDTH * SIZE, HEIGHT * SIZE);GraphicsContext gc canvas.getGraphicsContext2D();// 创建根节点StackPane root new StackPane(canvas);root.setAlignment(Pos.CENTER);// 创建场景Scene scene new Scene(root);scene.setOnKeyPressed(event - {KeyCode keyCode event.getCode();switch (keyCode) {// ...}});// 显示舞台primaryStage.setScene(scene);primaryStage.setTitle(贪吃蛇游戏);primaryStage.setResizable(false);primaryStage.show(); }步骤2初始化游戏 在游戏开始前需要初始化一些参数包括蛇的位置、食物位置、游戏状态等。具体实现代码如下 // 初始化游戏方法 private void initGame() {// 清空蛇的身体snake.clear();// 在游戏界面的中心生成蛇头int x WIDTH / 2;int y HEIGHT / 2;snake.add(new Point(x, y));// 生成食物generateFood();// 初始化游戏状态gameOver false;gamePaused false; }步骤3蛇的移动 在游戏中蛇可以通过键盘上的上下左右四个方向键来控制移动方向。我们可以在Scene的按键监听事件中实现根据按下的方向键修改蛇的移动方向。具体代码实现如下 // Scene的按键监听事件 scene.setOnKeyPressed(event - {KeyCode keyCode event.getCode();switch (keyCode) {case UP:if (direction ! Direction.DOWN) {direction Direction.UP;}break;case DOWN:if (direction ! Direction.UP) {direction Direction.DOWN;}break;case LEFT:if (direction ! Direction.RIGHT) {direction Direction.LEFT;}break;case RIGHT:if (direction ! Direction.LEFT) {direction Direction.RIGHT;}break;case P:gamePaused !gamePaused;break;case R:initGame();break;default:break;} });在每次动画循环中根据蛇的移动方向来计算移动后的新位置。如果新位置在蛇的身体上或者超出了边界就说明游戏结束了。判断蛇是否吃到了食物如果吃到了就让蛇的身体变长并在新位置生成一个新的食物。 // 蛇的移动方法 private void move() {Point head snake.getFirst();Point newHead null;switch (direction) {case UP:newHead new Point(head.getX(), head.getY() - 1);break;case DOWN:newHead new Point(head.getX(), head.getY() 1);break;case LEFT:newHead new Point(head.getX() - 1, head.getY());break;case RIGHT:newHead new Point(head.getX() 1, head.getY());break;default:break;}// 判断是否撞到自己的身体if (snake.contains(newHead)) {gameOver true;showGameOverDialog();return;}// 判断是否撞到墙壁if (newHead.getX() 0 || newHead.getX() WIDTH ||newHead.getY() 0 || newHead.getY() HEIGHT) {gameOver true;showGameOverDialog();return;}// 更新蛇的位置snake.addFirst(newHead);// 判断是否吃到了食物if (newHead.equals(food)) {// 如果吃到了食物就让蛇的身体变长generateFood();} else {// 如果没有吃到食物就让蛇的尾巴消失snake.removeLast();} }步骤4检测碰撞 在每次蛇的移动后需要检测蛇是否撞到了自己的身体。如果撞到了说明游戏结束了。具体代码实现如下 // 检测碰撞方法 private void checkCollision() {Point head snake.getFirst();for (Point point : snake) {if (point ! head point.equals(head)) {gameOver true;showGameOverDialog();break;}} }步骤5生成食物 每个食物都是在游戏界面上随机出现的食物不能出现在蛇的身体上。生成食物时可以使用do-while循环来判断是否有重合的情况。具体代码实现如下 // 生成食物方法 private void generateFood() {boolean validPosition;int x, y;do {validPosition true;x (int) (Math.random() * WIDTH);y (int) (Math.random() * HEIGHT);for (Point point : snake) {if (point.getX() x point.getY() y) {validPosition false;break;}}} while (!validPosition);food new Point(x, y); }步骤6绘制游戏画面 在Canvas上通过GraphicsContext绘制蛇、食物等游戏元素实现游戏的画面。具体代码实现如下 // 绘制游戏画面方法 private void paint(GraphicsContext gc) {// 清空画布gc.clearRect(0, 0, WIDTH * SIZE, HEIGHT * SIZE);// 绘制蛇身gc.setFill(javafx.scene.paint.Color.GREEN);for (Point point : snake) {gc.fillRect(point.getX() * SIZE, point.getY() * SIZE, SIZE, SIZE);}// 绘制头部gc.setFill(javafx.scene.paint.Color.DARKGREEN);Point head snake.getFirst();gc.fillRect(head.getX() * SIZE, head.getY() * SIZE, SIZE, SIZE);// 绘制食物gc.setFill(javafx.scene.paint.Color.RED);gc.fillRect(food.getX() * SIZE, food.getY() * SIZE, SIZE, SIZE); }步骤7显示游戏结束对话框 当游戏结束时弹出得分对话框点击重新开始新游戏。具体代码实现如下 // 显示游戏结束对话框方法 private void showGameOverDialog() {Alert alert new Alert(AlertType.INFORMATION);alert.setTitle(游戏结束);alert.setHeaderText(null);alert.setContentText(游戏结束您的得分是 (snake.size() - 1));alert.show();alert.setOnHidden(event - {initGame();}); }至此贪吃蛇游戏的实现已经完成了。 完整代码如下 package org.example;import javafx.animation.AnimationTimer; import javafx.application.Application; import javafx.geometry.Pos; import javafx.scene.Scene; import javafx.scene.canvas.Canvas; import javafx.scene.canvas.GraphicsContext; import javafx.scene.control.Alert; import javafx.scene.control.Alert.AlertType; import javafx.scene.input.KeyCode; import javafx.scene.layout.StackPane; import javafx.stage.Stage;import java.util.ArrayDeque; import java.util.Deque;public class SnakeGame extends Application {private static final int WIDTH 20; // 游戏界面的宽度private static final int HEIGHT 20; // 游戏界面的高度private static final int SIZE 20; // 每个格子的大小private static final int SPEED 5; // 蛇的速度private DequePoint snake new ArrayDeque(); // 蛇的身体private Direction direction Direction.RIGHT; // 蛇的初始方向private Point food; // 食物的位置private boolean gameOver false; // 游戏是否结束private boolean gamePaused false; // 游戏是否暂停Overridepublic void start(Stage primaryStage) throws Exception {Canvas canvas new Canvas(WIDTH * SIZE, HEIGHT * SIZE);GraphicsContext gc canvas.getGraphicsContext2D();StackPane root new StackPane(canvas);root.setAlignment(Pos.CENTER);Scene scene new Scene(root);scene.setOnKeyPressed(event - {KeyCode keyCode event.getCode();switch (keyCode) {case UP:if (direction ! Direction.DOWN) {direction Direction.UP;}break;case DOWN:if (direction ! Direction.UP) {direction Direction.DOWN;}break;case LEFT:if (direction ! Direction.RIGHT) {direction Direction.LEFT;}break;case RIGHT:if (direction ! Direction.LEFT) {direction Direction.RIGHT;}break;case P:gamePaused !gamePaused;break;case R:initGame();break;default:break;}});primaryStage.setScene(scene);primaryStage.setTitle(贪吃蛇游戏);primaryStage.setResizable(false);primaryStage.show();initGame();new AnimationTimer() {private long lastUpdateTime;Overridepublic void handle(long now) {if (now - lastUpdateTime 1_000_000_000 / SPEED) { // 调整蛇的速度lastUpdateTime now;if (!gameOver !gamePaused) {move();checkCollision();paint(gc);}}}}.start();}// 初始化游戏private void initGame() {snake.clear();snake.add(new Point(WIDTH / 2, HEIGHT / 2));generateFood();gameOver false;gamePaused false;}// 蛇的移动private void move() {Point head snake.getFirst();Point newHead null;switch (direction) {case UP:newHead new Point(head.getX(), head.getY() - 1);break;case DOWN:newHead new Point(head.getX(), head.getY() 1);break;case LEFT:newHead new Point(head.getX() - 1, head.getY());break;case RIGHT:newHead new Point(head.getX() 1, head.getY());break;default:break;}// 判断是否撞到自己的身体if (snake.contains(newHead)) {gameOver true;showGameOverDialog();return;}// 判断是否撞到墙壁if (newHead.getX() 0 || newHead.getX() WIDTH ||newHead.getY() 0 || newHead.getY() HEIGHT) {gameOver true;showGameOverDialog();return;}snake.addFirst(newHead);if (newHead.equals(food)) {generateFood();} else {snake.removeLast();}}// 检测碰撞private void checkCollision() {Point head snake.getFirst();for (Point point : snake) {if (point ! head point.equals(head)) {gameOver true;showGameOverDialog();break;}}}// 生成食物private void generateFood() {boolean validPosition;int x, y;do {validPosition true;x (int) (Math.random() * WIDTH);y (int) (Math.random() * HEIGHT);for (Point point : snake) {if (point.getX() x point.getY() y) {validPosition false;break;}}} while (!validPosition);food new Point(x, y);}// 绘制游戏画面private void paint(GraphicsContext gc) {// 清空画布gc.clearRect(0, 0, WIDTH * SIZE, HEIGHT * SIZE);// 绘制蛇身gc.setFill(javafx.scene.paint.Color.GREEN);for (Point point : snake) {gc.fillRect(point.getX() * SIZE, point.getY() * SIZE, SIZE, SIZE);}// 绘制头部gc.setFill(javafx.scene.paint.Color.DARKGREEN);Point head snake.getFirst();gc.fillRect(head.getX() * SIZE, head.getY() * SIZE, SIZE, SIZE);// 绘制食物gc.setFill(javafx.scene.paint.Color.RED);gc.fillRect(food.getX() * SIZE, food.getY() * SIZE, SIZE, SIZE);}// 显示游戏结束对话框private void showGameOverDialog() {Alert alert new Alert(AlertType.INFORMATION);alert.setTitle(游戏结束);alert.setHeaderText(null);alert.setContentText(游戏结束您的得分是 (snake.size() - 1));alert.show();alert.setOnHidden(event - {initGame(); // 游戏结束后重新开始游戏});}// 方向枚举类private enum Direction {UP, DOWN, LEFT, RIGHT}// 坐标点类private static class Point {private int x;private int y;public Point(int x, int y) {this.x x;this.y y;}public int getX() {return x;}public int getY() {return y;}Overridepublic boolean equals(Object o) {if (this o) return true;if (o null || getClass() ! o.getClass()) return false;Point point (Point) o;return x point.x y point.y;}Overridepublic int hashCode() {return x * 31 y;}}public static void main(String[] args) {launch(args);}}关注微信公众号“小虎哥的技术博客”。我们会定期发布关于Java技术的详尽文章让您能够深入了解该领域的各种技巧和方法让我们一起成为更优秀的程序员‍‍ 相关文章源码放在gitee仓库、github仓库上。
http://www.huolong8.cn/news/103404/

相关文章:

  • 便利的响应式网站建设成都seo正规优化
  • 橙色营销网站城乡建设部网站造价工程师查询
  • 辽宁网站建设哪里好notepad做网站技巧
  • easyui 网站设计移动网站设计心得
  • 建设银行 商户网站打不开全国 网站备案 数量
  • 秦皇岛网站制作公司哪家好深圳全网推广托管
  • 网站游戏网站开发wordpress智能插件
  • 电子商务网站开发附件今天最新新闻国内大事件
  • 简单的网页设计网站网站建设与优化合同
  • 邢台企业网站建设报价wordpress 主机
  • 常州网站建设推荐网站开发计划书封面
  • 网站后台一般是用什么做的argo wordpress 汉化
  • 专业做网站较好的公司怎样通过阿里云建设网站
  • 网站 收录 做301山东人才招聘信息网官网
  • 软件 网站模板上海网站建设高端定制
  • 免费算生辰八字算命大连seo快速排名
  • 公司设计网站定制做汽车网站开题报告的意义
  • 信得过的网站开发推广wordpress免费主题好不好
  • icp许可证对网站的要求中国移动一键登录
  • php做网站访问记录辛集建设局网站
  • 做网站基础建设英文网站费用
  • 商务网站建设策略网站销户说明
  • 枣庄哪里有做网站设计wordpress 登陆不上
  • c 做彩票网站晋江论坛兔区是什么
  • iis 网站乱码成都知名网站建设公司
  • 如何做简易网站设计签名免费名字
  • 榕江网站建设爱尔眼科医院集团
  • 宜昌网站模板wordpress 读取用户信息
  • 门头沟营销型网站建设网站搭建培训
  • 建站模板推荐数据库查询网站模板