小編的話
在文章的最後作者爲大家整理了很多資料!包括java核心知識點+全套架構師學習資料和視頻+一線大廠面試寶典+面試簡歷模板+阿里美團網易騰訊小米愛奇藝快手嗶哩嗶哩面試題+Spring源碼合集+Java架構實戰電子書等等!
資料都是免費分享給大家的,大家點這裏直接下載就好了
前言
我想貪喫蛇應該是不少90後和00後的童年(我本人是01年的),回想起從前偷偷拿着我爹的諾基亞在被窩裏玩貪喫蛇,不禁感慨萬分,時間飛逝,沒想到10年後的我也可以自己做一個貪喫蛇了。
該程序主要實現了以下功能:
1.按空格開始遊戲、暫停遊戲或重新開始遊戲。
2.方向鍵控制蛇移動的方向。
3.蛇喫掉食物可以增長,並增加遊戲分數(不會加快遊戲速度)。
4.蛇咬到自己會結束遊戲。
5.蛇撞到遊戲區域外會結束遊戲。
接下來放出源碼,爲了讓初學者也能夠理解,我儘量將大部分代碼寫了註釋:
測試類
public class Test {
public static void main(String[] args) {
Snake snake = new Snake();
snake.myJFrame();
}
}
Snake類
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.util.Random;
public class Snake extends JFrame implements KeyListener, ActionListener, MouseListener {
int slong = 2;//蛇當前長度
//蛇座標
int[] Snakex = new int[100];
int[] Snakey = new int[100];
int fx = 1;//蛇的方向 0-左 1-右 2-上 3-下
Timer timer = new Timer(100, this);//設置定時器,每100毫秒一次
//食物位置
int foodx;
int foody;
Random random = new Random();//隨機數,隨機位置生成食物
int started = 0;//遊戲信息 0-未開始 1-開始 2-結束
//---------------------------------------------------------------------------------------------------------------------
//窗體
public void myJFrame() {
this.setTitle("貪喫蛇"); //標題
this.setSize(800, 600); //窗口大小
this.setResizable(false); //窗口是否可以改變大小=否
this.setDefaultCloseOperation(Snake.EXIT_ON_CLOSE); //窗口關閉方式爲關閉窗口同時結束程序
int width = Toolkit.getDefaultToolkit().getScreenSize().width; //獲取屏幕寬度
int height = Toolkit.getDefaultToolkit().getScreenSize().height; //獲取屏幕高度
// System.out.println("寬度:"+width);//測試
// System.out.println("高度:"+height);//測試
this.setLocation((width - 800) / 2, (height - 600) / 2); //設置窗口默認位置以屏幕居中
this.setFocusable(true);
this.addKeyListener(this);
this.setVisible(true); //窗口是否顯示=是
// 蛇的初識位置
Snakex[0] = 60;
Snakey[0] = 100;
Snakex[1] = 40;
Snakey[1] = 100;
// 隨機食物的初識位置
foodx = random.nextInt(39);
foody = random.nextInt(22);
foodx = foodx * 20;
foody = foody * 20 + 80;
System.out.println(foodx + "," + foody);
}
//---------------------------------------------------------------------------------------------------------------------
//覆寫paint方法,繪製界面
public void paint(Graphics g) {
// 繪製背景
g.setColor(Color.LIGHT_GRAY);
g.fillRect(0, 0, 800, 600);
//繪製遊戲區域
g.setColor(Color.black);
g.fillRect(0, 80, 800, 520);
//繪製蛇
for (int i = 0; i < slong; i++) {
g.setColor(Color.CYAN);
g.fillRect(Snakex[i], Snakey[i], 20, 20);
}
// 繪製食物
g.setColor(Color.yellow);
g.fillOval(foodx, foody, 20, 20);
if (started == 0) {
g.setColor(Color.BLACK);//設置畫筆顏色
g.setFont(new Font("微軟雅黑", 10, 20)); //設置字體
g.drawString("按下“空格鍵”開始遊戲", 300, 65); //繪製字符
} else if (started == 1) {
g.setColor(Color.BLACK);//設置畫筆顏色
g.setFont(new Font("微軟雅黑", 10, 20)); //設置字體
g.drawString("當前分數爲:", 300, 65); //繪製字符
g.drawString(String.valueOf(slong - 2), 420, 65); //繪製字符
} else if (started == 2) {
g.setColor(Color.BLACK);//設置畫筆顏色
g.setFont(new Font("微軟雅黑", 10, 20)); //設置字體
g.drawString("遊戲結束-", 250, 65); //繪製字符
g.drawString("最終分數爲:", 350, 65); //繪製字符
g.drawString(String.valueOf(slong - 2), 470, 65); //繪製字符
}
}
// 操作監聽——控制蛇的不斷移動
@Override
public void actionPerformed(ActionEvent e) {
// 判斷遊戲是否開始
if (started == 1) {
// 通過循環控制蛇移動
for (int i = slong - 1; i > 0; i--) {
Snakex[i] = Snakex[i - 1];
Snakey[i] = Snakey[i - 1];
}
// 判斷蛇移動的方向
if (fx == 0) {
Snakex[0] = Snakex[0] - 20;
} else if (fx == 1) {
Snakex[0] = Snakex[0] + 20;
} else if (fx == 2) {
Snakey[0] = Snakey[0] - 20;
} else if (fx == 3) {
Snakey[0] = Snakey[0] + 20;
}
// 判斷蛇是否撞到牆外
if (Snakex[0] < 0 || Snakex[0] > 780 || Snakey[0] < 80 || Snakey[0] > 580) {
started = 2;
}
// 判斷蛇是否喫到了食物
if (Snakex[0] == foodx && Snakey[0] == foody) {
slong++;
foodx = random.nextInt(39);
foody = random.nextInt(22);
foodx = foodx * 20;
foody = foody * 20 + 80;
System.out.println(foodx + "," + foody);
}
// 判斷是否喫到了自己
for (int i = 1; i < slong; i++) {
if (Snakex[0] == Snakex[i] && Snakey[0] == Snakey[i]) {
started = 2;
}
}
// 判斷食物是否隨機在了蛇身上
for (int i = 0; i < slong; i++) {
if (foodx == Snakex[i] && foody == Snakey[i]) {
// 隨機食物的初識位置
foodx = random.nextInt(39);
foody = random.nextInt(22);
foodx = foodx * 20;
foody = foody * 20 + 80;
System.out.println(foodx + "," + foody);
}
}
repaint();
}
timer.start();
}
// 輸入
@Override
public void keyTyped(KeyEvent e) {
}
// 鍵盤按下——控制遊戲的開始以及蛇的移動方向
@Override
public void keyPressed(KeyEvent e) {
// 獲取從鍵盤輸入的鍵
int key = e.getKeyCode();
// 判斷是否爲空格
if (key == KeyEvent.VK_SPACE) {
if (started == 0) {
started = 1;
} else if (started == 1) {
started = 0;
} else if (started == 2) {
started = 0;
slong = 2;//蛇當前長度
// 蛇的初識位置
Snakex[0] = 60;
Snakey[0] = 100;
Snakex[1] = 40;
Snakey[1] = 100;
// 隨機食物的初識位置
foodx = random.nextInt(39);
foody = random.nextInt(22);
foodx = foodx * 20;
foody = foody * 20 + 80;
// 初始化方向
fx = 1;
}
repaint();
timer.start();
// 左
} else if (key == KeyEvent.VK_LEFT) {
if (fx != 1) {
fx = 0;
}
// 右
} else if (key == KeyEvent.VK_RIGHT) {
if (fx != 0) {
fx = 1;
}
// 上
} else if (key == KeyEvent.VK_UP) {
if (fx != 3) {
fx = 2;
}
//下
} else if (key == KeyEvent.VK_DOWN) {
if (fx != 2) {
fx = 3;
}
}
}
// 彈起
@Override
public void keyReleased(KeyEvent e) {
}
// 點擊
@Override
public void mouseClicked(MouseEvent e) {
}
// 按下
@Override
public void mousePressed(MouseEvent e) {
}
// 擡起
@Override
public void mouseReleased(MouseEvent e) {
}
// 進入
@Override
public void mouseEntered(MouseEvent e) {
}
// 離開
@Override
public void mouseExited(MouseEvent e) {
}
}
結束語
測試的次數不多,不知道還有多少隱藏BUG,但我平常玩的時候是沒有問題的,如果你在玩的時候發現了BUG歡迎來私聊我,如果能帶着解決方法來的話那就更好了。