贪吃蛇游戏的java源码

这里我把贪吃蛇的java源码粘出来,有兴趣的可以看看,如果要看具体的思路,点击下面的连接:
http://blog.youkuaiyun.com/angellover2017/article/details/72813957

snakegame.java

package snakegame;

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Point;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.util.LinkedList;
import java.util.Random;
import java.util.Scanner;

import javax.swing.JFrame;
import javax.swing.JPanel;

public class SnakeGame_1 extends JPanel{



        /**
     * 
     */
    private static final long serialVersionUID = 1L;
    //常量,表示地图的宽和高
      protected static final int HEIGHT=30;
      protected static final int WIDTH=30;
        //常量,表示每个方格的宽和高
       protected static final int CELL_H=20;
       protected static final int CELL_W=20;
   //常量,表示蛇的方向
       protected static final int UP_DIRECTION=1;
       protected static final int DOWN_DIRECTION=-1;
       protected static final int LEFT_DIRECTION=2;
       protected static final int RIGHT_DIRECTION=-2;
        //当前方向,默认为右方
        private int currentdirection=RIGHT_DIRECTION;
        //char型数组来储存地图
        protected char[][]  map=new char[HEIGHT][WIDTH];
        //容器,用来储存蛇的坐标信息
        private LinkedList<Point>  snake=new LinkedList<Point>();
        //食物的坐标用Point类来储存
        private Point food=new Point();
        //用来判断游戏是否结束
        protected static boolean GameOver=false;
        protected static boolean IsAuto=true;
        private static int Difficult_Degree=1;
        private Scanner in;

/* 图形刷新区 */
        //重写Paint方法
        @Override
    public void paint(Graphics g) {
    //画地图
    for(int i=0;i<HEIGHT;i++)
        for(int j=0;j<WIDTH;j++)
        {
            if(map[i][j]=='*'){
                g.setColor(Color.GRAY);
            }else{
                g.setColor(Color.WHITE);
            }
            g.fill3DRect(j*CELL_W, i*CELL_H, CELL_W, CELL_H, true);
        }

        //画蛇
        //定位蛇头
        int W=snake.getFirst().x;
        int H=snake.getFirst().y;
        g.setColor(Color.RED);
        g.fill3DRect(W*CELL_W,H*CELL_H , 20, 20,true);
        //定位蛇身
        for(int t=1;t<this.snake.size();t++)
        {
            W=snake.get(t).x;
            H=snake.get(t).y;
            g.setColor(Color.GREEN);
            g.fill3DRect(W*CELL_W,H*CELL_H , 20, 20,true);

        }

        //画食物
        map[food.y][food.x]='@';
        g.setColor(Color.BLUE);
        g.fill3DRect(food.x*CELL_W, food.y*CELL_H, 20, 20, true);

        //画字
        if(SnakeGame_1.GameOver){
            g.setColor(Color.ORANGE);
            g.setFont(new Font("宋体", Font.BOLD,30 ));
            g.drawString("GAMW OVER !", CELL_W*(WIDTH/2), CELL_H*(HEIGHT/2));
        }




}
/*  初始化地图、蛇、食物函数区  */   
        //初始化Map
        public void intiMap() {

            for(int i=0;i<HEIGHT;i++)
                for(int j=0;j<WIDTH;j++)
                {
                    if(i==0||(i==HEIGHT-1)){
                        map[i][j]='*';
                    }
                    else this.map[i][j]=' ';
                }
        }
        //初始化snake
        public void intiSnake(){
            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 intiFood(){
            while(true){
                Random random=new Random();
                int x=random.nextInt(WIDTH-1);
                int y=random.nextInt(HEIGHT-1);
                if(map[y][x]!='*'&&map[y][x]!='#'&&map[y][x]!='$')
                {
                    food.x=x;
                    food.y=y;
                    break;

                }

            }
        }
/*  蛇移动函数区  */
        //run函数,蛇自己走
        public void runAuto() throws InterruptedException{
            while (true){
                move();
                IsOver();
                reFresh();
                repaint();

                if(GameOver){
                    repaint();
                }
                Thread.sleep(1000/Difficult_Degree);
            }
        }
        //蛇移动函数
        public void move(){
            //取蛇头
            Point snakehead=snake.getFirst();
            //依据方向,移动
            switch(currentdirection){
            //向上移动
            case UP_DIRECTION :
                //结束的时候不执行添加头结点
                if(!GameOver){
                    snake.addFirst(new Point(snakehead.x,snakehead.y-1));
                }

                break;
            //向下移动
            case DOWN_DIRECTION :
                //结束的时候不执行添加头结点
                if(!GameOver){
                     snake.addFirst(new Point(snakehead.x,snakehead.y+1));
                }

                break;
            //向左移动
            case LEFT_DIRECTION :
                if(!GameOver){
                    if(snakehead.x==0){
                    snake.addFirst(new Point(snakehead.x-1+WIDTH,snakehead.y));
                }else{
                    snake.addFirst(new Point(snakehead.x-1,snakehead.y));
                }
                }

            break;
            //向右移动
            case RIGHT_DIRECTION :
                if(!GameOver){
                    snake.addFirst(new Point((snakehead.x+1)%WIDTH,snakehead.y));
                }

            break;
            default : break;
            }
            if(eatFood()){
                //先刷新,防止出现食物长到身上
                repaint();
                //重建食物
                intiFood();
            }else{
                //游戏结束的时候不执行删除尾节点
                if(!GameOver){
                    //删除蛇尾
                    snake.removeLast();
                }

            }

        }
        //改变蛇的方向
        public void changeDirection(int newDirection){
            if(newDirection+currentdirection!=0){
                currentdirection=newDirection;
            }
        }
        //蛇吃食物区 
        public boolean eatFood(){
            //取蛇头
            Point snakehead=snake.getFirst();
            if(snakehead.equals(food)){
                return true;
            }
            return false;
        }

/*  刷新区  */
        public void  reFresh(){
            //刷新地图
            intiMap();
            //刷新蛇
            showSnake();
            //刷新食物
            showFood();
            /*//显示当前地图
            //showMap();
*/      }
/*  打印函数区*/
        //打印输出地图
        /* public boolean showMap(){
            {
                for(int i=0;i<HEIGHT;i++){
                for(int j=0;j<WIDTH;j++)
                {
                    System.out.print(this.map[i][j]);
                }
                System.out.println();
            }
                return true;
            }
            }*/
        //在地图上显示蛇
        public boolean showSnake(){
            {
                    //定位蛇头
                    int W=snake.getFirst().x;
                    int H=snake.getFirst().y;
                    map[H][W]='$';
                    //定位蛇身
                    for(int i=1;i<this.snake.size();i++)
                    {
                        W=snake.get(i).x;
                        H=snake.get(i).y;
                        map[H][W]='#';
                    }
                return true;    
                }
            }
        //在地图上显示食物
        public boolean showFood(){
            {
                map[food.y][food.x]='@';
                return true;
            }
        }
/* 设置游戏难度区  */
        public void set_Difficuty(){
        System.out.println("请输入难度系数(1——10)");
        in = new Scanner(System.in);
        Difficult_Degree=in.nextInt();      
        }
/*  结束游戏区  */
        public void IsOver(){
            //取蛇头
            Point snakehead=snake.getFirst();
            //撞墙死
            if(map[snakehead.y][snakehead.x]=='*'){
                GameOver=true;
            }
            //咬到自己死
            if(map[snakehead.y][snakehead.x]=='#'){
                GameOver=true;
            }
        }


    public static void main(String[] args) throws InterruptedException {
//字符界面
    /*  SnakeGame sg=new SnakeGame();
        sg.intiMap();
        sg.intiSnake();
        sg.intiFood();
        sg.showSnake();
        sg.showFood();
        sg.showMap();

        JFrame frame=new JFrame("方向盘");
        frame.setSize(300, 300);
        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 jbcenter=new JButton("按下此键可控制蛇");
        frame.add(jbcenter, BorderLayout.CENTER);
        jbcenter.addKeyListener(new KeyAdapter() {

            @Override
            public void keyPressed(KeyEvent e) {
                super.keyPressed(e);
                switch(e.getKeyCode()){
                case KeyEvent.VK_UP:
                    sg.changeDirection(UP_DIRECTION);
                    break;
                case KeyEvent.VK_DOWN:
                    sg.changeDirection(DOWN_DIRECTION);
                    break;
                case KeyEvent.VK_LEFT:
                    sg.changeDirection(LEFT_DIRECTION);
                    break;
                case KeyEvent.VK_RIGHT:
                    sg.changeDirection(RIGHT_DIRECTION);
                    break;
                default: break;
                }
                sg.move();
                sg.IsOver();
                sg.reFresh();
                if(SnakeGame.GameOver){
                    System.out.println("game is over");
                    System.exit(0);
                }
            }

        });
       frame.setVisible(true);
        */

//图形界面
       SnakeGame_1 sg1=new SnakeGame_1();
       sg1.set_Difficuty();
       JFrame frame1=new JFrame("贪吃蛇");
       frame1.setSize(CELL_W*WIDTH+20, CELL_H*HEIGHT+45);
       frame1.setVisible(true);
       frame1.add(sg1);
       sg1.intiMap();
       sg1.intiSnake();
       sg1.intiFood();
       sg1.repaint();
       //为窗口添加监听器
       frame1.addKeyListener(new KeyAdapter() {

            @Override
            public void keyPressed(KeyEvent e) {
                super.keyPressed(e);
                switch(e.getKeyCode()){
                case KeyEvent.VK_UP:
                    IsAuto=false;
                    sg1.changeDirection(UP_DIRECTION);
                    break;
                case KeyEvent.VK_DOWN:
                    IsAuto=false;
                    sg1.changeDirection(DOWN_DIRECTION);
                    break;
                case KeyEvent.VK_LEFT:
                    IsAuto=false;
                    sg1.changeDirection(LEFT_DIRECTION);
                    break;
                case KeyEvent.VK_RIGHT:
                    IsAuto=false;
                    sg1.changeDirection(RIGHT_DIRECTION);
                    break;
                default: break;
                }
                sg1.move();
                sg1.IsOver();
                sg1.reFresh();
                sg1.repaint();

                if(SnakeGame_1.GameOver){
                    sg1.repaint();
                  /* // System.exit(0);
*/              }
                IsAuto=true;
            }

        });
       //如果IsAuto 为真,则自己走
      if(IsAuto)sg1.runAuto();  
    }
}
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

angelavor

觉得有收获,给我个三连吧

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值