本文实例讲述了Java GUI编程之贪吃蛇游戏简单实现方法。分享给大家供大家参考,具体如下:

例子简单,界面简陋 请见谅
项目结构如下
Constant.jvava 代码如下:
package snake;
/**
*
* @author hjn
*
*/
public class Constant {
/**
* 蛇方移动方向:左边
*/
public static final int LEFT = 0;
/**
* 蛇方移动方向:右边
*/
public static final int RIGHT = 1;
/**
* 蛇方移动方向:上边
*/
public static final int UP = 3;
/**
* 蛇方移动方向:下边
*/
public static final int DOWN = 4;
/**
* 界面列数
*/
public static final int COLS = 30;
/**
* 界面行数
*/
public static final int ROWS = 30;
/**
* 每个格子边长
*/
public static final int BODER_SIZE = 15;
}
Node.java代码如下:
package snake;
/**
* 格子
*
* @author hjn
*
*/
public class Node {
/**
* 所在行数
*/
private int row;
/**
* 所在列数
*/
private int col;
public Node() {
};
public Node(int row, int col) {
this.row = row;
this.col = col;
};
/**
* 蛇将要移动一格时头部格子将所到格子
*
* @param dir
* 蛇前进方向
* @param node
* 蛇头所在的格子
*/
public Node(int dir, Node node) {
if (dir == Constant.LEFT) {
this.col = node.getCol() - 1;
this.row = node.getRow();
} else if (dir == Constant.RIGHT) {
this.col = node.getCol() + 1;
this.row = node.getRow();
} else if (dir == Constant.UP) {
this.row = node.getRow() - 1;
this.col = node.getCol();
} else {
this.row = node.getRow() + 1;
this.col = node.getCol();
}
}
/**
* 重写equals方法
*/
public boolean equals(Object obj) {
if (obj instanceof Node) {
Node node = (Node) obj;
if (this.col == node.col && this.row == node.row) {
return true;
} else {
return false;
}
} else {
return false;
}
}
public int getRow() {
return row;
}
public void setRow(int row) {
this.row = row;
}
public int getCol() {
return col;
}
public void setCol(int col) {
this.col = col;
}
public String toString() {
return "col:" + this.col + " row:" + this.row;
}
}
Egg.java代码如下:
package snake;
import java.awt.Color;
import java.awt.Graphics;
import java.util.Random;
/**
* 蛋,蛇的食物
*
* @author Nan
*
*/
public class Egg extends Node {
/**
* 蛋的颜色
*/
Color color;
/**
* 随机函数
*/
public static Random random = new Random();
/**
* 构造函数 蛋出现在固定位置
*
* @param row
* 所在第几行数
* @param col
* 所在第几列数
*/
public Egg(int row, int col) {
super(row, col);
this.color = Color.green;
}
/**
* 构造函数 蛋随机出现
*
*/
public Egg() {
super();
int col = random.nextInt(Constant.COLS - 4) + 2;
int row = random.nextInt(Constant.ROWS - 4) + 2;
this.setCol(col);
this.setRow(row);
}
/**
* 画蛋
* @param g 画笔
*/
void draw(Graphics g) {
if (this.color == Color.green) {
this.color = Color.red;
} else {
this.color = Color.green;
}
g.setColor(this.color);
int boderSize = Constant.BODER_SIZE;
g.fillOval(this.getCol() * boderSize, this.getRow() * boderSize,
boderSize, boderSize);
}
public Color getColor() {
return color;
}
public void setColor(Color color) {
this.color = color;
}
}
Snake.java代码如下:
package snake;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.KeyEvent;
import java.util.ArrayList;
import java.util.List;
/**
* 蛇
*
* @author hjn
*
*/
public class Snake {
/**
* 前进的方向
*/
int dir;
/**
* 蛇的身体,由一个格子Node集合组成
*/
List<Node> nodeList = new ArrayList<Node>();
/**
* 是否越界
*/
boolean isOverstep = false;
/**
* 构造方法默认开始方向向左 ,蛇身有3个格子 ,位置在20行,15列
*/
public Snake() {
this.dir = Constant.LEFT;
for (int i = 0; i < 3; i++) {
Node node = new Node(20, 15 + i);
this.nodeList.add(node);
}
}
/**
* 蛇前进
*/
void forward() {
addNode();
nodeList.remove(nodeList.size() - 1);
}
/**
* 蛇前进的时候头部增加格子,私有方法
*/
private void addNode() {
Node node = nodeList.get(0);
node = new Node(dir, node);
nodeList.add(0, node);
}
/**
* 是否吃到蛋,蛇身是否有格子跟蛋重叠,所以重写了Node的equals方法
*
* @param egg蛋
* @return boolean
*/
boolean eatEgg(Egg egg) {
if (nodeList.contains(egg)) {
addNode();
return true;
} else {
return false;
}
}
/**
* 画自己
*
* @param g画笔
*/
void draw(Graphics g) {
g.setColor(Color.black);
for (int i = 0; i < this.nodeList.size(); i++) {
Node node = this.nodeList.get(i);
if (node.getCol() > (Constant.COLS - 2) || node.getCol() < 2
|| node.getRow() > (Constant.ROWS - 2) || node.getRow() < 2) {
this.isOverstep = true;
}
g.fillRect(node.getCol() * Constant.BODER_SIZE, node.getRow()
* Constant.BODER_SIZE, Constant.BODER_SIZE,
Constant.BODER_SIZE);
}
forward();
}
/**
* 键盘事件,来确定前进方向,有左右上下4个方向
*
* @param e键盘监听事件
*/
void keyPress(KeyEvent e) {
int key = e.getKeyCode();
switch (key) {
case KeyEvent.VK_LEFT:
if (this.dir != Constant.LEFT)
this.dir = Constant.LEFT;
break;
case KeyEvent.VK_RIGHT:
if (this.dir != Constant.RIGHT)
this.dir = Constant.RIGHT;
break;
case KeyEvent.VK_UP:
if (this.dir != Constant.UP)
this.dir = Constant.UP;
break;
case KeyEvent.VK_DOWN:
if (this.dir != Constant.DOWN)
this.dir = Constant.DOWN;
break;
default:
break;
}
}
public int getDir() {
return dir;
}
public void setDir(int dir) {
this.dir = dir;
}
public List<Node> getNodeList() {
return nodeList;
}
public void setNodeList(List<Node> nodeList) {
this.nodeList = nodeList;
}
public boolean isOverstep() {
return isOverstep;
}
public void setOverstep(boolean isOverstep) {
this.isOverstep = isOverstep;
}
}
主界面MainFrame.java代码如下:
package snake;
import java.awt.Color;
import java.awt.Font;
import java.awt.Frame;
import java.awt.Graphics;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
/**
* 贪吃蛇展示页面
*
* @author hjn
*
*/
public class MainFrame extends Frame {
/**
* 版本
*/
private static final long serialVersionUID = -5227266702753583633L;
/**
* 背景颜色
*/
Color color = Color.gray;
/**
* 蛋
*/
static Egg egg = new Egg();
/**
* 蛇
*/
Snake snake = new Snake();
/**
* 游戏是否失败
*/
boolean gameOver = false;
/**
* 给画笔起一个线程
*/
PaintThread paintThread = new PaintThread();
/**
* 构造方法
*/
public MainFrame() {
init();
}
/**
* 界面初始化
*/
void init() {
this.setBounds(200, 200, Constant.COLS * Constant.BODER_SIZE,
Constant.ROWS * Constant.BODER_SIZE);
this.setResizable(true);
this.repaint();
/**
* 窗口关闭监听事件
*/
this.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
/**
* 添加键盘监听事件
*/
this.addKeyListener(new KeyMomiter());
/**
* 画笔线程启动
*/
new Thread(paintThread).start();
}
/**
* 画笔画界面
*/
public void paint(Graphics g) {
Color c = g.getColor();
g.setColor(Color.GRAY);
g.fillRect(0, 0, Constant.COLS * Constant.BODER_SIZE, Constant.ROWS
* Constant.BODER_SIZE);
g.setColor(Color.DARK_GRAY);
for (int i = 0; i < Constant.ROWS; i++) {
g.drawLine(0, i * Constant.BODER_SIZE, Constant.COLS
* Constant.BODER_SIZE, i * Constant.BODER_SIZE);
}
for (int i = 0; i < Constant.COLS; i++) {
g.drawLine(i * Constant.BODER_SIZE, 0, i * Constant.BODER_SIZE,
Constant.ROWS * Constant.BODER_SIZE);
}
g.setColor(Color.yellow);
g.setFont(new Font("宋体", Font.BOLD, 20));
g.drawString("score:" + getScore(), 10, 60);
if (gameOver) {
g.setColor(Color.red);
g.drawString("GAME OVER", 100, 60);
this.paintThread.pause = true;
}
g.setColor(c);
if (snake.eatEgg(egg)) {
egg = new Egg();
}
snake.draw(g);
egg.draw(g);
}
/**
* 获取分数
*
* @return int 分数
*/
int getScore() {
return snake.getNodeList().size();
}
/**
* 画笔的线程
*
* @author hjn
*/
class PaintThread implements Runnable {
private boolean isRun = true;
private boolean pause = false;
@Override
public void run() {
while (isRun) {
if (pause) {
continue;
} else {
if (snake.isOverstep == true) {
gameOver = true;
}
repaint();
}
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
/**
* 暂停
*/
public void pause() {
this.pause = true;
}
/**
* 重新开始
*/
public void restart() {
this.pause = true;
snake = new Snake();
}
/**
* 游戏结束
*/
public void gameOver() {
isRun = false;
}
}
/**
* 停止
*/
void stop() {
gameOver = true;
}
/**
* 键盘监听器
*
* @author hjn
*
*/
class KeyMomiter extends KeyAdapter {
@Override
public void keyPressed(KeyEvent e) {
super.keyPressed(e);
int key = e.getKeyCode();
if (key == KeyEvent.VK_F2) {
paintThread.restart();
} else {
snake.keyPress(e);
}
}
}
/**
* 启动程序入口
*
* @param args
*/
@SuppressWarnings("deprecation")
public static void main(String[] args) {
MainFrame mainFrame = new MainFrame();
mainFrame.show();
}
}
运行效果:
附:完整实例代码点击此处本站下载。
更多关于java算法相关内容感兴趣的读者可查看本站专题:《Java数据结构与算法教程》、《Java字符与字符串操作技巧总结》、《Java操作DOM节点技巧总结》、《Java文件与目录操作技巧汇总》和《Java缓存操作技巧汇总》
希望本文所述对大家java程序设计有所帮助。
# Java
# GUI编程
# 贪吃蛇
# 游戏
# java编写贪吃蛇小游戏
# java贪吃蛇游戏编写代码
# Java贪吃蛇游戏完善版
# java实现贪吃蛇游戏代码(附完整源码)
# Java实现贪吃蛇游戏(1小时学会)
# Java swing框架实现的贪吃蛇游戏完整示例
# java贪吃蛇游戏实现代码
# java实现贪吃蛇极速版
# java编写简易贪吃蛇游戏
# Java+JFrame实现贪吃蛇小游戏
# 行数
# 操作技巧
# 前进方向
# 相关内容
# 出现在
# 感兴趣
# 数据结构
# 给大家
# 写了
# 点击此处
# 重写
# 更多关于
# 吃到
# 所述
# 程序设计
# 宋体
# 所到
# 讲述了
# Color
相关文章:
高防服务器租用如何选择配置与防御等级?
宝塔建站教程:一键部署配置流程与SEO优化实战指南
外贸公司网站制作,外贸网站建设一般有哪些步骤?
合肥制作网站的公司有哪些,合肥聚美网络科技有限公司介绍?
公司网站建设制作费用,想建设一个属于自己的企业网站,该如何去做?
广东企业建站网站优化与SEO营销核心策略指南
建站一年半SEO优化实战指南:核心词挖掘与长尾流量提升策略
淘宝制作网站有哪些,淘宝网官网主页?
全景视频制作网站有哪些,全景图怎么做成网页?
详解免费开源的DotNet二维码操作组件ThoughtWorks.QRCode(.NET组件介绍之四)
如何用PHP快速搭建CMS系统?
建站之星安装提示数据库无法连接如何解决?
如何生成腾讯云建站专用兑换码?
如何通过wdcp面板快速创建网站?
交易网站制作流程,我想开通一个网站,注册一个交易网址,需要那些手续?
个人摄影网站制作流程,摄影爱好者都去什么网站?
公众号网站制作网页,微信公众号怎么制作?
h5网站制作工具有哪些,h5页面制作工具有哪些?
如何确保FTP站点访问权限与数据传输安全?
洛阳网站制作公司有哪些,洛阳的招聘网站都有哪些?
如何在IIS7上新建站点并设置安全权限?
建站org新手必看:2024最新搭建流程与模板选择技巧
阿里云高弹*务器配置方案|支持分布式架构与多节点部署
购物网站制作公司有哪些,哪个购物网站比较好?
贸易公司网站制作流程,出口贸易网站设计怎么做?
网站制作和推广的区别,想自己建立一个网站做推广,有什么快捷方法马上做好一个网站?
Python如何创建带属性的XML节点
如何选择适合PHP云建站的开源框架?
潮流网站制作头像软件下载,适合母子的网名有哪些?
建站三合一如何选?哪家性价比更高?
存储型VPS适合搭建中小型网站吗?
公司门户网站制作流程,华为官网怎么做?
装修招标网站设计制作流程,装修招标流程?
南宁网站建设制作定制,南宁网站建设可以定制吗?
如何基于云服务器快速搭建网站及云盘系统?
网站设计制作企业有哪些,抖音官网主页怎么设置?
C++如何使用std::optional?(处理可选值)
建站之星展会模板:智能建站与自助搭建高效解决方案
行程制作网站有哪些,第三方机票电子行程单怎么开?
如何高效搭建专业期货交易平台网站?
网站制作报价单模板图片,小松挖机官方网站报价?
c# Task.ConfigureAwait(true) 在什么场景下是必须的
长春网站建设制作公司,长春的网络公司怎么样主要是能做网站的?
如何快速搭建高效简练网站?
如何确认建站备案号应放置的具体位置?
深圳网站制作培训,深圳哪些招聘网站比较好?
如何在建站宝盒中设置产品搜索功能?
企业网站制作费用多少,企业网站空间一般需要多大,费用是多少?
详解一款开源免费的.NET文档操作组件DocX(.NET组件介绍之一)
建站DNS解析失败?如何正确配置域名服务器?
*请认真填写需求信息,我们会在24小时内与您取得联系。