Java GUI编程之贪吃蛇游戏简单实现方法【附demo源码下载】

本文实例讲述了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程序设计有所帮助。

(0)

相关推荐

  • Java的GUI编程之列表和组合框的设计使用

    列表和组合框是又一类供用户选择的界面组件,用于在一组选择项目选择,组合框还可以输入新的选择. 列表 列表(JList)在界面中表现为列表框,是JList类或它的子类的对象.程序可以在列表框中加入多个文本选择项条目.列表事件的事件源有两种: 一是鼠标双击某个选项:双击选项是动作事件,与该事件相关的接口是ActionListener,注册监视器的方法是addActionListener(),接口方法是actionPerformed(ActionEvent e). 二是鼠标单击某个选项:单击选项是选项

  • Java编程中应用的GUI设计基础

    早先程序使用最简单的输入输出方式,用户在键盘输入数据,程序将信息输出在屏幕上.现代程序要求使用图形用户界面(Graphical User Interface,GUI),界面中有菜单.按钮等,用户通过鼠标选择菜单中的选项和点击按钮,命令程序功能模块.本章学习如何用Java语言编写GUI科学试验,如何通过GUI实现输入和输出. AWT和Swing 先前用Java编写GUI程序,是使用抽象窗口工具包AWT(Abstract Window Toolkit).现在多用Swing.Swing可以看作是AWT

  • java中使用双向链表实现贪吃蛇程序源码分享

    使用双向链表实现贪吃蛇程序 1.链表节点定义: package snake; public class SnakeNode { private int x; private int y; private SnakeNode next; private SnakeNode ahead; public SnakeNode() { } public SnakeNode(int x, int y) { super(); this.x = x; this.y = y; } public int getX(

  • 使用Java编写GUI对话框的教程

    对话框是为了人机对话过程提供交互模式的工具.应用程序通过对话框,或给用户提供信息,或从用户获得信息.对话框是一个临时窗口,可以在其中放置用于得到用户输入的控件.在Swing中,有两个对话框类,它们是JDialog类和JOptionPane类.JDialog类提供构造并管理通用对话框:JOptionPane类给一些常见的对话框提供许多便于使用的选项,例如,简单的"yes-no"对话框等. JDialog类 JDialog类作作对话框的基类.对话框与一般窗口不同,对话框依赖其他窗口,当它所

  • java编写贪吃蛇小游戏

    废话不多说,直接奉上代码: Frame.java package snake; import java.awt.Graphics; import java.awt.Menu; import java.awt.MenuBar; import java.awt.MenuItem; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyEvent; import

  • java实现的简单猜数字游戏代码

    本文实例讲述了java实现的简单猜数字游戏代码.分享给大家供大家参考. 具体代码如下: 复制代码 代码如下: import java.util.InputMismatchException; import java.util.Scanner; public class Main {         public static void main(String[] args) {                 // 产生一个随机数                 int number = (in

  • java贪吃蛇游戏编写代码

    本文实例为大家分享了java贪吃蛇游戏展示的具体代码,供大家参考,具体内容如下 1.采用MVC(model.view.control)框架模式 2.包和类的关系树形图为: 3.源码: package com.huai; import Java.awt.Color; import java.awt.Graphics; import java.awt.Point; import java.util.HashSet; import java.util.LinkedList; import java.u

  • java必学必会之GUI编程

    一.事件监听 测试代码一: package cn.javastudy.summary; import java.awt.*; import java.awt.event.*; public class TestTextField { public static void main(String args[]) { new MyFrameTextField(); } } class MyFrameTextField extends Frame { MyFrameTextField() { Text

  • JAVA GUI自定义JPanel画板背景

    自定义JPanel面板背景 一.前言 1.GUI全称是Graphical User Interface,就是图形用户界面.JAVA的GUI应用广泛在我们生活中也很常见.很多应用使用该GUI编程设计,像点击QQ图标弹出对应的登录窗体. 一般程序与用户的交互都基于对应程序的运行界面. 2.JPanel面板是SWING下的一个面板容器类.该面板支持嵌套,可设置布局方式,设置不同的布局管理器可添加其他控件像JButton按钮,JTextField文本框等.来设计完善一个程序界面窗体. 作为绘制面板支持s

  • java贪吃蛇极速版

    本文为大家推荐了一款由java实现经典小游戏:贪吃蛇,相信大家都玩过,如何实现的呐? 效果图: 废话不多说,直接奉上代码: 1. public class GreedSnake { public static void main(String[] args) { SnakeModel model = new SnakeModel(20,30); SnakeControl control = new SnakeControl(model); SnakeView view = new SnakeVi

随机推荐