贪吃蛇

4年以前  |  阅读数:1776 次  |  编程语言:JAVA 
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.net.*;
import java.applet.*;


public class SnakeMap extends JPanel implements Runnable{


    ImageIcon eatIcon = new ImageIcon("food.png");
    ImageIcon heidong = new ImageIcon("heidong.png");
    SnakeMap sm;
    Snake snake = new Snake();

    public SnakeMap(){
        sm = this;
        //构造组件
        JLabel  jlTitle = new JLabel();
        jlTitle = new JLabel(new ImageIcon("title.jpg"),JLabel.CENTER);
        JLabel  jlLgio = new JLabel();
        jlLgio = new JLabel(new ImageIcon("lgio.png"),JLabel.CENTER);
        JLabel  jlMap = new JLabel();
        jlMap = new JLabel(new ImageIcon("map5.jpg"),JLabel.CENTER);
        JButton newGame = new JButton("开始");
        newGame.setBackground(new Color(168,132,98));
        newGame.setForeground(new Color(128,64,0));
        newGame.setFont(new Font("华文行楷",1,30 ));
        JButton stopGame = new JButton("退出");
        stopGame.setBackground(new Color(168,132,98));
        stopGame.setForeground(new Color(128,64,0));
        stopGame.setFont(new Font("华文行楷",1,30 ));
        JLabel jlScore = new JLabel("分数:");
        jlScore.setForeground(new Color(128,64,0));
        jlScore.setFont(new Font("华文行楷",1,22 ));
        //JLabel jlHard = new JLabel("难度");
        //jlHard.setForeground(new Color(128,64,0));
        //jlHard.setFont(new Font("华文行楷",1,22 ));
        //JSlider slider = new JSlider(5,20);
        //slider.setBackground(new Color(168,132,98));
        //slider.setSnapToTicks(true);
        //slider.setPaintTicks(false);
        //slider.setMajorTickSpacing(0);
        //slider.setMinorTickSpacing(0);

        //设定布局
        setLayout(null);

        //添加组件
        add(jlTitle);
        jlTitle.setBounds(0,0,800,70);
        add(newGame);
        newGame.setBounds(40, 120, 120, 40);
        add(jlScore);
        jlScore.setBounds(30,210,100,80);
        //add(jlHard);
        //jlHard.setBounds(30,220,70,40);
        add(stopGame);
        stopGame.setBounds(40,320,120,40);
        add(jlLgio);
        jlLgio.setBounds(15,370,180,230);
        add(jlMap);
        jlMap.setBounds(210,80,580,480);
        //add(slider);
        //slider.setBounds(100,230,100,20);

        //设置窗体颜色
        this.setBackground(new Color(168,132,98));

        //设置监听器
        newGame.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent e){
                //newGame.setEnabled(false);
                if(snake.start == false && snake.failed == true){
                    music();
                    snake.setup();
                    snake.start = true;
                    requestFocus(true);
                }
                if(snake.start == true){
                    requestFocus(true);
                }
                if(snake.start == false && snake.failed == false){
                    snake.setup();
                    snake.start = true;
                    snake.failed = true;
                    requestFocus(true);
                }
            }
        });

        stopGame.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent e){
                System.exit(0);
            }
        });

        //添加键盘监听
        addKeyListener(new KeyAdapter(){
            public void keyPressed(KeyEvent e){
                if(snake.start && snake.failed){
                    if(e.getKeyCode() == KeyEvent.VK_UP && snake.j !=20 && snake.isMove == false){
                        snake.j = -20;
                        snake.i = 0;
                        snake.isMove = true;
                    }
                    if(e.getKeyCode() == KeyEvent.VK_DOWN && snake.j != -20 && snake.isMove == false){
                        snake.j = 20;
                        snake.i = 0;
                        snake.isMove = true;
                    }
                    if(e.getKeyCode() ==KeyEvent.VK_LEFT && snake.i != 20 && snake.isMove == false){    
                        snake.i = -20;
                        snake.j = 0;
                        snake.isMove = true;
                    }
                    if(e.getKeyCode() == KeyEvent.VK_RIGHT && snake.i != -20 && snake.isMove == false){
                        snake.i = 20;
                        snake.j = 0;
                        snake.isMove = true;
                    }

                    if(e.getKeyCode() == KeyEvent.VK_SPACE && snake.pause == true)
                        snake.pause = false;
                    else if(e.getKeyCode() == KeyEvent.VK_SPACE && snake.pause == false){
                        snake.pause = true;
                        Thread thread2 = new Thread(sm);
                        thread2.start();
                        requestFocus(true);
                    }
                }
            }
        }); 
        Thread thread=new Thread(sm);
        thread.start();
    }           

    public void run(){
        while(snake.pause){
            snake.move();
            repaint(); 
            try{
                Thread.sleep(400 - 50*snake.speed);  
            }catch(Exception e){}
        }
    }



        /*if(snakex[0] == 370 && snakey[0] == 400){
            snakex[0] = 610;
            snakey[0] = 280;
        }
        else if(snakex[0] == 610 && snakey[0] == 280){
            snakex[0] = 370;
            snakey[0] = 400;
        }*/


    public void music(){
        try{
            File f = new File("faded.wav");
            URI uri = f.toURI();
            URL url = uri.toURL();
            AudioClip aau = Applet.newAudioClip(url);
            aau.loop();
        }catch(Exception e){
            e.printStackTrace();
        }
    }


    //调用paint方法
    public void paint(Graphics g){
        super.paint(g);
        //画出地图  左上角(210,80)  右下角(790,560)
        g.drawRect(200,70,600,500);   
        g.drawRect(210,80,580,480);
        g.fillRect(200,70,600,10);
        g.fillRect(200,70,10,500);
        g.fillRect(200,560,600,10);
        g.fillRect(790,70,10,500);

        //画出蛇、食物
        if(snake.start && snake.failed){
            eatIcon.paintIcon(this , g , snake.food.eatx , snake.food.eaty);
            heidong.paintIcon(this , g , 370 , 400);
            heidong.paintIcon(this , g , 610 , 280);
            g.setColor(new Color(255,0,0));
            g.fillOval(snake.snakex[0] , snake.snakey[0] , 20 , 20);
            Graphics2D g1 = (Graphics2D) g;
            g1.setPaint(new GradientPaint(168,132,Color.CYAN,185,210,Color.MAGENTA,true));
            for(int m = 1 ; m < snake.len ; m ++){
                g.fillOval(snake.snakex[m] , snake.snakey[m] , 20 , 20);
            }
            g.setColor(new Color(128,64,0));
            g.setFont(new Font("华文行楷",Font.BOLD, 30));
            g.drawString(""+snake.score, 100, 260);
        }

        if (!snake.failed){
            g.setColor(new Color(128,64,0));
            g.setFont(new Font("华文行楷",Font.BOLD, 30));
            g.drawString(""+snake.score, 100, 200);
            g.setColor(new Color(168,132,98)); 
            g.setFont(new Font("arial",Font.BOLD, 30));
            g.drawString("Game Over ! Press start to restart", 200, 300);
        }
    }
}
 相关文章:
PHP分页显示制作详细讲解
SSH 登录失败:Host key verification failed
将二进制数据转为16进制以便显示
获取IMSI
获取IMEI
Java生成UUID
PHP自定义函数获取搜索引擎来源关键字的方法
让你成为最历害的git提交人
在Zeus Web Server中安装PHP语言支持
指定应用ID以获取对应的应用名称
再谈PHP中单双引号的区别详解
Python 2与Python 3版本和编码的对比
php+ajax+json 详解及实例代码
Yii2汉字转拼音类的实例代码
php封装的page分页类完整实例
php数组合并array_merge()函数使用注意事项
PHP实现简单爬虫的方法
PHP设计模式之工厂模式与单例模式
php实现数组中索引关联数据转换成json对象的方法
wget使用技巧