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();
}
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章