生活随笔
收集整理的這篇文章主要介紹了
Java GUI 贪吃蛇小游戏项目实战含图片资源
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
項目實戰(zhàn) - 貪吃蛇
圖片資源提取地址
百度網(wǎng)盤
鏈接:https://pan.baidu.com/s/19gEhIuZrut12l5a8jcknFA?pwd=1111
提取碼:1111
界面繪制
這里設(shè)計到幀的概念,即一秒鐘里有多少張圖片,一般電影為24幀,每一幀就是一張圖片
涉及到鍵盤監(jiān)聽,以及計時器每隔一段時間進行頁面刷新
先繪制靜態(tài)頁面
![[Pasted image 20220604102255.png]]
游戲整體界面
游戲啟動類
代碼
public class StartGame { public static void main(String[] args
) { JFrame frame
= new JFrame("貪吃蛇"); frame
.add(new GamePanel()); frame
.setResizable(false);frame
.setBounds(200,200,905,720); frame
.setVisible(true); frame
.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE
); }
}
游戲面板類
代碼
public class GamePanel extends JPanel { @Override protected void paintComponent(Graphics g
) { super.paintComponent(g
);this.setBackground(Color.BLACK
); this.setBackground(Color.WHITE
); Data.header
.paintIcon(this,g
,25,11); g
.fillRect(25,75,850,600); }
}
數(shù)據(jù)中心
代碼
public class Data { public static URL headerURL
= Data.class.getResource("static/header.png"); public static ImageIcon header
= new ImageIcon(headerURL
); public static URL upURL
= Data.class.getResource("static/up.png"); public static URL downURL
= Data.class.getResource("static/down.png"); public static URL leftURL
= Data.class.getResource("static/left.png"); public static URL rightURL
= Data.class.getResource("static/right.png"); public static ImageIcon up
= new ImageIcon(upURL
); public static ImageIcon down
= new ImageIcon(downURL
); public static ImageIcon left
= new ImageIcon(leftURL
); public static ImageIcon right
= new ImageIcon(rightURL
); public static URL bodyURL
= Data.class.getResource("static/body.png"); public static ImageIcon body
= new ImageIcon(bodyURL
); public static URL foodURL
= Data.class.getResource("static/food.png"); public static ImageIcon food
= new ImageIcon(foodURL
); }
運行時可能會報錯ClassNotFound
首先檢查Data類中的url是否寫對重啟Idea,再次啟動即可
最后的效果
截圖
繪制靜態(tài)小蛇
游戲啟動類
代碼
public class StartGame { public static void main(String[] args
) { JFrame frame
= new JFrame("貪吃蛇"); frame
.add(new GamePanel()); frame
.setResizable(false);frame
.setBounds(200,200,905,720); frame
.setVisible(true); frame
.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE
); }
}
游戲面板類
代碼
public class GamePanel extends JPanel { int length
;int[] snakeX
= new int[850];int[] snakeY
= new int[850];String dir
;boolean isStart
= false; public GamePanel(){ init(); } public void init(){ length
= 3; snakeX
[0] = 100;snakeY
[0] = 100;snakeX
[1] = 75;snakeY
[1] = 100; snakeX
[2] = 50;snakeY
[2] = 100; dir
= "R"; } @Override protected void paintComponent(Graphics g
) { super.paintComponent(g
);this.setBackground(Color.WHITE
); Data.header
.paintIcon(this,g
,25,11); g
.fillRect(25,75,850,600); switch (dir
) { case "R": Data.right
.paintIcon(this, g
, snakeX
[0], snakeY
[0]); break; case "L": Data.left
.paintIcon(this, g
, snakeX
[0], snakeY
[0]); break; case "U": Data.up
.paintIcon(this, g
, snakeX
[0], snakeY
[0]); break; case "D": Data.down
.paintIcon(this, g
, snakeX
[0], snakeY
[0]); break; } for (int i
= 1; i
< length
; i
++) { Data.body
.paintIcon(this,g
,snakeX
[i
],snakeY
[i
]); } if (!isStart
) { g
.setColor(Color.white
); g
.setFont(new Font("微軟雅黑",Font.BOLD
,40)); g
.drawString("按下空格開始游戲",300,300); } }
}
讓小蛇動起來
實現(xiàn)按下空格游戲開始游戲暫停
游戲面板類
代碼
public class GamePanel extends JPanel implements KeyListener { int length
;int[] snakeX
= new int[850];int[] snakeY
= new int[850];String dir
;boolean isStart
= false; public GamePanel(){ init(); this.setFocusable(true); this.addKeyListener(this); } public void init(){ length
= 3; snakeX
[0] = 100;snakeY
[0] = 100;snakeX
[1] = 75;snakeY
[1] = 100; snakeX
[2] = 50;snakeY
[2] = 100; dir
= "R"; } @Override protected void paintComponent(Graphics g
) { super.paintComponent(g
);this.setBackground(Color.WHITE
); Data.header
.paintIcon(this,g
,25,11); g
.fillRect(25,75,850,600); switch (dir
) { case "R": Data.right
.paintIcon(this, g
, snakeX
[0], snakeY
[0]); break; case "L": Data.left
.paintIcon(this, g
, snakeX
[0], snakeY
[0]); break; case "U": Data.up
.paintIcon(this, g
, snakeX
[0], snakeY
[0]); break; case "D": Data.down
.paintIcon(this, g
, snakeX
[0], snakeY
[0]); break; } for (int i
= 1; i
< length
; i
++) { Data.body
.paintIcon(this,g
,snakeX
[i
],snakeY
[i
]); } if (!isStart
) { g
.setColor(Color.white
); g
.setFont(new Font("微軟雅黑",Font.BOLD
,40)); g
.drawString("按下空格開始游戲",300,300); } } @Override public void keyPressed(KeyEvent e
) { int keyCode
= e
.getKeyCode(); if (keyCode
== KeyEvent.VK_SPACE
) { isStart
= !isStart
; repaint(); } } @Override public void keyTyped(KeyEvent e
) { } @Override public void keyReleased(KeyEvent e
) { }
}
鍵盤控制小蛇移動
游戲面板類
代碼
public class GamePanel extends JPanel implements KeyListener, ActionListener { int length
;int[] snakeX
= new int[850];int[] snakeY
= new int[850];String dir
;boolean isStart
= false; Timer timer
= new Timer(100,this);public GamePanel(){ init(); this.setFocusable(true); this.addKeyListener(this); } public void init(){ length
= 3; snakeX
[0] = 100;snakeY
[0] = 100;snakeX
[1] = 75;snakeY
[1] = 100; snakeX
[2] = 50;snakeY
[2] = 100; dir
= "R"; timer
.start(); } @Override protected void paintComponent(Graphics g
) { super.paintComponent(g
);this.setBackground(Color.WHITE
); Data.header
.paintIcon(this,g
,25,11); g
.fillRect(25,75,850,600); switch (dir
) { case "R": Data.right
.paintIcon(this, g
, snakeX
[0], snakeY
[0]); break; case "L": Data.left
.paintIcon(this, g
, snakeX
[0], snakeY
[0]); break; case "U": Data.up
.paintIcon(this, g
, snakeX
[0], snakeY
[0]); break; case "D": Data.down
.paintIcon(this, g
, snakeX
[0], snakeY
[0]); break; } for (int i
= 1; i
< length
; i
++) { Data.body
.paintIcon(this,g
,snakeX
[i
],snakeY
[i
]); } if (!isStart
) { g
.setColor(Color.white
); g
.setFont(new Font("微軟雅黑",Font.BOLD
,40)); g
.drawString("按下空格開始游戲",300,300); } } @Override public void keyPressed(KeyEvent e
) { int keyCode
= e
.getKeyCode(); if (keyCode
== KeyEvent.VK_SPACE
) { isStart
= !isStart
; repaint(); } switch (keyCode
) { case KeyEvent.VK_UP
: dir
= "U"; break; case KeyEvent.VK_DOWN
: dir
= "D"; break; case KeyEvent.VK_LEFT
: dir
= "L"; break; case KeyEvent.VK_RIGHT
: dir
= "R"; break; } } @Override public void keyTyped(KeyEvent e
) { } @Override public void keyReleased(KeyEvent e
) { } @Override public void actionPerformed(ActionEvent e
) { if (isStart
) { for (int i
= length
- 1; i
> 0; i
--) { snakeX
[i
] = snakeX
[i
-1]; snakeY
[i
] = snakeY
[i
-1]; } switch (dir
) { case "U": snakeY
[0] = snakeY
[0] - 25; break; case "D": snakeY
[0] = snakeY
[0] + 25; break; case "L": snakeX
[0] = snakeX
[0] - 25; break; case "R": snakeX
[0] = snakeX
[0] + 25; break; } if(snakeX
[0] > 850) snakeX
[0] = 25; if(snakeX
[0] < 25) snakeX
[0] = 850; if(snakeY
[0] > 650) snakeY
[0] = 75; if(snakeY
[0] < 75) snakeY
[0] = 650; repaint();} timer
.start(); }
}
小蛇吃食物長大、失敗判定及積分系統(tǒng)
游戲面板類
代碼
public class GamePanel extends JPanel implements KeyListener, ActionListener { int length
;int[] snakeX
= new int[850];int[] snakeY
= new int[850];String dir
;int foodX
; int foodY
; Random random
= new Random(); int score
; boolean isStart
= false; boolean isFail
= false; Timer timer
= new Timer(100,this);public GamePanel(){ init(); this.setFocusable(true); this.addKeyListener(this); timer
.start(); } public void init(){ length
= 3; snakeX
[0] = 100;snakeY
[0] = 100;snakeX
[1] = 75;snakeY
[1] = 100; snakeX
[2] = 50;snakeY
[2] = 100; dir
= "R"; foodX
= 25 + 25*random
.nextInt(33); foodY
= 75 + 25*random
.nextInt(23); score
= 0; } @Override protected void paintComponent(Graphics g
) { super.paintComponent(g
);this.setBackground(Color.WHITE
); Data.header
.paintIcon(this,g
,25,11); g
.fillRect(25,75,850,600); g
.setColor(Color.white
); g
.setFont(new Font("微軟雅黑",Font.BOLD
,18)); g
.drawString("長度"+length
,750,35); g
.drawString("分數(shù)"+score
,750,50); Data.food
.paintIcon(this,g
,foodX
,foodY
); switch (dir
) { case "R": Data.right
.paintIcon(this, g
, snakeX
[0], snakeY
[0]); break; case "L": Data.left
.paintIcon(this, g
, snakeX
[0], snakeY
[0]); break; case "U": Data.up
.paintIcon(this, g
, snakeX
[0], snakeY
[0]); break; case "D": Data.down
.paintIcon(this, g
, snakeX
[0], snakeY
[0]); break; } for (int i
= 1; i
< length
; i
++) { Data.body
.paintIcon(this,g
,snakeX
[i
],snakeY
[i
]); } if (!isStart
) { g
.setColor(Color.white
); g
.setFont(new Font("微軟雅黑",Font.BOLD
,40)); g
.drawString("按下空格開始游戲",300,300); } if (isFail
) { g
.setColor(Color.red
); g
.setFont(new Font("微軟雅黑",Font.BOLD
,40)); g
.drawString("失敗,按下空格重新開始游戲",200,300); } } @Override public void keyPressed(KeyEvent e
) { int keyCode
= e
.getKeyCode(); if (keyCode
== KeyEvent.VK_SPACE
) { if (isFail
) { isFail
= false; init(); } else{ isStart
= !isStart
; } repaint(); } switch (keyCode
) { case KeyEvent.VK_UP
: dir
= "U"; break; case KeyEvent.VK_DOWN
: dir
= "D"; break; case KeyEvent.VK_LEFT
: dir
= "L"; break; case KeyEvent.VK_RIGHT
: dir
= "R"; break; } } @Override public void keyTyped(KeyEvent e
) { } @Override public void keyReleased(KeyEvent e
) { } @Override public void actionPerformed(ActionEvent e
) { if (isStart
&& !isFail
) { if(snakeX
[0] == foodX
&& snakeY
[0] == foodY
) { length
++; score
+=10; foodX
= 25 + 25*random
.nextInt(33); foodY
= 75 + 25*random
.nextInt(23); } for (int i
= length
- 1; i
> 0; i
--) { snakeX
[i
] = snakeX
[i
-1]; snakeY
[i
] = snakeY
[i
-1]; } switch (dir
) { case "U": snakeY
[0] = snakeY
[0] - 25; break; case "D": snakeY
[0] = snakeY
[0] + 25; break; case "L": snakeX
[0] = snakeX
[0] - 25; break; case "R": snakeX
[0] = snakeX
[0] + 25; break; } if(snakeX
[0] > 850) snakeX
[0] = 25; if(snakeX
[0] < 25) snakeX
[0] = 850; if(snakeY
[0] > 650) snakeY
[0] = 75; if(snakeY
[0] < 75) snakeY
[0] = 650; for (int i
= 1; i
< length
; i
++) { if (snakeX
[0] == snakeX
[i
] && snakeY
[0] == snakeY
[i
]) isFail
= true; } repaint();} timer
.start(); }
}
此時,游戲啟動后便可以正常運行,基礎(chǔ)功能已經(jīng)實現(xiàn)
總結(jié)
以上是生活随笔為你收集整理的Java GUI 贪吃蛇小游戏项目实战含图片资源的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。