年末啦,小編首先祝各位程序員新年快樂!真的是應了那句話:過了12歲之後,那歲數可就是不按規律的蹭蹭的往上漲啊,就在今年2018年,最後一批90後也步入了18歲的成人禮。正式宣布90後退出青年市場,00後統治世界~我們也即將是老去的一代。

小編偶然想到童年玩過的那些經典遊戲,在當下吃雞,擼啊擼風靡的時代,那些小遊戲漸漸被人遺忘,現在回想起來,當時那些遊戲還是很好玩的呢,各位看官覺得呢?所以小編自己動手寫出了貪吃蛇遊戲的java代碼,又重溫了一下,彷彿又回到了童年時代。下面給大家介紹一下代碼的邏輯和具體的代碼是什麼:
1.邏輯判斷
要點分析:
1)數據結構:matrix[][]用來存儲地圖上面的信息,如果什麼也沒有設置為false,
如果有食物或蛇,設置為true;nodeArray,一個LinkedList,用來保存蛇的每
一節;food用來保存食物的位置;而Node類是保存每個位置的信息。
2)重要函數:
changeDirection(int newDirection) ,用來改變蛇前進的方向,而且只是
保存頭部的前進方向,因為其他的前進方向已經用位置來指明了。 其中newDirection
必須和原來的direction不是相反方向,所以相反方向的值用了同樣的奇偶性。在測試
的時候使用了direction%2!=newDirection%2 進行判斷。
moveOn(),用來更新蛇的位置,對於當前方向,把頭部位置進行相應改變。如果越界,
結束;否則,檢測是否遇到食物(加頭部)或身體(結束);如果什麼都沒有,加上頭部,
去掉尾部。由於用了LinkedList數據結構,省去了相當多的麻煩。

2.具體代碼
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);
}
}
代碼量有點大,小夥伴們可以複製到eclipse中運行就可以了。
在最後呢,祝各位小夥伴永遠18歲,新年快樂~謝謝觀看~
原創文章,作者:投稿專員,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/252353.html