A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 EnterEn_RllVn 于 2016-6-9 18:46 编辑

        这个游戏是自己花了6天多的时间写的,其中思考花了4天多的时间,代码写了2,3天左右。运用到的知识应该是到GUI一块,没有用到多线程以及后面的内容。这个游戏我是发布在了自己的CSDN博客上的,后来一想,自己也是黑马人,于是就拿过来跟大家分享一下,希望大家能共同学习。
        贪吃蛇是一款十分经典的小游戏,对初入coding的朋友来说,拿贪吃蛇这样一个案例来练手十分合适,并不高的难度和成功后的成就感都是学习所必须的。下面我将依照我当时的思路,来逐步分析实现的整个过程。让我们逐一分析。        首先,整个游戏最基本的元素是地图。在java中用于绘图的类是swing和awt,在这里主要用到swing类。swing中用于窗口显示的类有JFrame及其子类。JFrame可以直接添加组件,但其本质是将组件添加到JFrame中的一个默认面板里,为了代码清晰,我会使用JPanel面板来绘制全部的动画,之后再将面板添加到JFrame窗体之中即可。
        我们可能会疑惑于贪吃蛇的蛇身,它是由什么组成的?如何实现移动?我们可以把贪吃蛇的蛇身理解成一个集合,它有固定的起始元素,代表游戏一开始时的蛇身。当贪吃蛇吃到点时,集合就添加一个元素,蛇的长度就加一。那么,集合中的元素是什么呢?要理解这个问题,首先得关注蛇身移动所处的环境。在JFrame窗体中,是由X、Y轴坐标对位置进行区分。贪吃蛇的蛇身可以看做是一个一个联系紧密的点,在坐标轴上显示出来。每当朝某个方向移动时,蛇的坐标就按照某个规律变化。例如,我们操控贪吃蛇向上移动时,蛇的全体坐标的Y轴就减一;如果蛇的第一个坐标与蛇身的某个坐标重合,就代表贪吃蛇碰到自己;如果蛇的第一个坐标碰到了边界,蛇就撞墙。这就是贪吃蛇的本质。        我们来建立建立蛇身上每一个点的对象,蛇身就是由一个一个这样的对象所组成的:     
   
  1. public class snakeNode {
  2.         private int x;
  3.         private int y;
  4.         private String color;
  5.         public snakeNode() {};
  6.         public snakeNode(int x, int y, String color) {
  7.                 this.x = x;
  8.                 this.y = y;
  9.                 this.color = color;
  10.                 }
  11.         public int getX() {
  12.                 return x;
  13.                 }
  14.         public void setX(int x) {
  15.                 this.x = x;
  16.                 }
  17.         public int getY() {
  18.                 return y;
  19.                 }
  20.         public void setY(int Y) {
  21.                 this.y = y;
  22.                 }
  23.         public String getColor() {
  24.                 return color;
  25.                 }
  26.         public void setColor(String color) {
  27.                 this.color = color;
  28.                 }
复制代码



        这串代码表示蛇身上的每一个点,通过建立snakeNode的对象,指定不同的X轴和Y轴的值,就能组成一个蛇身。 接下来我们要给每一个蛇身上的点设置范围,因为贪吃蛇有移动范围的限制,超过某个距离或者长度,就会越界导致游戏的终止。经过考虑,我们将范围设置在
  1. public class mainMap extends JPanel {
  2.         private int width = 20;
  3.         private int length = 30;
  4.         private int unit = 20;
  5.         }
复制代码

   上面的代码定义了一个面板类,我们之后的操作都要在上面进行。类中定义了变量width和length。我们将蛇身的移动范围限制在X轴上0~20,Y轴上0~30,至于变量unit,稍后再进行分析。```接着,我们需要一个集合,用来存储蛇身上的各个点。我们需要定义一个变量,用来表示随机出现的点(贪吃蛇的目标),并且定义一个变量Length用来表示蛇的长度。代码如下:

  1. public class mainMap extends JPanel {
  2.         private final int width = 20;
  3.         private final int length = 30;
  4.         private final int unit = 20;
  5.         private ArrayList<snakeNode> snake = new ArrayList<>();
  6.         private snakeNode newNode = new snakeNode(0,0,Color.WHITE);
  7.         private int Length;
  8.         }
  9. ```
复制代码



定义类的成员变量之后,我们开始定义构造方法,这样在构造mainMap的对象后程序就会开始运行。我们需要在构造方法中给集合添加一些元素,代表初始蛇身,也需要使用一个方法,用来创造随机点。代码如下
  1. public mainMap() {
  2.         snake.add(new snakeNode(width/2,length/2,Color.RED);
  3.         snake.add(new snakeNode(width/2,length/2+1,Color.BLUE);
  4.         snake.add(new snakeNode(width/2,length/2+2,Color.GREY);
  5.         Length = snake.size();
  6.         createNode();
  7.         }
  8. ```
复制代码

createNode是创造随机点的方法,让我们思考一下:创造随机点有哪些要求?首先,随机点的范围肯定不能超出限制,否则游戏将无法继续;其次,随机点不能出现在蛇身上,也就是随机点的坐标不能和蛇身体上的任意坐标相同,否则就会出现BUG。按照此要求,我们创作出代码如下

  1. public void createNode() {
  2.         int newX = 0;
  3.         int newY = 0;
  4.         boolean flag = true;
  5.         while(flag){
  6.         X = new Random().nextInt(width);
  7.         Y = new Random().nextInt(length);
  8.         for(int x = 0; x < Length; x++) {
  9.                 if(snake.get(x).getX() == newX && snake.get(x).getY() == newY) {
  10.                 flag = true;
  11.                 break;
  12.                 }
  13.                 flag = false;
  14.         }
  15. }
  16.         Color color = new Color(new Random().nextInt(255),new Random().nextInt(255),new Random().nextInt(255));
  17.         newNode.setX(newX);
  18.         newNode.setY(newY);
  19.         newNode.setColor(color);
  20.         }
复制代码

      这个方法随机产生0~width,0~length的随机数,通过循环判断是否与蛇身的点重合来产生随机点,同时产生随机的颜色,这里使用了Color的构造方法,不清楚的话可以通过API来查询。



0 个回复

您需要登录后才可以回帖 登录 | 加入黑马