贪吃蛇游戏的设计步骤:

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. 并发编程>>并发级别(二)

    理解并发 这是我在开发者头条看到的.@编程原理林振华 有目标的提升自己会事半功倍,前行的道路并不孤独. 1.阻塞 当一个线程进入临界区(公共资源区)后,其他线程必须在临界区外等待,待进去的线程执行完成 ...

  2. SpringMVC初写(五)拦截器

    在系统开发过程中,拦截器的使用可以使我们实现一些需求.如:登录认证,权限管理等,拦截器的工作核心就是将一些工作流程进行统一处理 拦截器和过滤器的区别: 过滤器过滤的是请求路径,拦截器拦截的各层方法的映 ...

  3. net与树莓派的情缘-安装Redis(四)

    在Linux下安装Redis非常简单,具体步骤如下(官网有说明): .下载源码,解压缩后编译源码. $ wget http://download.redis.io/releases/redis-3.0 ...

  4. 解决Ubuntu系统的每次开机重启后,resolv.conf清空的问题和DNS域名解析问题(图文详解)

    不多说,直接上干货! 问题情况描述如下: 普及知识:   /etc/resolv.conf ,其实是一个Link .它其实指向的是 /run/resolvconf/resolv.conf.  Ubun ...

  5. nginx设置开机自启动

    每次启动nginx服务都需要到安装目录下的/sbin下面,感觉挺麻烦的. 下面介绍一下如何在Linux(CentOS)系统上,设置nginx开机自启动. 1 用脚本管理nginx服务 第一步:在/et ...

  6. 【Qt开发】常用控件--QLineEdit

    QLineEdit是单行文本编辑控件.比如用户名,密码等输入框可以使用该控件. 所属头文件<QLineEdit> 常用方法 1.void setText(const QString &am ...

  7. Modular Rails: The complete Guide to Modular Rails Applications 笔记

    fix SamuraiCRM/engines/core/test/dummy/config/routes 修改如下 Rails.application.routes.draw do mount Sam ...

  8. Flume初始

    一.Flume是什么 Flume是一个数据,日志收集的一个组件,可以用于对程序,nginx等日志的收集,而且非常简单,省时的做完收集的工作.Flume是一个分布式.可靠.和高可用的海量日志采集聚合和传 ...

  9. C语言20150620

    1-->printf()输出的时候前面没有0 是十进制,前面带0是八进制,前面有0x是十六进制 printf("%d",100):十进制解析 printf("%d& ...

  10. Java如何操作对象(bean)进行动态排序?

    原文出自:https://blog.csdn.net/seesun2012 简介如题:Java如何操作对象(bean)进行动态排序?Java实体类(bean)动态排序? 原理:利用反射根据指定的属性值 ...