字符实现贪吃蛇
public class SnakeGame extends JPanel{
//地图的宽高
public static final int WIDTH=40;
public static final int HEIGHT=32;
//地图
char[][] background=new char[HEIGHT][WIDTH];//默认字符为空格
//初始化地图
public void initBackground() {
for(int rows=0;rows<HEIGHT;rows++) {
for(int cols=0;cols<WIDTH;cols++) {
//第一行、最后一行、第一列、最后一列
if(rows==0||rows==(HEIGHT-1)||cols==0||cols==(WIDTH-1)) {
background[rows][cols]='*';
}else {
background[rows][cols]=' ';
}
}
}
}
//蛇(增删多 查询少)
LinkedList<Point> snakes=new LinkedList<Point>();
//食物
Point food;//Point 类表示坐标
//生成食物
public void createFood() {
//随机数,生成食物生成的地点
Random random=new Random();
while(true) {
int x=random.nextInt(WIDTH);
int y=random.nextInt(HEIGHT);
if(background[y][x]!='*') {
food=new Point(x,y);
break;
}
}
}
//显示食物---把食物的坐标反馈到地图上,在地图上显示相应符号
public void showFood() {
background[food.y][food.x]='@';
}
//吃食物(头和食物坐标一样时)
public boolean eatFood() {
//获取蛇头
Point head=snakes.getFirst();
if(head.equals(food))
return true;
else
return false;
}
//初始化蛇节点
public void initSnake() {
int x=WIDTH/2;
int y=HEIGHT/2;
snakes.addFirst(new Point(x-1,y));
snakes.addFirst(new Point(x,y));
snakes.addFirst(new Point(x+1,y));
}
//显示蛇(把蛇的坐标反馈到地图上,在地图的对应位置画上对应的符号)
public void showSnake() {
//画蛇头
Point head=snakes.getFirst();
background[head.y][head.x]='$';
//画蛇身
for(int i=1;i<snakes.size();i++) {
Point body=snakes.get(i);
background[body.y][body.x]='#';
}
}
//四个常量代表四个方向
public static final int DIRECTION_UP=1;
public static final int DIRECTION_DOWN=-1;
public static final int DIRECTION_LEFT=2;
public static final int DIRECTION_RIGHT=-2;
//当前方向
private int currentDirection=-2;
//移动,根据当前方向移动
public void move() {
//获取原始头位置
Point head=snakes.getFirst();
switch(currentDirection) {
case DIRECTION_UP:
snakes.addFirst(new Point(head.x,head.y-1));
break;
case DIRECTION_DOWN:
snakes.addFirst(new Point(head.x,head.y+1));
break;
case DIRECTION_LEFT:
snakes.addFirst(new Point(head.x-1,head.y));
break;
case DIRECTION_RIGHT:
snakes.addFirst(new Point(head.x+1,head.y));
break;
}
if(eatFood()) {//吃掉食物,再生成食物
createFood();
//不用删除蛇尾
}else {
//删除蛇尾
snakes.removeLast();
}
}
//改变蛇方向的方法
public void changeDirection(int newDirection) {
if(newDirection+currentDirection!=0) {
//不是反方向
this.currentDirection=newDirection;
}//是反方向的话还按原
}
//显示地图
public void showBackground() {
for(int rows=0;rows<HEIGHT;rows++) {
for(int cols=0;cols<WIDTH;cols++) {
System.out.print(background[rows][cols]);
}
System.out.println();
}
}
//刷新游戏最新状态
public void refresh() {
//清空游戏之前状态
initBackground();
//显示蛇最新状态
showSnake();
//显示食物
showFood();
//显示地图
showBackground();
}
private boolean isGameOver=false;//默认没有结束
//游戏结束
public void isgameOver() {
//撞墙
Point head=snakes.getFirst();
if(background[head.y][head.x]=='*')
isGameOver=true;
//咬到自己
for(int i=1;i<snakes.size();i++) {
Point body=snakes.get(i);
if(body.equals(head))
isGameOver=true;
}
}
public static void main(String[] args) {
SnakeGame game=new SnakeGame();
game.initBackground();
//初始化蛇
game.initSnake();
game.showSnake();
//生成食物
game.createFood();
game.showFood();
//打印地图
game.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);
//给按钮添加一个事件监听器
button.addKeyListener(new KeyAdapter() {
//右键--source--override
@Override
public void keyPressed(KeyEvent e) {
int keyCode=e.getKeyCode();
switch(keyCode) {
case KeyEvent.VK_UP:
game.changeDirection(DIRECTION_UP);
break;
case KeyEvent.VK_DOWN:
game.changeDirection(DIRECTION_DOWN);
break;
case KeyEvent.VK_LEFT:
game.changeDirection(DIRECTION_LEFT);
break;
case KeyEvent.VK_RIGHT:
game.changeDirection(DIRECTION_RIGHT);
break;
default:
break;
}
game.move();
game.isgameOver();//每行走一步都应该判断蛇是否已经死亡
if(game.isGameOver==true) {
System.out.println("游戏结束。。。");
game.refresh();
System.exit(0);
}
game.refresh();
}
});
FrameUtil.initFrame(frame, 800, 640);
game.showBackground();
}
}