Java+swing实现经典贪吃蛇游戏

网友投稿 373 2022-08-31


Java+swing实现经典贪吃蛇游戏

目录前言主要设计功能截图代码实现总结

前言

贪吃蛇(也叫做贪食蛇)游戏是一款休闲益智类游戏,有PC和手机等多平台版本。既简单又耐玩。该游戏通过控制蛇头方向吃东西,从而使得蛇变得越来越长。

本程序是通过java的swing来实现《贪吃蛇大作战》这款游戏。

主要需求

1、通过上下左右控制蛇的方向,寻找吃的东西,每吃一口就能得到一定的积分,蛇的身体会变长

2、蛇头碰到自己的身体,则算失败

主要设计

1、设置swing的窗体大小

2、随机初始化蛇的位置和食物的位置,且食物不能落在蛇的身体上。

4、添加键盘监听器,监听上下左右的方向键,来控制蛇的上下左右运动

5、蛇运行时,头向前走一步,增加一个头部节点,去掉尾部节点。

6、蛇吃了一个食物后,蛇的尾部节点添加一个节点,食物消失。

7、食物每次被蛇吃掉后,要随机再次生成一个新的食物节点。

8、有个计数器,统计蛇的长度和积分,吃一个食物,蛇的长度+1,积分+10

9、通过按空格开始/暂停游戏

功能截图

代码实现

启动类

public class StartGame {

public static void main(String[] args) {

JFrame jf=new JFrame("贪吃蛇大作战");

jf.setBounds(100, 100, 905, 720);

jf.setResizable(false);

jf.setDefaultCloseOperation(WindowConstants.EXIThttp://_ON_CLOSE);

jf.add(new GamePanel());

jf.setVisible(true);

}

}

游戏核心类

public class GamePanel extends JPanel implements KeyListener,ActionListener{

//蛇的数据结构

static int i=0;

int length;

int[] snakex=new int[http://600];

int[] snakey=new int[600];

String fx;

boolean isStart=false;

boolean isfail=false;

int lx,ly;//吃食物后多出来一个的坐标

//目标的数据结构

int foodx,foody;

//随机数

Random random =new Random();

//计时器

Timer timer=new Timer(100, this);

int score;

public GamePanel(){

init();

//添加键盘监听器

this.addKeyListener(this);

//必须设置可以获得焦点才能监听到键盘事件

this.setFocusable(true);

timer.start();

}

public void init(){

score=0;

length=3;

snakex[0]=100;snakey[0]=100;

snakex[1]=75;snakey[1]=100;

snakex[2]=50;snakey[2]=100;

fx="R";

foodx=25+25*random.nextInt(850/25);

foody=75+25*random.nextInt(600/25);

}

protected void paintComponent(Graphics g) {

super.paintComponent(g);//清屏,这样不会闪烁

this.setBackground(Color.white);

Data.headicno.paintIcon(this, g, 25, 11);

g.setColor(new Color(104,197,107));

g.fillRect(25, 75, 850, 600);

//蛇头的绘制

if(fx.equals("U")){

Data.upicno.paintIcon(this, g, snakex[0], snakey[0]);

}else if(fx.equals("D")){

Data.downicno.paintIcon(this, g, snakex[0], snakey[0]);

}else if(fx.equals("L")){

Data.lefticno.paintIcon(this, g, snakex[0], snakey[0]);

}else if(fx.equals("R")){

Data.righticno.paintIcon(this, g, snakex[0], snakey[0]);

}

//蛇身体绘制

for(int i=1;i

Data.bodyicno.paintIcon(this, g, snakex[i], snakey[i]);

}

//食物的绘制

Data.foodicon.paintIcon(this, g, foodx, foody);

//暂停开始状态的绘制

if(isStart==false){

g.setFont(new Font("微软雅黑",Font.BOLD,40));

g.setColor(Color.WHITE);

g.drawString("按空格开始/暂停游戏", 275, 350);

}

//失败情况的绘制

if(isfail==true){

g.setFont(new Font("微软雅黑",Font.BOLD,40));

g.setColor(Color.red);

g.drawString("失败!按空格重新开始", 275, 350);

}

//积分的绘制

g.setColor(Color.PINK);

g.setFont(new Font("微软雅黑", Font.ITALIC, 15));

g.drawString("长度: "+length, 800, 30);

g.drawString("积分: "+score, 800, 55);

}

//实现键盘监听的接口方法

@Override

public void keyPressed(KeyEvent e) {

int keycode=e.getKeyCode();

//空格键暂停或者重开

if(keycode==KeyEvent.VK_SPACE){

if(isfail==true){

System.out.println(1);

init();

isfail=false;

}

else{

System.out.println(2);

isStart=!isStart;

repaint();

}

}

//上下左右

if(keycode==KeyEvent.VK_UP){

fx="U";

}else if(keycode==KeyEvent.VK_DOWN){

fx="D";

//System.out.println("down");

}else if(keycode==KeyEvent.VK_LEFT){

fx="L";

}else if(keycode==KeyEvent.VK_RIGHT){

fx="R";

}

}

@Override

public void keyReleased(KeyEvent e) {}

@Override

public void keyTyped(KeyEvent e){}

@Override

public void actionPerformed(ActionEvent e) {

if(isStart==true&&isfail==false){

//身体移动

lx=snakex[length-1];

ly=snakey[length-1];

for(int i=length-1;i>0;--i){

snakex[i]=snakex[i-1];

snakey[i]=snakey[i-1];

}

//头移动

if(fx=="U"){

snakey[0]-=25;

if(snakey[0]<75)snakey[0]=650;

}else if(fx=="D"){

snakey[0]+=25;

if(snakey[0]>650)snakey[0]=75;

}else if(fx=="L"){

snakex[0]-=25;

if(snakex[0]<25)snakex[0]=850;

}else if(fx=="R"){

snakex[0]+=25;

if(snakex[0]>850)snakex[0]=25;

}

//失败判定

for(int i=1;i

if(snakex[i]==snakex[0]&&snakey[i]==snakey[0]){

isfail=true;

}

}

//吃食物

if(snakex[0]==foodx&&snakey[0]==foody){

length++;

score+=10;

snakex[length-1]=lx;

snakey[length-1]=ly;

foodx=25+25*random.nextInt(850/25);

foody=75+25*random.nextInt(600/25);

}

repaint();

}

}

}

总结

通过此次的《贪吃蛇大作战》游戏实现,让我对swing的相关知识有了进一步的了解,对java这门语言也有了比以前更深刻的认识。

java的一些基本语法,比如数据类型、运算符、程序流程控制和数组等,理解更加透彻。java最核心的核心就是面向对象思想,对于这一个概念,终于悟到了一些。

以上就是Java+swing实现经典贪吃蛇游戏的详细内容,更多关于Java swing贪吃蛇的资料请关注我们其它相关文章!

Data.bodyicno.paintIcon(this, g, snakex[i], snakey[i]);

}

//食物的绘制

Data.foodicon.paintIcon(this, g, foodx, foody);

//暂停开始状态的绘制

if(isStart==false){

g.setFont(new Font("微软雅黑",Font.BOLD,40));

g.setColor(Color.WHITE);

g.drawString("按空格开始/暂停游戏", 275, 350);

}

//失败情况的绘制

if(isfail==true){

g.setFont(new Font("微软雅黑",Font.BOLD,40));

g.setColor(Color.red);

g.drawString("失败!按空格重新开始", 275, 350);

}

//积分的绘制

g.setColor(Color.PINK);

g.setFont(new Font("微软雅黑", Font.ITALIC, 15));

g.drawString("长度: "+length, 800, 30);

g.drawString("积分: "+score, 800, 55);

}

//实现键盘监听的接口方法

@Override

public void keyPressed(KeyEvent e) {

int keycode=e.getKeyCode();

//空格键暂停或者重开

if(keycode==KeyEvent.VK_SPACE){

if(isfail==true){

System.out.println(1);

init();

isfail=false;

}

else{

System.out.println(2);

isStart=!isStart;

repaint();

}

}

//上下左右

if(keycode==KeyEvent.VK_UP){

fx="U";

}else if(keycode==KeyEvent.VK_DOWN){

fx="D";

//System.out.println("down");

}else if(keycode==KeyEvent.VK_LEFT){

fx="L";

}else if(keycode==KeyEvent.VK_RIGHT){

fx="R";

}

}

@Override

public void keyReleased(KeyEvent e) {}

@Override

public void keyTyped(KeyEvent e){}

@Override

public void actionPerformed(ActionEvent e) {

if(isStart==true&&isfail==false){

//身体移动

lx=snakex[length-1];

ly=snakey[length-1];

for(int i=length-1;i>0;--i){

snakex[i]=snakex[i-1];

snakey[i]=snakey[i-1];

}

//头移动

if(fx=="U"){

snakey[0]-=25;

if(snakey[0]<75)snakey[0]=650;

}else if(fx=="D"){

snakey[0]+=25;

if(snakey[0]>650)snakey[0]=75;

}else if(fx=="L"){

snakex[0]-=25;

if(snakex[0]<25)snakex[0]=850;

}else if(fx=="R"){

snakex[0]+=25;

if(snakex[0]>850)snakex[0]=25;

}

//失败判定

for(int i=1;i

if(snakex[i]==snakex[0]&&snakey[i]==snakey[0]){

isfail=true;

}

}

//吃食物

if(snakex[0]==foodx&&snakey[0]==foody){

length++;

score+=10;

snakex[length-1]=lx;

snakey[length-1]=ly;

foodx=25+25*random.nextInt(850/25);

foody=75+25*random.nextInt(600/25);

}

repaint();

}

}

}

总结

通过此次的《贪吃蛇大作战》游戏实现,让我对swing的相关知识有了进一步的了解,对java这门语言也有了比以前更深刻的认识。

java的一些基本语法,比如数据类型、运算符、程序流程控制和数组等,理解更加透彻。java最核心的核心就是面向对象思想,对于这一个概念,终于悟到了一些。

以上就是Java+swing实现经典贪吃蛇游戏的详细内容,更多关于Java swing贪吃蛇的资料请关注我们其它相关文章!

if(snakex[i]==snakex[0]&&snakey[i]==snakey[0]){

isfail=true;

}

}

//吃食物

if(snakex[0]==foodx&&snakey[0]==foody){

length++;

score+=10;

snakex[length-1]=lx;

snakey[length-1]=ly;

foodx=25+25*random.nextInt(850/25);

foody=75+25*random.nextInt(600/25);

}

repaint();

}

}

}

总结

通过此次的《贪吃蛇大作战》游戏实现,让我对swing的相关知识有了进一步的了解,对java这门语言也有了比以前更深刻的认识。

java的一些基本语法,比如数据类型、运算符、程序流程控制和数组等,理解更加透彻。java最核心的核心就是面向对象思想,对于这一个概念,终于悟到了一些。

以上就是Java+swing实现经典贪吃蛇游戏的详细内容,更多关于Java swing贪吃蛇的资料请关注我们其它相关文章!


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:python3 requests.exceptions.InvalidSchema: Missing dependencies for SOCKS support
下一篇:VPS和HTTP有什么区别?
相关文章

 发表评论

暂时没有评论,来抢沙发吧~