云社区 博客 博客详情

java实现贪吃蛇游戏

CSDN 发表于 2020-12-24 22:58:12 2020-12-24
0
0

【摘要】 首先,本游戏的素材和部分代码来自b站:遇见狂神说 代码下载链接:https://download.csdn.net/download/qq_41505957/13744744 游戏界面 GUI界面 java实现贪吃蛇游戏需要创建一个桌面窗口出来,此时就需要使用java中的swing控件 创建一个新窗口 JFrame frame = new JFrame...

首先,本游戏的素材和部分代码来自b站:遇见狂神说
代码下载链接:https://download.csdn.net/download/qq_41505957/13744744

游戏界面

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

GUI界面

java实现贪吃蛇游戏需要创建一个桌面窗口出来,此时就需要使用java中的swing控件

创建一个新窗口

JFrame frame = new JFrame("贪吃蛇游戏");
//设置大小
frame.setBounds(10, 10, 900, 720);

  
 
  • 1
  • 2
  • 3

向窗口中添加控件

可以直接用add方法往窗口中添加控件

这里我创建GamePanel类继承自Panel,最后使用add方法添加GamePanel

加载图片

图片加载之后可以添加到窗口上

public static URL bodyUrl = GetImage.class.getResource("/picture/body.png");
public static ImageIcon body = new ImageIcon(bodyUrl);

  
 
  • 1
  • 2

逻辑实现

//每次刷新页面需要进行的操作 @Override public void actionPerformed(ActionEvent e) { //当游戏处于开始状态且游戏没有失败时 if(gameStart && !isFail) { //蛇头所在的位置就是下一次蛇身体的位置 bodyX[++bodyIndexRight] = headX; bodyY[bodyIndexRight] = headY; //bodyIndexLeft++; //长度到达数组的尾部 if(bodyIndexRight==480) { for(int i=bodyIndexLeft, j=0; i<=bodyIndexRight; i++,j++) { bodyX[j]=bodyX[i]; bodyY[j]=bodyY[i]; } bodyIndexLeft=0; bodyIndexRight=length-1; } //更新头部位置 if(fdirection==1) { //头部方向为上,将蛇头向上移动一个单位 headY-=25; } else if(fdirection==2) { //头部方向为下,将蛇头向下移动一个单位 headY+=25; } else if(fdirection==3) { //头部方向为左,将蛇头向左移动一个单位 headX-=25; } else if(fdirection==4) { //头部方向为右,将蛇头向右移动一个单位 headX+=25; } //当X坐标与Y坐标到达极限的时候,从另一端出来 if(headX<25) headX = 850; if(headX>850) headX = 25; if(headY<75) headY = 650; if(headY>650) headY = 75; //当头部坐标和食物坐标重合时 if(headX==foodX && headY==foodY){ length++; score+=10; //重新生成食物,判断食物坐标和蛇身坐标是否重合,效率较慢 while(true) { foodX = 25 + 25* random.nextInt(34); foodY = 75 + 25* random.nextInt(24); //判断食物是否和头部身体重合 boolean isRepeat = false; //和头部重合 if(foodX == headX && foodY == headY) isRepeat = true; //和身体重合 for(int i=bodyIndexLeft; i<=bodyIndexRight; i++) { if(foodX == bodyX[i] && foodY == bodyY[i]){ isRepeat = true; } } //当不重复的时候,食物生成成功,跳出循环 if(isRepeat==false) break; } } else bodyIndexLeft++; //判断头部是否和身体重合 for(int i=bodyIndexLeft; i<=bodyIndexRight;i++) { if(headX==bodyX[i] && headY==bodyY[i]){ //游戏失败 isFail = true; break; } } repaint(); } timer.start(); }

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89

键盘监听

实现KeyListener接口,重写KeyPressed方法,在其中写当键盘按下时所对应的操作。

//键盘监听事件 @Override public void keyPressed(KeyEvent e) { int keyCode = e.getKeyCode(); //获取按下的键盘 if (keyCode==KeyEvent.VK_SPACE){ //如果是空格 if (isFail){ //如果游戏失败,从头再来! isFail = false; init(); //重新初始化 }else { //否则,如果游戏中,暂停游戏,如果暂停游戏,开始游戏 gameStart = !gameStart; } repaint(); } if (keyCode==KeyEvent.VK_LEFT){ //左 //不能掉头,当当前头的方向和要转的方向不相反时才能调转方向 if(fdirection!=4) { fdirection = 3; } }else if (keyCode==KeyEvent.VK_RIGHT){ //左 if(fdirection!=3) fdirection = 4; }else if (keyCode==KeyEvent.VK_UP){ //上 if(fdirection!=2) fdirection = 1; }else if (keyCode==KeyEvent.VK_DOWN){ //下 if(fdirection!=1) fdirection = 2; } }

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36

文章来源: blog.csdn.net,作者:张宜强,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/qq_41505957/article/details/111561067

登录后可下载附件,请登录或者注册

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件至:huaweicloud.bbs@huawei.com进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容。
评论文章 //点赞 收藏 0
点赞
分享文章到微博
分享文章到朋友圈

上一篇:分析游戏外挂样本的9大诀窍

下一篇:ARFoundation系列讲解-15ARWorldMap二

评论 (0)


登录后可评论,请 登录注册

评论