贪吃蛇小游戏

709 阅读3分钟

我正在参加掘金社区游戏创意投稿大赛个人赛,详情请看:游戏创意投稿大赛

设计思路:

1.创建JFrame窗体,设定好页面大小,同时创建主体面板。

2.画静态的蛇 ,确定蛇头和初始的身体

3.增加键盘监听,键盘控制蛇头移动方向

4.主体面板设定好边界,设置游戏界面框大小,用于结束游戏的判断

5.判断是否结束游戏,当蛇头碰到自己身体时,结束游戏,当蛇头碰到画板边界时,结束游戏

6.计算分数,每次迟到食物,随机坐标生成新的食物,同时分数加一,游戏结束后分数清零

总体开发思想

创建JFrame窗体,并设定好大小,引入画布主题类

public static void main(String[] args) {
​
​
        JFrame jframe = new JFrame();
​
        jframe.setTitle("贪吃蛇小游戏");
        jframe.setBounds(300, 50, 650, 470);
        jframe.setResizable(false);
        jframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
​
        jframe.add(new GamePanel());
        jframe.setVisible(true);
​
    }

创建图片类ReadyImages ,读取准备好的静态图片信息,静态图片存放在images包。

创建主体面板,并增加键盘监听类,通过上下左右键控制蛇头的转向,创建方向控制,代码如下:

​
    public void keyPressed(KeyEvent e) {
​
        int keyCode = e.getKeyCode();
​
        if (keyCode == KeyEvent.VK_SPACE) { 
​
            isstart = !isstart; 
​
        } else if (keyCode == KeyEvent.VK_LEFT) {
​
            action = "L";
        } else if (keyCode == KeyEvent.VK_RIGHT) {
​
            action = "R";
        } else if (keyCode == KeyEvent.VK_UP) {
​
            action = "U";
        } else if (keyCode == KeyEvent.VK_DOWN) {
            action = "D";
        }
​

画板主体中初始化游戏设置,创建蛇对象,随机生成食物位置,将键盘事件添加到画布上

    public void initGame() {
​
       
        snake = new Snake();
        keyListener = new GameKeyListener(snake.action,start);
​
​
        foodX = 25 + 25 * random.nextInt(24);  
        foodY = 75 + 25 * random.nextInt(14);
​
        this.setFocusable(true); 
        this.addKeyListener(keyListener);   
​
    }

创建贪吃蛇对象,初始化位置,并通过线程控制蛇的位置。记录通过两个数组蛇头及身体的坐标点位置,将头位置增加到数组中,并将最末尾的元素删除,使贪吃蛇移动,每秒移动一次。

​
public class Snake implements Runnable { 
    public int snakeLength;
    public int[] snakeX = new int[600]; 
    public int[] snakeY = new int[500]; 
    public String action = "R";   
    public ImageIcon headimages = ReadyImages.headrightIcon;
​
    public Snake() {
​
        snakeLength = 3;
        snakeX[0] = 100;snakeY[0] = 100;
        snakeX[1] = 75;snakeY[1] = 100;
        snakeX[2] = 50;snakeY[2] = 100;
    }
​
    @Override
    public void run() {
​
        for (int i = snakeLength - 1; i > 0; i--) { 
​
            snakeX[i] = snakeX[i - 1];
            snakeY[i] = snakeY[i - 1];
​
        }
​
        try {
            Thread.sleep(100);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
​
    }
}

通过键盘对蛇进行控制,当action=‘U’或action=‘D’,即使蛇头向上或向下时,将蛇头Y的坐标改变 ,并将图片进行更换,当action=‘L’或action=‘R’,即使蛇头向左或向右时,将蛇头X的坐标改变 ,并将图片进行更换,当坐标大于边界的长度时,结束游戏。返回true,同理,当 x,y坐标点已存在于数组中,即蛇头碰到自己的身体了,同样结束游戏

 public boolean border() {
​
        if (action == "L") {
​
            snakeX[0] = snakeX[0] - 25;
            if (snakeX[0] < 25) {
                return true;
            }
​
            headimages = ReadyImages.headleftIcon;
​
        } else if (action == "R") {
​
            snakeX[0] = snakeX[0] + 25;
            if (snakeX[0] > 600) {
                return true;
            }
​
            headimages = ReadyImages.headrightIcon;
​
        } else if (action == "U") {
​
            snakeY[0] = snakeY[0] - 25;
            if (snakeY[0] < 75) {
                return true;
            }
            headimages = ReadyImages.headupIcon;
​
        } else if (action == "D") {
​
            snakeY[0] = snakeY[0] + 25;
            if (snakeY[0] > 400) {
                return true;
            }
            headimages = ReadyImages.headdownIcon;
        }
        return false;
    }

增加吃食物的动作,当蛇头和食物重合时,身体长度加1.

public boolean eatfood(int foodx, int foody) {
​
    if (foodx == snakeX[0] && foody == snakeY[0]) {
​
        snakeLength++; 
        return true;
    }
​
    return false;
}

当游戏开始时,开始线程,并判断蛇是否接触边界,和蛇头的方向,如果蛇头碰到食物,调用吃掉事务的方法,并随机位置生成事务。如上返回true,结束游戏,弹出提示,并将分数清零。

if(start == true && dead == false) {
​
    snake.run();  
    dead =    snake.border();   
    if (dead) {
​
        g.setColor(Color.BLACK);
        g.setFont(new Font("微软雅黑", Font.BOLD, 30));
        g.drawString("游戏结束,按下空格键开始", 180, 250);
​
        grade = 0;
​
    }
​
    boolean eatting = snake.eatfood(foodX, foodY);
​
    if(eatting) { 
​
        foodX = 25 + 25 * random.nextInt(24);    
        foodY = 75 + 25 * random.nextInt(14);
        grade++;
    }
​
}

总结

image.png

image.png 简单写了下,就是jframe和线程的一个简单应用,就摘抄了部分代码,好了,本文就给大家介绍到这里,感觉有帮助的,留下个赞或评论再走吧!谢啦~ 💐