【Java开源代码栏目提醒】:网学会员Java开源代码为您提供TextEdaciousSmallSnake.java参考,解决您在TextEdaciousSmallSnake.java学习中工作中的难题,参考学习。
package com.zf.s17;//创建一个包
import java.util.*;//引入类
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
class Move {//小蛇或食物位置(方位)移动
int move_X;
int move_Y;
Move(int move_X, int move_Y) {//带参数构造方法进行初始化
this.move_X = move_X;
this.move_Y = move_Y;
}
}
class MoveOperate extends Observable implements Runnable {//小蛇和食物移动操作的类
public static final int LEFT = 1;//小蛇向左移动的标识
public static final int UP = 2;//小蛇向上运动的标识
public static final int RIGHT = 3;//小蛇向右运动的标识
public static final int DOWN = 4;//小蛇向下运动的标识
private boolean[][] isHave; //指示位置上是否有小蛇或食物
private LinkedList snake = new LinkedList();//声明小蛇的双链表集合
private Move aliment; //食物
private int move_Direction = LEFT;//小蛇移动的方向向左
private boolean running = false; // 运行状态
private int timeSpace = 300; //时间间隔
private double speedChange = 0.75; // 每次的速度变化率
private boolean paused = false; // 暂停标志
private int score = 0; //得分
private int moveCount = 0; //吃到食物前移动的次数
private int X;//横坐标
private int Y;//纵坐标
public MoveOperate(int X, int Y) {//带参数构造方法进行初始化
this.X = X;
this.Y = Y;
resetGame();
}
public void run() {//实现Runnable接口必须实现的方法
running = true;//标识设置为真
while (running) {//根据标识进行循环
try {
Thread.sleep(timeSpace);//休眠0.3秒
} catch (Exception e) {
System.out.println("休眠出错:"+e.getMessage());
break;//跳出循环
}
if (!paused) {//小蛇正在移动时
if (move()) {
setChanged();//更新界面数据
notifyObservers();
} else {//弹出对话框显示游戏结束
JOptionPane.showMessageDialog(null, "你失败了!",
"Game Over", JOptionPane.INFORMATION_MESSAGE);
break;//跳出循环
}
}
}
if (!running) {//小蛇暂停或停止
JOptionPane.showMessageDialog(null, "你停止了游戏",
"Game Over", JOptionPane.INFORMATION_MESSAGE);
}
}
public void resetGame() {//重置游戏
move_Direction = MoveOperate.LEFT;//小蛇移动的方向向左
timeSpace = 300;//时间间隔为0.3秒
paused = false;//不暂停
score = 0;
moveCount = 0;//吃到食物前移动的次数为0
isHave = new boolean[X][Y];//初始化小蛇活动的范围
for (int i = 0; i < X; i++) {
isHave[i] = new boolean[Y];
Arrays.fill(isHave[i], false);//填充数据
}
int initLength = X > 20 ? 10 : X / 2;//初始化小蛇,如果横向位置超过20个,长度为10,否则为横向位置的一半
snake.clear();
int x = X / 2;//初始居中显示
int y = Y / 2;
for (int i = 0; i < initLength; i++) {
snake.addLast(new Move(x, y));//添加蛇移动的位置
isHave[x][y] = true;
x++;
}
aliment = createAliment();//创建食物
isHave[aliment.move_X][aliment.move_Y] = true;//在指定位置上有蛇或食物
}
public boolean move() {//蛇运行一步
Move snakeHead = (Move) snake.getFirst();//获得蛇头的位置
int headX = snakeHead.move_X;//获得蛇的横坐标
int headY = snakeHead.move_Y;//获得蛇的纵坐标
switch (move_Direction) {//分支循环判断蛇的运动
case UP://向上移动
headY--;//纵坐标减1
break;//跳出支循环
case DOWN://向下移动
headY++;//纵坐标加1
break;
case LEFT://向左移动
headX--;//横坐标减1
break;
case RIGHT://向上移动
headX++;//横坐标加1
break;
}
if ((0 <= headX && headX < X) && (0 <= headY && headY < Y)) {
if (isHave[headX][headY]) {//如果指定位置有蛇或食物
if (headX == aliment.move_X && headY == aliment.move_Y) {
snake.addFirst(aliment);//蛇头增长表示吃到食物
int scoreGet = (10000 - 200 * moveCount) / timeSpace;//分数与改变方向次数和速度有关
score += scoreGet > 0 ? scoreGet : 10;
moveCount = 0;
aliment = createAliment(); //创建新的食物
isHave[aliment.move_X][aliment.move_Y] = true;//设置食物所在位置
return true;
} else {
return false;//小蛇吃到自己
}
} else {
snake.addFirst(new Move(headX, headY));//添加小蛇的身体
isHave[headX][headY] = true;
snakeHead = (Move) snake.removeLast();//获得蛇头信息
isHave[snakeHead.move_X][snakeHead.move_Y] = false;
moveCount++;
return true;
}
}
return false;//碰到外壁失败
}
public void changeDirection(int dir) {//改变蛇运动的方向
if (move_Direction % 2 != dir % 2) {//改变的方向不与原方向相同或相反
move_Direction = dir;
}
}
private Move createAliment() {// 创建食物
int x = 0;
int y = 0;
do {
Random r = new Random();//随机获取位置
x = r.nextInt(X);
y = r.nextInt(Y);
} while (isHave[x][y]);
return new Move(x, y);//返回食物的新位置
}
public void speedUp() {// 加速运行
timeSpace *= speedChange;
}
public void speedDown() {// 减速运行
timeSpace /= speedChange;
}
public void changePauseState() {// 改变暂停状态
paused = !paused;
}
public boolean isRunning() {//判断是否运动
return running;
}
public void setRunning(boolean running) {//设置运动标识
this.running = running;
}
public LinkedList getMoveList() {//获得链表数据(蛇的身体)
return snake;
}
public Move getAliment() {//获得食物
return aliment;
}
public int getScore() {//获得得分
return score;
}
}
class SnakeFrame extends JFrame implements Observer {//贪吃蛇的视图,MVC中的View
public static final int gridWidth = 10;//格子的宽度
public static final int gridHeight = 10;//格子的高度
private int gameWidth;//画面的宽度
private int gameHeight;//画面的高度
private int gameX = 0;//画面左上角横位置
private int startY = 0;//画面左上角纵坐标
JLabel score; //声明分数标签
Canvas canvas; //声明画布
public SnakeFrame() {//// 默认构造方法调用带参数的构造方法
this(30, 40, 0, 0);
}
public SnakeFrame(int X, int Y) {// 带参数的构造方法进行初始化
this(X, Y, 0, 0);
}
public SnakeFrame(int X, int Y, int startX, int startY) {// 带参数的构造方法进行初始化
this.gameWidth = X * gridWidth;
this.gameHeight = Y * gridHeight;
this.gameX = startX;
this.startY = startY;
init();
}
private void init() {// 初始化游戏界面
this.setTitle("贪吃的小蛇");//设置界面的标题
this.setLocation(gameX, startY);//设置界面的位置(方位)
Container cp = this.getContentPane();//获得一容器
score = new JLabel("成绩:");
cp.add(score, BorderLayout.SOUTH);//将成绩放在界面的南侧
canvas = new Canvas();//创建中间的游戏显示区域
canvas.setSize(gameWidth + 1, gameHeight + 1);//设置区域的大小
cp.add(canvas, BorderLayout.CENTER);//区域放在界面的中间
this.pack();//根据组件的最优尺寸来进行布局
this.setResizable(false);//窗体不能最小化
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//设置默认关闭操作
this.setVisible(true);//可视
}
public void update(Observable observer, Object obj) {// 实现Observer接口定义的update方法
MoveOperate operate = (MoveO
上一篇:
TextDOMParseXML.java
下一篇:
数字水印技术的无线传感器网络安全机制研究思考