Java贪吃蛇全代码

Java贪吃蛇全代码用Java编写精典小游戏——贪吃蛇!前言  我想贪吃蛇应该是不少90后和00后的童年(我本人是01年的),回想起从前偷偷拿着我爹的诺基亚在被窝里玩贪吃蛇,不禁感慨万分,时间飞逝,没想到10年后的我也可以自己做一个贪吃蛇了。    该程序主要实现了以下功能:  1.按空格开始游戏、暂停游戏或重新开始游戏。  2.方向键控制蛇移动的方向。  3.蛇吃掉食物可以增长,并增加游戏分数(不会加快游戏速度)。  4.蛇咬到自己会结束游戏。  5.蛇撞到游戏区域外会结束游戏。    接下来放

大家好,又见面了,我是你们的朋友全栈君。

用Java编写精典小游戏——贪吃蛇!

前言

  我想贪吃蛇应该是不少90后和00后的童年(我本人是01年的),回想起从前偷偷拿着我爹的诺基亚在被窝里玩贪吃蛇,不禁感慨万分,时间飞逝,没想到10年后的我也可以自己做一个贪吃蛇了。
  
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
  
该程序主要实现了以下功能:
  1.按空格开始游戏、暂停游戏或重新开始游戏。
  2.方向键控制蛇移动的方向。
  3.蛇吃掉食物可以增长,并增加游戏分数(不会加快游戏速度)。
  4.蛇咬到自己会结束游戏。
  5.蛇撞到游戏区域外会结束游戏。
  
  接下来放出源码,为了让初学者也能够理解,我尽量将大部分代码写了注释:
  

测试类

public class Test { 
   
    public static void main(String[] args) { 
   
        Snake snake = new Snake();
        snake.myJFrame();
    }
}

  

Snake类

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.util.Random;
public class Snake extends JFrame implements KeyListener, ActionListener, MouseListener { 

int slong = 2;//蛇当前长度
//蛇坐标
int[] Snakex = new int[100];
int[] Snakey = new int[100];
int fx = 1;//蛇的方向 0-左 1-右 2-上 3-下
Timer timer = new Timer(100, this);//设置定时器,每100毫秒一次
//食物位置
int foodx;
int foody;
Random random = new Random();//随机数,随机位置生成食物
int started = 0;//游戏信息 0-未开始 1-开始 2-结束
//---------------------------------------------------------------------------------------------------------------------
//窗体
public void myJFrame() { 

this.setTitle("贪吃蛇"); //标题
this.setSize(800, 600); //窗口大小
this.setResizable(false); //窗口是否可以改变大小=否
this.setDefaultCloseOperation(Snake.EXIT_ON_CLOSE); //窗口关闭方式为关闭窗口同时结束程序
int width = Toolkit.getDefaultToolkit().getScreenSize().width; //获取屏幕宽度
int height = Toolkit.getDefaultToolkit().getScreenSize().height; //获取屏幕高度
// System.out.println("宽度:"+width);//测试
// System.out.println("高度:"+height);//测试
this.setLocation((width - 800) / 2, (height - 600) / 2); //设置窗口默认位置以屏幕居中
this.setFocusable(true);
this.addKeyListener(this);
this.setVisible(true); //窗口是否显示=是
// 蛇的初识位置
Snakex[0] = 60;
Snakey[0] = 100;
Snakex[1] = 40;
Snakey[1] = 100;
// 随机食物的初识位置
foodx = random.nextInt(39);
foody = random.nextInt(22);
foodx = foodx * 20;
foody = foody * 20 + 80;
System.out.println(foodx + "," + foody);
}
//---------------------------------------------------------------------------------------------------------------------
//覆写paint方法,绘制界面
public void paint(Graphics g) { 

// 绘制背景
g.setColor(Color.LIGHT_GRAY);
g.fillRect(0, 0, 800, 600);
//绘制游戏区域
g.setColor(Color.black);
g.fillRect(0, 80, 800, 520);
//绘制蛇
for (int i = 0; i < slong; i++) { 

g.setColor(Color.CYAN);
g.fillRect(Snakex[i], Snakey[i], 20, 20);
}
// 绘制食物
g.setColor(Color.yellow);
g.fillOval(foodx, foody, 20, 20);
if (started == 0) { 

g.setColor(Color.BLACK);//设置画笔颜色
g.setFont(new Font("微软雅黑", 10, 20)); //设置字体
g.drawString("按下“空格键”开始游戏", 300, 65); //绘制字符
} else if (started == 1) { 

g.setColor(Color.BLACK);//设置画笔颜色
g.setFont(new Font("微软雅黑", 10, 20)); //设置字体
g.drawString("当前分数为:", 300, 65); //绘制字符
g.drawString(String.valueOf(slong - 2), 420, 65); //绘制字符
} else if (started == 2) { 

g.setColor(Color.BLACK);//设置画笔颜色
g.setFont(new Font("微软雅黑", 10, 20)); //设置字体
g.drawString("游戏结束-", 250, 65); //绘制字符
g.drawString("最终分数为:", 350, 65); //绘制字符
g.drawString(String.valueOf(slong - 2), 470, 65); //绘制字符
}
}
// 操作监听——控制蛇的不断移动
@Override
public void actionPerformed(ActionEvent e) { 

// 判断游戏是否开始
if (started == 1) { 

// 通过循环控制蛇移动
for (int i = slong - 1; i > 0; i--) { 

Snakex[i] = Snakex[i - 1];
Snakey[i] = Snakey[i - 1];
}
// 判断蛇移动的方向
if (fx == 0) { 

Snakex[0] = Snakex[0] - 20;
} else if (fx == 1) { 

Snakex[0] = Snakex[0] + 20;
} else if (fx == 2) { 

Snakey[0] = Snakey[0] - 20;
} else if (fx == 3) { 

Snakey[0] = Snakey[0] + 20;
}
// 判断蛇是否撞到墙外
if (Snakex[0] < 0 || Snakex[0] > 780 || Snakey[0] < 80 || Snakey[0] > 580) { 

started = 2;
}
// 判断蛇是否吃到了食物
if (Snakex[0] == foodx && Snakey[0] == foody) { 

slong++;
foodx = random.nextInt(39);
foody = random.nextInt(22);
foodx = foodx * 20;
foody = foody * 20 + 80;
System.out.println(foodx + "," + foody);
}
// 判断是否吃到了自己
for (int i = 1; i < slong; i++) { 

if (Snakex[0] == Snakex[i] && Snakey[0] == Snakey[i]) { 

started = 2;
}
}
// 判断食物是否随机在了蛇身上
for (int i = 0; i < slong; i++) { 

if (foodx == Snakex[i] && foody == Snakey[i]) { 

// 随机食物的初识位置
foodx = random.nextInt(39);
foody = random.nextInt(22);
foodx = foodx * 20;
foody = foody * 20 + 80;
System.out.println(foodx + "," + foody);
}
}
repaint();
}
timer.start();
}
// 输入
@Override
public void keyTyped(KeyEvent e) { 

}
// 键盘按下——控制游戏的开始以及蛇的移动方向
@Override
public void keyPressed(KeyEvent e) { 

// 获取从键盘输入的键
int key = e.getKeyCode();
// 判断是否为空格
if (key == KeyEvent.VK_SPACE) { 

if (started == 0) { 

started = 1;
} else if (started == 1) { 

started = 0;
} else if (started == 2) { 

started = 0;
slong = 2;//蛇当前长度
// 蛇的初识位置
Snakex[0] = 60;
Snakey[0] = 100;
Snakex[1] = 40;
Snakey[1] = 100;
// 随机食物的初识位置
foodx = random.nextInt(39);
foody = random.nextInt(22);
foodx = foodx * 20;
foody = foody * 20 + 80;
// 初始化方向
fx = 1;
}
repaint();
timer.start();
// 左
} else if (key == KeyEvent.VK_LEFT) { 

if (fx != 1) { 

fx = 0;
}
// 右
} else if (key == KeyEvent.VK_RIGHT) { 

if (fx != 0) { 

fx = 1;
}
// 上
} else if (key == KeyEvent.VK_UP) { 

if (fx != 3) { 

fx = 2;
}
//下
} else if (key == KeyEvent.VK_DOWN) { 

if (fx != 2) { 

fx = 3;
}
}
}
// 弹起
@Override
public void keyReleased(KeyEvent e) { 

}
// 点击
@Override
public void mouseClicked(MouseEvent e) { 

}
// 按下
@Override
public void mousePressed(MouseEvent e) { 

}
// 抬起
@Override
public void mouseReleased(MouseEvent e) { 

}
// 进入
@Override
public void mouseEntered(MouseEvent e) { 

}
// 离开
@Override
public void mouseExited(MouseEvent e) { 

}
}

  

结束语

  
  测试的次数不多,不知道还有多少隐藏BUG,但我平常玩的时候是没有问题的,如果你在玩的时候发现了BUG欢迎来私聊我,如果能带着解决方法来的话那就更好了。
  
  我一直坚持“分享知识”的原则,免费透明的将代码公开展示,如果帮到了你,请顺手点个赞吧(#^.^#)。
  

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/148854.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • 浏览器“二战”:Smart vs Turbo

    浏览器“二战”:Smart vs Turbo

  • tl494cn逆变器电路图_用TL494制作的逆变电源[通俗易懂]

    tl494cn逆变器电路图_用TL494制作的逆变电源[通俗易懂]TL494集成块广泛应用在开关电源,其内部集成有PWM、三角波发生器、电池欠压检测,+5V电压基准等电路,具有外接元件少,控制稳定的特点。笔者在网上查阅大量资料,自制了一款准正弦波300W逆变器,采用直流12V电瓶供电,可供小功率单相电机、日光灯等电感性负载用电,电路如附图所示。该逆变板工作频率由TL494⑤、⑥脚外接阻容元件确定,本例为2.2kHz左右。该频率的大小直接影响功率场效应管的功率损耗…

  • 我给鸿星尔克写了一个720°看鞋展厅

    我给鸿星尔克写了一个720°看鞋展厅最近因为鸿星尔克给河南捐了5000万物资,真的是看哭了很多的网友,普通一家公司捐款5000万可能不会有这样的共情,但是看了鸿星尔克的背景之后,发现真的是令人心酸。鸿星尔克2020年的营收是28亿,但是利润却是亏损2个亿,甚至连微博的官方账号都舍不得开会员,在这种情况下,还豪气地捐赠5000万,真的是破防了。网友还称鸿星尔克,特别像是老一辈人省吃俭用一分一毛攒起来的存款,小心翼翼存在铁盒里。一听说祖国需要,立马拿出铁盒子,哗~全导给你。让上最贵的鞋,拿出了双249的。然后我去鸿星尔克的官网看了看他.

  • poj 3074 Sudoku(Dancing Links)

    poj 3074 Sudoku(Dancing Links)

  • 计算机信息计量单位中的1k代表多少字节,1k等于多少字节

    计算机信息计量单位中的1k代表多少字节,1k等于多少字节一、1K字节等于多少字节1KB=1024B,其中1024=2的10次方。字节(Byte/bait/n.)是计算机信息技术用于计量存储容量的一种计量单位,通常情况下一字节等于八位,也表示一些计算机编程语言中的数据类型和语言字符。国际单位制(SI)1KB=1024B;1MB=1024KB=1024*1024B。1B(byte,字节)=8bit;1KB(Kilobyte,千字节)=1000B…

  • java修饰符

    java修饰符

    2021年11月12日

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号