贪吃蛇游戏的设计步骤:

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. 集合之五:Set接口(答案)

    package com.shsxt.homework; import java.util.ArrayList; import java.util.Collection; import java.uti ...

  2. 2019.4.25 表格表单与HTML5 && CSS3

    目录 表格 标签 属性 表格间距离 表格的内边距 表格的边框 样式 边框合并 行合并 列合并 display 表单 标签 属性 提交的网址 请求方式 input相关 扩大响应范围 字符 密码 单选框 ...

  3. This operation is not available unless admin mode is enabled: FLUSHDB

    报错:  This operation is not available unless admin mode is enabled: FLUSHDB 参考内容: https://www.cnblogs ...

  4. 《Effective C++(第三版)》 的55条建议

    1. 让自己习惯C++(Accustoming yourself to C++) 条款01: 视C++ 为一个语言联邦(View C++ as a federation of languages) 条 ...

  5. 快速创建SpringBoot+SSM解析

    此处使用IDEA快速搭建SpringBoot应用,首先用SpringBoot搭建WEB工程: 然后点击Next生成项目,首次生成可能有点慢,下次创建的时候就会快很多,生成后的目录结构如下: 我们更改下 ...

  6. JS实现瀑布流

    HTML:先让图片充满一页 <!DOCTYPE html> <html> <head lang="en"> <meta charset=& ...

  7. Git提交项目到GitHub

    一.GitHub新建项目 1.进入Github首页,点击New repository新建一个项目 2.填写相应信息后点击create即可 Repository name: 仓库名称 Descripti ...

  8. 如何自己编译生成hadoop的eclipse插件,如hadoop-eclipse-plugin-2.6.0.jar

    不多说,直接上干货! 如何自己编译生成Eclipse插件,如hadoop-eclipse-plugin-2.6.0.jar 一.相关软件的安装和配置 (一)JDK的安装和配置 Jdk 1.7*安装并配 ...

  9. mongodb-脏数据问题

    采用多线程后, 发现最大的问题是redis和mongodb的脏数据问题 1, upsert 的脏数据问题 多线程对同一个collect进行upsert操作时, 会引发并发脏数据问题, 最开始的解决方案 ...

  10. 令狐冲和TCP/IP协议的第三层协议的关系(经典)

    今天突然想起来去看了看我以前在csdn的博客,发现一篇以前一直被奉为经典的文章,哈哈,再转过来和大家看看:              令狐冲十四岁那年进入华山,那年岳琳珊八岁,岳不群白天给两人指点剑法 ...