我正在参加掘金社区游戏创意投稿大赛个人赛,详情请看:游戏创意投稿大赛。
设计思路:
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++;
}
}
总结
简单写了下,就是jframe和线程的一个简单应用,就摘抄了部分代码,好了,本文就给大家介绍到这里,感觉有帮助的,留下个赞或评论再走吧!谢啦~ 💐