用户注册



邮箱:

密码:

用户登录


邮箱:

密码:
记住登录一个月忘记密码?

发表随想


还能输入:200字
云代码 - java代码库

贪吃蛇

2017-08-09 作者: 浸在灵魂笑笑举报

[java]代码库

package 贪吃蛇;
 
import java.applet.Applet;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.io.File;
import java.net.MalformedURLException;
import java.util.Random;
 
import javax.swing.ImageIcon;
import javax.swing.JPanel;
import javax.swing.Timer;
 
public class SnakePanel extends JPanel implements KeyListener,ActionListener {
     
    ImageIcon up = new ImageIcon("up.png");
    ImageIcon down = new ImageIcon("down.png");
    ImageIcon right = new ImageIcon("right.png");
    ImageIcon left = new ImageIcon("left.png");
    ImageIcon title = new ImageIcon("title.jpg");
    ImageIcon food = new ImageIcon("food.png");
    ImageIcon body = new ImageIcon("body.png");
     
    /*
     * 定义数组记录蛇头和蛇身体的坐标,变量len表示蛇的长度
     * 变量方向表示蛇移动的方向
     */
    int[] snakex = new int[750];
    int[] snakey = new int[750];
     
    Random rand = new Random();
    int foodx = rand.nextInt(34)*25+25;
    int foody = rand.nextInt(24)*25+75;
     
    int len = 3;
    int score = 0;
    String fangxiang = "R";//R右、L左、U上、D下
     
    boolean isStarted = false;//判断游戏是否开始
    boolean isFailed = false;//判断是否死亡
     
    //计时器:1.时间 2.时间到了去找的对象
    Timer timer = new Timer(300, this);
     
    public SnakePanel(){
        this.setFocusable(true);//取得焦点
        this.addKeyListener(this);
        setup();
        timer.start();
    }
     
     
    /*
     * Graphics图像
     * public void paint(Graphics g)  以绘制组件。
     * 应用程序不应直接调用 paint,而是应该使用 repaint 方法来安排重绘组件。
     * 参数:g (相当于画笔)- 在其中进行绘制的 Graphics 上下文
     */
    public void paint(Graphics g){
         
//      super.paint(g);
//      this.setBackground(Color.WHITE);
        this.getRootPane().setBackground(Color.WHITE);
         
        /*
         * public void paintIcon(Component c,Graphics g,int x,int y)
         * 绘制图标。
         * 图标的左上角在图形上下文 g 的坐标空间中的点 (x, y) 处绘制。
         * 如果此图标没有图像观察者,则此方法使用 c 组件作为观察者。
         * 参数:c(画布) - 用作观察者的组件,如果此图标没有图像观察者
                 g (画笔)- 图形上下文
                 x - 图标左上角的 X 坐标
                 y - 图标左上角的 Y 坐标
         */
        title.paintIcon(this, g, 25, 11);
         
        /*
         * void java.awt.Graphics.fillRect(int x, int y, int width, int height)
         * 填充指定的矩形。
         * 该矩形左边和右边位于 x 和 x + width - 1。
         * 顶边和底边位于 y 和 y + height - 1。
         * 得到的矩形覆盖的区域宽度为 width 像素,高度为 height 像素。
         * 使用图形上下文的当前颜色填充该矩形。
         * 参数:x - 要填充矩形的 x 坐标。
                 y - 要填充矩形的 y 坐标。
                 width - 要填充矩形的宽度。
                 height - 要填充矩形的高度。
         */
        g.fillRect(25, 75, 850, 600);
         
        //画蛇头,先判断蛇头的方向
        if(fangxiang.equals("R")){
            right.paintIcon(this, g, snakex[0], snakey[0]);
        }else if(fangxiang.equals("L")){
            left.paintIcon(this, g, snakex[0], snakey[0]);
        }else if(fangxiang.equals("U")){
            up.paintIcon(this, g, snakex[0], snakey[0]);
        }else if(fangxiang.equals("D")){
            down.paintIcon(this, g, snakex[0], snakey[0]);
        }
         
        //画蛇的身体
        for (int i = 1; i < len; i++) {
            body.paintIcon(this, g, snakex[i], snakey[i]);
        }
         
        //游戏没有开始时,显示提示语(!isStarted)
        if(isStarted == false){
            g.setColor(Color.WHITE);
            g.setFont(new Font("微软雅黑",Font.BOLD,35));
            g.drawString("Press Space to Start/Pause", 250, 350);
        }
         
        if(isFailed){
            g.setColor(Color.WHITE);
            g.setFont(new Font("微软雅黑",Font.BOLD,35));
            g.drawString("Game Over! Press Space to ReStart", 200, 350);
        }
         
        food.paintIcon(this, g, foodx, foody);
         
        //添加分数
        g.setColor(Color.WHITE);
        g.drawString("Score : "+score, 600, 45);
    }
     
    public void setup(){
        isStarted = false;
        isFailed = false;
         
        len = 3;
        snakex[0] = 100;
        snakey[0] = 100;
        snakex[1] = 75;
        snakey[1] = 100;
        snakex[2] = 50;
        snakey[2] = 100;
     
    }
 
    @Override
    public void keyPressed(KeyEvent e) {
        // TODO Auto-generated method stub
        int keyCode = e.getKeyCode();
         
        //实现转向,不能实现反转
        if(keyCode == KeyEvent.VK_SPACE){
 
            if (isFailed) {
//              isStarted = false;
//              isFailed = false;
                setup();
            }else {
                //          isStarted = true;
                isStarted = !isStarted;//改变当前状态
//              repaint();
            }          
 
        }else if(keyCode == KeyEvent.VK_UP && fangxiang != "D"){
            fangxiang = "U";
        }else if(keyCode == KeyEvent.VK_DOWN && fangxiang != "U"){
            fangxiang = "D";
        }else if(keyCode == KeyEvent.VK_RIGHT && fangxiang != "L"){
            fangxiang = "R";
        }else if(keyCode == KeyEvent.VK_LEFT && fangxiang != "R"){
            fangxiang = "L";
        }
         
         
    }  
     
    @Override
    public void actionPerformed(ActionEvent e) {
        // TODO Auto-generated method stub
        //1.再定义个闹钟
        timer.start();
        //2.移动数据
         
        if (isStarted && !isFailed) {
            //移动身体
            for (int i = len; i >0; i--) {
                snakex[i] = snakex[i-1];
                snakey[i] = snakey[i-1];
            }
            //移动头
            if(fangxiang.equals("R")){
                snakex[0] = snakex[0] + 25;
                if(snakex[0] > 850)
                    snakex[0] = 25;
            }else if(fangxiang.equals("L")){
                snakex[0] = snakex[0] - 25;
                if(snakex[0] < 25) snakex[0] = 850;
            }else if(fangxiang.equals("U")){
                snakey[0] = snakey[0] - 25;
                if(snakey[0] < 75) snakey[0] = 650;
            }else if(fangxiang.equals("D")){
                snakey[0] = snakey[0] + 25;
                if(snakey[0] > 650) snakey[0] = 75;
            }
        }
         
        //吃食物
        if(snakex[0] == foodx && snakey[0] == foody){
            len ++;
            score ++;
            foodx = rand.nextInt(34)*25+25;
            foody = rand.nextInt(24)*25+75;
        }
         
        //判断身体相碰,游戏结束
        for (int i = 1; i < len; i++) {
            if (snakex[0] == snakex[i] && snakey[0] == snakey[i]) {
                isFailed = true;
            }
        }
         
        //3.repaint()
        repaint();
    }
 
    @Override
    public void keyReleased(KeyEvent e) {
        // TODO Auto-generated method stub
    }
 
    @Override
    public void keyTyped(KeyEvent e) {
        // TODO Auto-generated method stub
    }
 
 
 
}
 
package 贪吃蛇;
 
import java.applet.Applet;
import java.io.File;
import java.net.MalformedURLException;
 
import javax.swing.JFrame;
 
public class Snake {
 
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        JFrame frame = new JFrame();
        frame.setBounds(10, 10, 900, 720);
        frame.setResizable(false);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
         
        SnakePanel panel = new SnakePanel();
        frame.add(panel);
         
        frame.setVisible(true);
         
    }
 
}


网友评论    (发表评论)

共9 条评论 1/1页

发表评论:

评论须知:

  • 1、评论每次加2分,每天上限为30;
  • 2、请文明用语,共同创建干净的技术交流环境;
  • 3、若被发现提交非法信息,评论将会被删除,并且给予扣分处理,严重者给予封号处理;
  • 4、请勿发布广告信息或其他无关评论,否则将会删除评论并扣分,严重者给予封号处理。


扫码下载

加载中,请稍后...

输入口令后可复制整站源码

加载中,请稍后...