java写贪吃蛇

代码下载

最近学习了Java的贪吃蛇的制作方法,重新回顾了一下Java的窗口知识,下面就讲一下它的流程吧:

一、首先创建并设置窗口的属性:



 然后设置窗口是显示出来的:



 二、窗口创建完成后就要在窗口加一个画布:



 并添加画布基本属性:



 在main方法中调用



 加入图片装饰

 

三、画布完成后就要设置蛇的初始化状态

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.Random;
/**
 * Created by Taoyongpan on 2017/3/23.
 */
public class SnakePanel extends JPanel implements KeyListener,ActionListener{

    ImageIcon body = new ImageIcon("img/body.png");
ImageIcon food = new ImageIcon("img/food.png");
ImageIcon title = new ImageIcon("img/title.jpg");
ImageIcon up = new ImageIcon("img/up.png");
ImageIcon down = new ImageIcon("img/down.png");
ImageIcon left = new ImageIcon("img/left.png");
ImageIcon right = new ImageIcon("img/right.png");
    int[] snakex = new int[750];
    int[] snakey = new int[750];
//随机产生食物
Random random = new Random();
    int foodx = random.nextInt(34)*25+25;
    int foody = random.nextInt(24)*25+75;
//贪吃蛇长度
int len = 3;
//得分
int score = 0;
//贪吃蛇速度
int speed = 0;
//贪吃蛇方向
String fangxiang = "R";//R向右,L向左,U向上,D向下
//默认游戏为不开始
boolean isStarted = false;
//判断游戏是否结束
boolean isFailed = false;
Timer timer = new Timer(100,this);
//重新构造
public SnakePanel(){
        //获得焦点
this.setFocusable(true);
//添加键盘监听
this.addKeyListener(this);
setup();
timer.start();
}

    public void paint(Graphics g){
        //调用paint方法
super.paint(g);
        this.setBackground(Color.WHITE);
title.paintIcon(this,g,25,11);
//画一个方框
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]);
}
        //设置开始的提示语句
if(!isStarted){
            g.setColor(Color.WHITE);
g.setFont(new Font("arial",Font.BOLD,30));
g.drawString("Press Space to Start/Stop",300,300);
}
        //设置失败时候的提示语句
if (isFailed){
            g.setColor(Color.WHITE);
g.setFont(new Font("arial",Font.BOLD,30));
g.drawString("Game over,Press Space to ReStart",300,300);
}
        //添加食物
food.paintIcon(this,g,foodx,foody);
g.setColor(Color.WHITE);
g.setFont(new Font("arial",Font.PLAIN,20));
g.drawString("Score:"+score,750,30);
g.drawString("Length:"+len,750,50);
}
    //初始化蛇
public void setup(){

        isFailed = false;
isStarted = false;
len = 3;
//默认方向为R
fangxiang = "R";
snakex[0] = 100;
snakey[0] = 100;
snakex[1] = 75;
snakey[1] = 100;
snakex[2] = 50;
snakey[2] = 100;
}

    //在源组件上按下一个键然后释放该键后被调用
@Override
public void keyTyped(KeyEvent e) {

    }
    //在源组件上按下一个键后被调用
@Override
public void keyReleased(KeyEvent e) {

    }

    // 在源组件上释放一个键后被调用
@Override
public void keyPressed(KeyEvent e) {
        int keyCode = e.getKeyCode();
//敲空格键
/**
         * VK_HOME         HomeVK_CONTROL                  控制键
VK_END            EndVK_SHIFT                       shiftVK_PGUP          page upVK_BACK_SPACE             退格键
VK_PGDN          page downVK_CAPS_LOCK              大小写锁定键
VK_UP              上箭头                        VK_NUM_LOCK                小键盘锁定键
VK_DOWN         下箭头                           VK_ENTER                      回车键
VK_LEFT           左箭头                         VK_UNDEFINED                未知键
VK_RIGHT          右箭头                         VK_F1--VK_F12                F1 -- F12
           VK_ESCAPE       EscVK_0 --VK_9                    0 --- 9
           VK_TAB             TabVK_A --VK_Z                    A----Z
         */
if(keyCode == KeyEvent.VK_SPACE){
            if (isFailed)
            {
                setup();
}else {
                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_LEFT&& fangxiang != "R"){
            fangxiang = "L";
}else if (keyCode == KeyEvent.VK_RIGHT&& fangxiang != "L"){
            fangxiang = "R";
}
    }

    //就像一个闹钟一样
/**
     * 这是一个事件监听器,可以处理类似单击鼠标时触发的事件
* ActionEvent就是一个事件类,传入的e就是该事件的对象
* @param e
*/
@Override
public void actionPerformed(ActionEvent e) {
        //再定义一个闹钟
timer.start();
//移动数据
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){
                    isFailed = true;
//snakex[0] = 25;
}
            }else if(fangxiang.equals("L")){
                snakex[0] = snakex[0] - 25;
                if (snakex[0] < 25){
                    //snakex[0] = 850;
isFailed = true;
}
            }else if(fangxiang.equals("U")){
                snakey[0] = snakey[0] - 25;
                if (snakey[0] <75 ){
                    //snakey[0] = 650;
isFailed = true;
}
            }else if(fangxiang.equals("D")){
                snakey[0] = snakey[0] + 25;
                if(snakey[0] > 650){
                    //snakey[0] = 75;
isFailed = true;
}
            }
            if(snakex[0] == foodx&&snakey[0] == foody){
                len++;
score++;
foodx = random.nextInt(34)*25+25;
foody = random.nextInt(24)*25+75;
}
            for (int i= 1;i<len;i++){
                if (snakex[0] == snakex[i] && snakey[0] == snakey[i]) {
                    isFailed = true;
}
            }
        }
        //repaint()
repaint();
}
}

猜你喜欢

转载自taoyongpan.iteye.com/blog/2365497