本篇文章给大家详细介绍一下java实现贪吃蛇小游戏的方法。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。
1. 程序结构 程序结构图如图:
2. 程序设计思路2.1 data类作用:连接statics文件夹,将静态资源包中的图片转化为图标 方便在面板上绘制。实现:使用class.getresource(string path)方法。 代码如下:
package com.snake;import javax.swing.*;import java.net.url;public class data { //贪吃蛇头部 public static url upurl = data.class.getresource("/statics/up.png"); public static imageicon up = new imageicon(upurl); public static url downurl = data.class.getresource("/statics/down.png"); public static imageicon down = new imageicon(downurl); public static url lefturl = data.class.getresource("/statics/left.png"); public static imageicon left = new imageicon(lefturl); public static url righturl = data.class.getresource("/statics/right.png"); public static imageicon right = new imageicon(righturl); //贪食蛇身体 public static url bodyurl = data.class.getresource("/statics/body.png"); public static imageicon body = new imageicon(bodyurl); //食物 public static url foodurl = data.class.getresource("/statics/food.png"); public static imageicon food = new imageicon(foodurl);}
2.2 startgame类作用:创建游戏窗口,在窗口中添加一个游戏面板。实现:使用jframe类创建游戏窗口,利用其add()方法添加一个gamepanel类实例化对象。 代码如下:
package com.snake;import javax.swing.*;import java.awt.*;public class startgame { public static void main(string[] args){ //建立游戏窗口 jframe frame = new jframe("java-贪吃蛇小游戏");//标题 frame.setsize(900,720);//窗口大小 frame.setlocationrelativeto(null);//窗口显示屏幕中间 frame.setresizable(false);//固定窗口大小 frame.setdefaultcloseoperation(jframe.exit_on_close);//设置窗体关闭事件 frame.add(new gamepanel());//添加游戏内容 frame.setvisible(true);//设置窗体可见 }}
2.3 gamepanel类作用:实现游戏的动态页面。实现:(1)init()方法:初始化小蛇位置;
(2)eat()方法:用随机种子随机食物的位置,并进行判定,食物位置不能和小蛇位置重合;
(3)继承jpanel类,重写paintcomponent(graphics g)方法,在方法中绘制标题栏、小蛇的位置(根据direction小蛇头部方向变量绘制小蛇头部)、小蛇身体、积分栏、游戏提醒项与失败判断项;
(4)实现keylistener 接口中的keypressed(keyevent e)方法,获取键盘输入,根据键盘输入对游戏状态或者小蛇头部方向direction变量进行更改;
(5)实现actionlistener接口中的actionperformed(actionevent e)方法,根据游戏状态和direction变量进行小蛇移动操作(注意禁用直接回头操作),进行吃食物判定和死亡判定。使用timer计时器让游戏动态变化,用repaint()方法实时更新界面。
代码如下:package com.snake;import javax.swing.*;import java.awt.*;import java.awt.event.actionevent;import java.awt.event.actionlistener;import java.awt.event.keyevent;import java.awt.event.keylistener;import java.util.random;public class gamepanel extends jpanel implements keylistener, actionlistener { int[] snakex = new int[500];//贪吃蛇横坐标 int[] snakey = new int[500];//贪吃蛇纵坐标 int foodx;//食物横坐标 int foody;//食物蛇纵坐标 int length;//贪吃蛇的长度 string direction;//贪吃蛇头方向 int score;//积分 random r = new random(); timer timer = new timer(100,this); boolean isstart; boolean isfail; //构造函数 public gamepanel(){ init(); this.setfocusable(true); this.addkeylistener(this); timer.start(); } private void init(){ length=3; snakex[0]=100;snakey[0]=100; snakex[1]=75;snakey[1]=100; snakex[2]=50;snakey[2]=100; direction = "r"; eat(foodx,foody); isstart = false; isfail = false; score = 0; } private void eat(int x,int y){ x= 25 + 25*r.nextint(34); y= 75 + 25*r.nextint(24); for (int i = 0; i < length; i++) { if(snakex[i]==x&&snakey[i]==y){ x = 25 + 25*r.nextint(34); y = 75 + 25*r.nextint(24); } } foodx = x;foody = y; } protected void paintcomponent(graphics g) { super.paintcomponent(g); this.setbackground(color.white);//设置背景板为白色 //画标题 g.setcolor(color.green); g.setfont(new font("幼圆",font.bold,50)); g.drawstring("贪吃蛇游戏",300,60); //绘制游戏区域 g.setcolor(color.gray); g.fillrect(25,75,850,600); //画贪吃蛇头部 if(direction=="r"){ data.right.painticon(this,g,snakex[0],snakey[0]); } else if(direction=="l"){ data.left.painticon(this,g,snakex[0],snakey[0]); } if(direction=="u"){ data.up.painticon(this,g,snakex[0],snakey[0]); } else if(direction=="d"){ data.down.painticon(this,g,snakex[0],snakey[0]); } //画身体 for (int i = 1; i < length ; i++) { data.body.painticon(this,g,snakex[i],snakey[i]); } //画食物 data.food.painticon(this,g,foodx,foody); //绘制积分栏 g.setcolor(color.black); g.setfont(new font("幼圆",font.bold,20)); g.drawstring("长度:"+length,730,30); g.drawstring("得分:"+score,730,60); //游戏开始提醒 if(isstart==false){ g.setcolor(color.black); g.setfont(new font("幼圆",font.bold,40)); g.drawstring("按空格键开始游戏",300,300); } //失败判断 if(isfail){ g.setcolor(color.red); g.setfont(new font("幼圆",font.bold,40)); g.drawstring("游戏失败,按空格键重新开始",300,300); } } @override public void keypressed(keyevent e) { int keycode = e.getkeycode();//获取按下的按键 //判断空格 if(keycode==keyevent.vk_space){ if(isfail){ isfail = false; init(); } else{ isstart = !isstart; } repaint(); } //判断方向 if(keycode==keyevent.vk_left&&direction!="r"){ direction = "l"; } else if(keycode==keyevent.vk_right&&direction!="l"){ direction = "r"; } else if(keycode==keyevent.vk_up&&direction!="d"){ direction = "u"; } else if(keycode==keyevent.vk_down&&direction!="u"){ direction = "d"; } } @override public void keyreleased(keyevent e) { } @override public void keytyped(keyevent e) { } @override public void actionperformed(actionevent e) { //判断游戏状态 if(isstart&&!isfail){ //移动身体 for (int i = length-1; i > 0 ; i--) { snakex[i] = snakex[i-1]; snakey[i] = snakey[i-1]; } //移动头部 if(direction=="r"){ snakex[0] += 25; if(snakex[0]>850){ snakex[0] = 25; } } else if(direction=="l"){ snakex[0] -= 25; if(snakex[0]<25){ snakex[0] = 850; } } else if(direction=="u"){ snakey[0] -= 25; if(snakey[0]<75){ snakey[0] = 650; } } else if(direction=="d"){ snakey[0] += 25; if(snakey[0]>650){ snakey[0] = 75; } } //吃食物 if(snakex[0]==foodx&&snakey[0]==foody){ length++; score += 10; eat(foodx,foody); } //死亡判定 for (int i = 1; i < length; i++) { if(snakex[0]==snakex[i]&&snakey[0]==snakey[i]){ isfail=true; } } repaint(); } timer.start(); }}
3. 游戏展示
推荐:《java视频教程》
以上就是java如何实现贪吃蛇小游戏的详细内容。