java 贪吃蛇

package Snake;


import java.awt.BorderLayout;
import java.awt.Point;
import java.awt.RenderingHints.Key;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.LinkedList;
import java.util.Random;


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


import day25.FrameUtil;


public class Snake {
//宽(列数)
public static  final  int WIDTH=30;
//高(行数)
public static final int HEIGHT=9;

//地图
private  char[][] bankground=new char[HEIGHT][WIDTH];
//用集合来存蛇
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 InitBankground(){
for(int rows=0;rows<bankground.length;rows++){
for(int cols=0;cols<bankground[rows].length;cols++){
if(rows==0||rows==(HEIGHT-1)){
    bankground[rows][cols]= '*';
}else{
bankground[rows][cols]= ' ';
}
 
}
}

}

//初始化蛇
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);
bankground[body.y][body.x]='#';
}
//取出蛇头
Point head=snake.getFirst();
bankground[head.y][head.x]='$';

}
//打印地图
public void ShowBankground(){
for(int rows=0;rows<bankground.length;rows++){
for(int cols=0;cols<bankground[rows].length;cols++){
System.out.print(bankground[rows][cols]);
}
System.out.println();
}
}
//初始化食物
public void CreatFood(){
Random random=new Random();
while(true){
int x=random.nextInt(WIDTH);
int y=random.nextInt(HEIGHT);
if(bankground[y][x]!='*'){
food=new Point(x,y);
break;
}
}
}
//显示食物
public void ShowFood(){
bankground[food.y][food.x]='@';
}
/*//向上
public void MoveUp(){
Point head=snake.getFirst(); //获取原来的蛇头
//增加新蛇头
snake.addFirst(new Point(head.x,head.y-1));
//删除蛇尾
snake.removeLast();
}

//向下
public void MoveDown(){
Point head=snake.getFirst(); //获取原来的蛇头
//增加新蛇头
snake.addFirst(new Point(head.x,head.y+1));
//删除蛇尾
snake.removeLast();
}
//向左
public void MoveLeft(){
Point head=snake.getFirst();
snake.addFirst(new Point(head.x-1,head.y));
snake.removeLast();
}
//向右
public void MoveRight(){
Point head=snake.getFirst();
snake.addFirst(new Point(head.x+1,head.y));
snake.removeLast();
}*/
//蛇移动
public void Move(){
Point head=snake.getFirst();//先拿出蛇头

switch (currentDirection) {
case UP_DIRECTION:
 snake.addFirst(new Point(head.x,head.y-1));
break;
case DOWN_DIRECTION:
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()){
CreatFood();
}else{
//删除蛇尾
snake.removeLast();
}

}

//改变当前方向
public void changeDirection(int newDirection){
//判断新方向是否和当前方向相反
if((currentDirection+newDirection)!=0){
this.currentDirection=newDirection;
}
}



//刷新游戏的状态
public void ReFresh(){
//清除原来游戏的状态
InitBankground();
//将新的蛇的数据显示到地图
ShowSnake();
//将食物显示到地图
ShowFood();
ShowBankground();
}

//吃食物
public boolean EatFood(){
Point head=snake.getFirst();
if(head.equals(food)){
return true;
}
return false;
}

//游戏结束
public void isGameOver(){
Point head=snake.getFirst();
if(bankground[head.y][head.x]=='*'){
isGameOver=true;
}
for(int i=1;i<snake.size();i++){
Point bady=snake.get(i);

if(head.equals(bady)){
isGameOver=true;
}
}
}

public static void main(String[] args) throws Exception {
Snake snake=new Snake();
//初始化地图
snake.InitBankground();
//初始化蛇
snake.InitSnake();
snake.ShowSnake();
//生成食物
snake.CreatFood();
//显示食物
snake.ShowFood();
snake.ShowBankground();

//方向盘
JFrame frame=new JFrame("方向盘");
//JButton upBtn = new JButton("w");
//frame.add(upBtn,BorderLayout.NORTH);
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,400);


//给按钮添加事件监听器
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("GAME  OVER");
System.exit(0);
}


}

});

}
}
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值