您的位置:首页 > 编程语言 > Java开发

Java实现贪吃蛇(二)

2017-05-14 23:26 429 查看
控制台实现:

import java.awt.BorderLayout;
import java.awt.Point;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.util.LinkedList;
import java.util.Random;

import javax.swing.JButton;
import javax.swing.JFrame;

import cn.itcast.util.FrameUtil;

/**
* @version : 02
*/
public class Snake {
//地图的宽
public static final int WIDTH = 35;

//地图的高
public static final int HEIGHT = 9;

//地图
private char[][] background = new char[HEIGHT][WIDTH];

//使用集合保存蛇节点的信息
//LinkedList<E> : 具有增删快的特点
//Point是java.awt包中的坐标类
LinkedList<Point> snake = new LinkedList<Point>();

//食物
Point food;

//使用四个常量表示四个方向
public static final int UP_DIRECTION = 1; //上
public static final int DOWN_DIRECTION = -1; //下
public static final int LEFT_DIRECTION = 2; //左
public static final int RIGHT_DIRECTION = -2; //右

int currentDirection = -2; //蛇默认向右行走

//记录游戏是否结束
static boolean isGameOver = false; //默认游戏没有结束

//蛇移动的方法
public void move() {
Point head = snake.getFirst();
switch (currentDirection) {
case UP_DIRECTION: //向上
if (head.y == 0)
snake.addFirst(new Point(head.x, HEIGHT-1));
else
snake.addFirst(new Point(head.x, head.y-1));
break;
case DOWN_DIRECTION: //向下
if (head.y == HEIGHT-1)
snake.addFirst(new Point(head.x, 0));
else
snake.addFirst(new Point(head.x, head.y+1));
break;
case LEFT_DIRECTION: //向左
if (head.x == 0) //穿墙处理
snake.addFirst(new Point(WIDTH-1, head.y));
else
snake.addFirst(new Point(head.x-1, head.y));
break;
case RIGHT_DIRECTION: //向右
if (head.x == WIDTH-1)
snake.addFirst(new Point(0, head.y));
else
snake.addFirst(new Point(head.x+1, head.y));
break;
default:
break;
}
if (eatFood()) {
createFood();
}
else //吃到食物就不用删除蛇尾,省去添加
snake.removeLast();
}

//产生食物
public void createFood() {
//创建一个随机数对象
Random random = new Random();
while (true) {
int x = random.nextInt(WIDTH); //0~WIDTH-1
int y = random.nextInt(HEIGHT);
if (background[y][x] == ' ') {
food = new Point(x, y);
break;
}
}
}

//改变当前方向
public void changeDirection(int newDirection) {
if (currentDirection + newDirection != 0) {
currentDirection = newDirection;
}
}

//显示食物
public void showFood() {
background[food.y][food.x] = '@';
}

//初始化蛇
public void initSnake() {
int x = WIDTH/2;
int y = HEIGHT/2;
snake.addFirst(new Point(x-1, y));
snake.addFirst(new Point(x, y));
snake.addFirst(new Point(x+1, y)); //蛇头
}

//显示蛇 --> 实际上是将蛇节点的坐标信息反馈到地图上
public void showSnake() {
//画蛇身
for (int i = 1; i < snake.size(); ++i) {
Point body = snake.get(i);
background[body.y][body.x] = '#';
}
//取出蛇头
Point head = snake.getFirst();
background[head.y][head.x ] = '$';
}

//初始化地图
public void initBackground() {
for (int rows = 0; rows < background.length; ++rows) {
for (int cols = 0; cols < background[rows].length; ++cols) {
if (rows == 0 || rows == HEIGHT-1 || cols == 0 || cols == WIDTH-1)
background[rows][cols] = '*';
else
background[rows][cols] = ' ';
}
}
}

private void showBackground() { //打印二维数组
for (int rows = 0; rows < background.length; ++rows) {
for (int cols = 0; cols < background[rows].length; ++cols) {
System.out.print(background[rows][cols]);
}
System.out.println();
}
}

//刷新游戏状态
public void refresh() {
//清空游戏之前所有的状态信息
initBackground();
//把蛇最新的状态反馈到地图上
showSnake();
//把食物信息重新反馈到地图上
showFood();
//显示当前地图的信息
showBackground();
}

//吃食物
public boolean eatFood() {
//获取蛇头
Point head = snake.getFirst();
if (head.equals(food)) {
//吃到食物
return true;
}
return false;
}

//游戏结束的方法
public void isGameOver() {
//撞墙死亡
Point head = snake.getFirst();
// if (background[head.y][head.x] == '*') {
// isGameOver = true;
// }

//咬到蛇身
for (int i = 1; i < snake.size(); i++) {
Point body = snake.get(i);
if (head.equals(body))
isGameOver = true;
}

}

public static void main(String[] args) throws InterruptedException {
Snake snake = new Snake();

//初始化地图
snake.initBackground();
//初始化蛇
snake.initSnake();
//蛇反馈到地图
snake.showSnake();
//产生食物
snake.createFood();
//食物反馈到地图
snake.showFood();
//显示地图
snake.showBackground();

JFrame frame = new JFrame("方向盘");
frame.add(new JButton("↑"), BorderLayout.NORTH);
frame.add(new JButton("↓"), BorderLayout.SOUTH);
frame.add(new JButton("←"), BorderLayout.WEST);
frame.add(new JButton("→"), BorderLayout.EAST);
JButton button = new JButton("点击控制方向");
frame.add(button);
FrameUtil.initFrame(frame, 300, 300);
//按钮添加事件监听器
button.addKeyListener(new KeyAdapter() {
public void keyPressed(KeyEvent e) {
int code = e.getKeyCode();
switch (code) {
case KeyEvent.VK_UP:
snake.changeDirection(UP_DIRECTION);
break;
case KeyEvent.VK_DOWN:
snake.changeDirection(DOWN_DIRECTION);
break;
case KeyEvent.VK_LEFT:
snake.changeDirection(LEFT_DIRECTION);
break;
case KeyEvent.VK_RIGHT:
snake.changeDirection(RIGHT_DIRECTION);
break;
default:
break;
}
snake.move();
snake.isGameOver(); //判断是否游戏结束
snake.refresh();
if (isGameOver) {
System.out.println("游戏结束");
System.exit(0);
}
}
});
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息