贪吃蛇游戏的设计步骤:

Part 1:  

  设计游戏图纸

  画出900*700的白色窗口

  在窗口上添加画布

  在画布上添加标题

  在画布上添加黑色游戏区

Part 2:

  放置静态的蛇:一个头、两个身体

  加上开始提示:按空格键开始游戏

  让蛇动起来:监听Timer事件,平移数据

  实现游戏暂停

  实现转向功能

Part 3:

  添加食物

  吃掉食物

  添加死亡条件

  实现“重新开始”功能

  添加分数和长度

游戏图纸如下:

蛇及游戏框的素材如下:

                            

图片下载地址     链接:https://pan.baidu.com/s/1jH6xnXc 密码:hqze

Snake主类:

 package snake;

 import javax.swing.JFrame;
import javax.swing.JPanel; public class Snake { public static void main(String[] args) { JFrame frame = new JFrame(); // 创建一个游戏界面的框架
frame.setBounds(10, 10, 900, 720); // 设置框架的大小
frame.setResizable(false); // 设置框架大小为不能改变
// 点击关闭按钮 关闭游戏界面
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); SnakePanel panel = new SnakePanel(); //添加画布
frame.add(panel); // 刚添加时画布是空的看不到 frame.setVisible(true); // 允许显示游戏界面
} }

SnakePanel类:

 package snake;

 import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.Random; import javax.swing.ImageIcon;
import javax.swing.JPanel;
import javax.swing.Timer; public class SnakePanel extends JPanel implements KeyListener,ActionListener{ // 定义七个图片变量,代表七张图片
ImageIcon up = new ImageIcon("up.png"); // 向上的蛇头
ImageIcon down = new ImageIcon("down.png"); // 向下的蛇头
ImageIcon left = new ImageIcon("left.png"); // 向左的蛇头
ImageIcon right = new ImageIcon("right.png"); // 向右的蛇头
ImageIcon food = new ImageIcon("food.png"); // 食物
ImageIcon body = new ImageIcon("body.png"); // 蛇的身体
ImageIcon title = new ImageIcon("title.jpg"); // 游戏界面的主题 // 蛇的每一部分
int[] snakex = new int [750];
int[] snakey = new int [750]; // 随机生成食物
Random rand = new Random();
int foodx = rand.nextInt(34)*25+25; //此处的数值根据自己设计的游戏界面的大小来确定
int foody = rand.nextInt(24)*25+75; // 设置游戏的默认属性
int len = 3;
int score = 0;
String direction = "R"; // U上 D下 L左 R右 boolean isStarted = false; // 判断游戏是否开始
boolean isFailed = false; // 判断游戏是否结束 Timer timer = new Timer(100,this); // 每100毫秒调用一次ActionPerformed public SnakePanel() { // 建造画布的构造函数
this.setFocusable(true); // 获取焦点
this.addKeyListener(this); // 监听键盘事件
setup();
timer.start();
} public void paint(Graphics g) { // Graphics 画笔 this.setBackground(Color.BLACK); // 设置画布背景颜色
title.paintIcon(this, g, 25, 11);// 放置主题图片
g.fillRect(25, 75, 850, 650); // 用画笔设置游戏方框 // 画蛇头(注意判断蛇头的方向)
if (direction.equals("R"))
right.paintIcon(this, g, snakex[0], snakey[0]);
else if (direction.equals("L"))
left.paintIcon(this, g, snakex[0], snakey[0]);
else if (direction.equals("U"))
up.paintIcon(this, g, snakex[0], snakey[0]);
else if (direction.equals("D"))
down.paintIcon(this, g, snakex[0], snakey[0]); // 画蛇的身体
for(int i = 1; i < len; i ++)
body.paintIcon(this, g, snakex[i], snakey[i]); // 判断如果游戏没开始显示。。。
if (!isStarted){
g.setColor(Color.WHITE);
g.setFont(new Font("arial",Font.BOLD, 30));
g.drawString("Press Space to start / pause", 200, 300);
} // 判断如果游戏结束显示。。。
if (isFailed){
g.setColor(Color.WHITE);
g.setFont(new Font("arial",Font.BOLD, 30));
g.drawString("Game Over ! Press space to restart", 200, 300);
} // 显示食物
food.paintIcon(this, g, foodx, foody); // 设置分数和蛇的长度
g.setColor(Color.WHITE);
g.setFont(new Font("arial",Font.PLAIN,15));
g.drawString("Score : "+score, 650, 37);
g.drawString("Len :"+len, 650, 57);
} public void setup() { // 游戏初始化
isStarted = false;
isFailed = false;
len = 3;
score = 0;
snakex[0] = 100; snakex[1] = 75; snakex[2] = 50;
snakey[0] = 100; snakey[1] = 100; snakey[2] = 100;
} @Override
public void keyPressed(KeyEvent e) { //实现键盘响应
int KeyCode = e.getKeyCode();
if (KeyCode == KeyEvent.VK_SPACE){ // 敲击空格现实/消除提示信息
if (isFailed){
// isStarted = false; // 可以将这两行放入setup中
// isFailed = false;
setup();
}else
isStarted = !isStarted;
} else if (KeyCode == KeyEvent.VK_UP && direction != "D")
direction = "U";
else if (KeyCode == KeyEvent.VK_DOWN && direction != "U" )
direction = "D";
else if (KeyCode == KeyEvent.VK_RIGHT && direction != "L")
direction = "R";
else if (KeyCode == KeyEvent.VK_LEFT && direction != "R")
direction = "L";
} @Override
public void actionPerformed(ActionEvent e) {
// 1. 再定义一个闹钟
timer.start(); // 2. 移动数据
if (isStarted && !isFailed){
// 移动身体
for (int i = len; i>0; i--){
snakex[i] = snakex[i-1];
snakey[i] = snakey[i-1];
}
// 移动头
if (direction.equals("R")){
snakex[0] = snakex[0] + 25;
if(snakex[0] > 850) snakex[0] = 25;
}else if (direction.equals("L")){
snakex[0] = snakex[0] - 25;
if(snakex[0] < 25) snakex[0] = 850;
}else if (direction.equals("U")){
snakey[0] = snakey[0] - 25;
if (snakey[0] < 75) snakey[0] = 650;
}else if (direction.equals("D")){
snakey[0] = snakey[0] + 25;
if (snakey[0] > 650) snakey[0] = 75;
} if (snakex[0] == foodx && snakey[0] == foody){ // 吃食物
len ++;
score ++;
foodx = rand.nextInt(34)*25+25;
foody = rand.nextInt(24)*25+75;
} for (int i = 1; i < len; i ++){ // 如果蛇头碰到自己的身体游戏结束
if (snakex[0] == snakex[i] && snakey[0] == snakey[i]){
isFailed = true;
}
} }
// 3. repaint()
repaint();
} @Override
public void keyTyped(KeyEvent e) { } @Override
public void keyReleased(KeyEvent e) { }
}

游戏效果如下:

用Java开发贪吃蛇游戏的更多相关文章

  1. 使用Love2D引擎开发贪吃蛇游戏

    今天来介绍博主近期捣腾的一个小游戏[贪吃蛇],贪吃蛇这个游戏相信大家都不会感到陌生吧.今天博主将通过Love2D这款游戏引擎来为大家实现一个简单的贪吃蛇游戏,在本篇文章其中我们将会涉及到贪吃蛇的基本算 ...

  2. Java实现贪吃蛇游戏(含账号注册登录,排行榜功能)

    这是我第一次工程实践的作业,选题很多,但我只对其中的游戏开发感兴趣,可游戏就两三个类型,最终还是选择了贪吃蛇.其实就贪吃蛇本身的代码实现还算是比较简单的,可是实践要求代码行达到一定数量,所以我就额外给 ...

  3. java实现贪吃蛇游戏

    最简单的4个java类就可以实现贪吃蛇: main函数: package tcs; public class GreedSnake { public static void main(String[] ...

  4. Java实现贪吃蛇游戏【代码】

    花了两个下午写了一个贪吃蛇小游戏,本人想写这游戏很长时间了.作为以前诺基亚手机上的经典游戏,贪吃蛇和俄罗斯方块一样,都曾经在我们的童年给我们带来了很多乐趣.世间万物斗转星移,诺基亚曾经作为手机业的龙头 ...

  5. Android快乐贪吃蛇游戏实战项目开发教程-01项目概述与目录

    一.项目简介 贪吃蛇是一个很经典的游戏,也很适合用来学习.本教程将和大家一起做一个Android版的贪吃蛇游戏. 我已经将做好的案例上传到了应用宝,无病毒.无广告,大家可以放心下载下来把玩一下.应用宝 ...

  6. Java贪吃蛇游戏

    package snake.game; import java.awt.CardLayout; import java.awt.Color; import java.awt.Graphics;   i ...

  7. 使用Java的GUI技术实现 “ 贪吃蛇 ” 游戏

    详细教程: 使用Java的GUI技术实现 " 贪吃蛇 " 游戏_IT打工酱的博客-CSDN博客

  8. Linux平台下贪吃蛇游戏的运行

    1.参考资料说明: 这是一个在Linux系统下实现的简单的贪吃蛇游戏,同学找帮忙,我就直接在Red Hat中调试了一下,参考的是百度文库中"maosuhan"仁兄的文章,结合自己的 ...

  9. H5实现的可自定义贪吃蛇游戏

    原创游戏,使用lufylegend.js开发 用canvas实现的贪吃蛇游戏,与一般的贪吃蛇游戏不同,图片经过美工设计,代码设计支持扩展和自定义. 游戏元素丰富,包括障碍物(仙人掌),金币(奖励),苹 ...

随机推荐

  1. 网络基础 05_DHCP

    1 DHCP概述 DHCP (Dynamic Host Configuration Protocol)是一种动态的向Internet终端提供配置参数的协议.在终端提出申请之后,DHCP可以向终端提供I ...

  2. scp 一次拷贝多个文件

    用正则表达式去匹配即可, scp  *.tar  root@11.11.11.12:/root/ 拷贝当前目录下的所有tar类型的文件到服务器上

  3. MySQL error2003错误原因以及解决方案

    转自:http://hi.baidu.com/tianxia339/item/8e8849111461ea7e7a5f2540 出现ERROR 2003 (HY000): Can't connect ...

  4. ACCESS 手工注入

    ACCESS的注入,基本是死的.思路很简单,基本都可以工具解决.上代码: 1.判断有无注入点' and 1=1 and 1=22.猜表一般的表的名称无非是admin adminuser user pa ...

  5. 【Qt开发】StyleSheet使用总结

    概述 转眼七年过去了,我是一个彻底拥抱过MFC的人,记得老大的一个需求要把按钮做成圆角,并添加背景颜色,做前端html的可能认为很简单,然而放到MFC上那可真的是很...很麻烦的,自定义类继承Butt ...

  6. mysql 索引使用策略及优化

    索引使用策略及优化 MySQL的优化主要分为结构优化(Scheme optimization)和查询优化(Query optimization).本章讨论的高性能索引策略主要属于结构优化范畴.本章的内 ...

  7. ASP.NET Core 中的依赖注入

    目录 什么是依赖注入 ASP .NET Core 中使用依赖注入 注册 使用 释放 替换为其它的 Ioc 容器 参考 什么是依赖注入 软件设计原则中有一个依赖倒置原则(DIP),为了更好的解耦,讲究要 ...

  8. uvm_config_db在UVM验证环境中的应用

    如何在有效的使用uvm_config_db来搭建uvm验证环境对于许多验证团队来说仍然是一个挑战.一些验证团队完全避免使用它,这样就不能够有效利用它带来的好处:另一些验证团队却过多的使用它,这让验证环 ...

  9. Java将Excel的列数以字母表示的字符串转换成数字表示

    我们知道,在 Excel 中,行数用数字表示,而列数是用字母表示的(如下图所示),有时候需要把它转换成数字来使用,或者把数字转换成字母.(例如使用POI操作Excel) 下面是转换代码,用来进行字母和 ...

  10. ASP.NET MVC Core Starter Kit

    上一篇博文<创建.NET Core程序的Nuget Package>提到准备创建一个Nuget包,用于自动生成一个简单的ASP.NET MVC Core的示例项目.本来是打算用Nuget实 ...