Java實(shí)現(xiàn)簡(jiǎn)單的貪吃蛇游戲
本文實(shí)例為大家分享了Java實(shí)現(xiàn)簡(jiǎn)單貪吃蛇游戲的具體代碼,供大家參考,具體內(nèi)容如下
代碼
啟動(dòng)類
package snake;
import javax.swing.*;
//游戲的主啟動(dòng)類
public class StartGame {
public static void main(String[] args) {
JFrame frame = new JFrame("貪吃蛇");
frame.setBounds(10,10,900,720);
frame.setResizable(false); //窗口不可調(diào)整
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
//正常游戲界面都應(yīng)該在面板上
frame.add(new GamePanel());
frame.setVisible(true);
}
}
游戲畫(huà)板
package snake;
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;
//游戲面板
public class GamePanel extends JPanel implements KeyListener, ActionListener {
int lenth; //蛇的長(zhǎng)度
int [] snakeX = new int[600]; //定義蛇的坐標(biāo)X
int [] snakeY = new int[500]; //定義蛇的坐標(biāo)Y
String fx ;//定義方向R:右 L:左 U:上 D:下
boolean isStart = false; //游戲是否開(kāi)始
Timer timer = new Timer(120,this);//定時(shí)器
//定義一個(gè)食物
int foodx;
int foody;
Random random = new Random();
//定義死亡判斷
boolean isFail = false;//默認(rèn)不失敗
//積分系統(tǒng)
int score;
//構(gòu)造器
public GamePanel(){
init();
//獲取鍵盤(pán)的監(jiān)聽(tīng)事件
this.setFocusable(true);
this.addKeyListener(this);
timer.start();
}
//初始化
public void init(){
lenth = 3;
snakeX[0] = 100;snakeY[0] = 100;//頭部坐標(biāo)
snakeX[1] = 75;snakeY[1] = 100;//第一個(gè)身體坐標(biāo)
snakeX[2] = 50;snakeY[2] = 100;//第二個(gè)身體坐標(biāo)
fx = "R";//蛇頭初始方向
//初始化食物
foodx = 25 + 25 * random.nextInt(34);
foody = 75 + 25 * random.nextInt(24);
score = 0;
}
//繪制面板,游戲中的所以東西都使用這個(gè)東西來(lái)畫(huà)
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g); //清屏作用
//繪制靜態(tài)的面板
this.setBackground(Color.white);
Data.header.paintIcon(this,g,25,11); //放進(jìn)頭部廣告
g.fillRect(25,75,850,600); //默認(rèn)游戲界面
//畫(huà)一條靜態(tài)的小蛇
if (fx.equals("R")){
Data.right.paintIcon(this,g,snakeX[0],snakeY[0]);
}else if (fx.equals("L")){
Data.left.paintIcon(this,g,snakeX[0],snakeY[0]);
}else if (fx.equals("U")){
Data.up.paintIcon(this,g,snakeX[0],snakeY[0]);
}else if (fx.equals("D")){
Data.down.paintIcon(this,g,snakeX[0],snakeY[0]);
}
//蛇的身體長(zhǎng)度通過(guò)length來(lái)控制
for (int i = 1;i < lenth;i++){
Data.body.paintIcon(this,g,snakeX[i],snakeY[i]);
}
//畫(huà)積分
g.setColor(Color.white);
g.setFont(new Font("微軟雅黑",Font.BOLD,20));
g.drawString("長(zhǎng)度"+lenth,700,45);
g.drawString("分?jǐn)?shù)"+score,780,45);
//畫(huà)食物
Data.food.paintIcon(this,g,foodx,foody);
//游戲提示:是否開(kāi)始
if (isStart == false){
//畫(huà)一個(gè)文字String來(lái)提示開(kāi)始
g.setColor(Color.white); //定義顏色
g.setFont(new Font("微軟雅黑",Font.BOLD,40)); //設(shè)置字體
g.drawString("按下空格開(kāi)始游戲",300,300);
}
//失敗提醒
if (isFail){
//畫(huà)一個(gè)文字String來(lái)提示失敗
g.setColor(Color.RED); //定義顏色
g.setFont(new Font("微軟雅黑",Font.BOLD,40)); //設(shè)置字體
g.drawString("游戲失敗,按下空格重新開(kāi)始",200,300);
}
}
//接收鍵盤(pán)的輸入:監(jiān)聽(tīng)事件
@Override//鍵盤(pán)按下,未釋放
public void keyPressed(KeyEvent e) {
//獲取按下鍵盤(pán)的信息
int keyCode = e.getKeyCode();
if(keyCode==KeyEvent.VK_SPACE){//如果按下空格鍵
if (isFail){//游戲失敗,重新開(kāi)始
isFail = false;
init();//重新初始化游戲
}else {//暫停游戲
isStart = !isStart;
}
repaint();//刷新界面,重置
}
//鍵盤(pán)控制走向
if (keyCode==KeyEvent.VK_LEFT){
fx = "L";
}else if (keyCode==KeyEvent.VK_RIGHT){
fx = "R";
}else if (keyCode==KeyEvent.VK_UP) {
fx = "U";
}else if (keyCode==KeyEvent.VK_DOWN) {
fx = "D";
}
}
//定時(shí)器,監(jiān)聽(tīng)時(shí)間,幀,執(zhí)行定時(shí)操作
@Override
public void actionPerformed(ActionEvent e) {
//如果游戲處于開(kāi)始狀態(tài),并且游戲沒(méi)有失敗
if (isStart && isFail == false){
//右移
for (int i = lenth-1 ;i > 0;i--){ //身體向前移動(dòng)
snakeX[i] = snakeX[i-1];
snakeY[i] = snakeY[i-1];
}
//通過(guò)控制方向讓頭部移動(dòng)
if (fx.equals("R")){
snakeX[0] = snakeX[0] + 25;//頭部移動(dòng)
if (snakeX[0]>850){ snakeX[0] = 25; }//右邊界判斷
}else if (fx.equals("L")){
snakeX[0] =snakeX[0] - 25;//頭部移動(dòng)
if (snakeX[0]<25){ snakeX[0] = 850;}//左邊界判斷
}else if (fx.equals("U")){
snakeY[0] =snakeY[0] - 25;//頭部移動(dòng)
if (snakeY[0]<75){ snakeY[0] = 650;}//上邊界判斷
}else if (fx.equals("D")){
snakeY[0] =snakeY[0] + 25;//頭部移動(dòng)
if (snakeY[0]>650){ snakeY[0] = 75;}//下邊界判斷
}
//如果食物和蛇頭坐標(biāo)重合
if (snakeX[0]==foodx && snakeY[0]==foody){
lenth ++;//蛇的身體長(zhǎng)度加一
score = score + 10;
//重新生成食物
foodx = 25 +25 * random.nextInt(34);
foody = 75 +25 * random.nextInt(24);
}
//結(jié)束判斷
for (int i = 1; i<lenth;i++){
if (snakeX[0]==snakeX[i] && snakeY[0]==snakeY[i]){
isFail = true;
}
}
repaint();//刷新界面
}
timer.start();//讓時(shí)間動(dòng)起來(lái)
}
@Override//鍵盤(pán)按下,彈起
public void keyTyped(KeyEvent e) {
}
@Override//釋放某個(gè)鍵
public void keyReleased(KeyEvent e) {
}
}
游戲數(shù)據(jù)(存放圖片)
package snake;
import javax.swing.*;
import java.net.URL;
//數(shù)據(jù)中心
public class Data {
//相對(duì)路徑 tx.jpg 絕對(duì)路徑 /相當(dāng)于當(dāng)前的項(xiàng)目
//頭部圖片 URL 定位圖片地址
public static URL headerURL = Data.class.getResource("/statics/header.png");
public static ImageIcon header = new ImageIcon(headerURL);
//上下左右移動(dòng)
public static URL upUrl = Data.class.getResource("/statics/up.png");
public static ImageIcon up = new ImageIcon(upUrl);
public static URL downUrl = Data.class.getResource("/statics/down.png");
public static ImageIcon down = new ImageIcon(downUrl);
public static URL leftUrl = Data.class.getResource("/statics/left.png");
public static ImageIcon left = new ImageIcon(leftUrl);
public static URL rightUrl = Data.class.getResource("/statics/right.png");
public static ImageIcon right = new ImageIcon(rightUrl);
//身體
public static URL bodyUrl = Data.class.getResource("/statics/body.png");
public static ImageIcon body = new ImageIcon(bodyUrl);
//食物
public static URL foodUrl = Data.class.getResource("/statics/food.png");
public static ImageIcon food = new ImageIcon(foodUrl);
}
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Java鏈接redis_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
這篇文章主要介紹了Java鏈接redis,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-08-08
SpringAOP中基于注解實(shí)現(xiàn)通用日志打印方法詳解
這篇文章主要介紹了SpringAOP中基于注解實(shí)現(xiàn)通用日志打印方法詳解,在日常開(kāi)發(fā)中,項(xiàng)目里日志是必不可少的,一般有業(yè)務(wù)日志,數(shù)據(jù)庫(kù)日志,異常日志等,主要用于幫助程序猿后期排查一些生產(chǎn)中的bug,需要的朋友可以參考下2023-12-12
淺談Java中SimpleDateFormat 多線程不安全原因
SimpleDateFormat是Java中用于日期時(shí)間格式化的一個(gè)類,本文主要介紹了淺談Java中SimpleDateFormat 多線程不安全原因,感興趣的可以了解一下2024-01-01
springboot 配置DRUID數(shù)據(jù)源的方法實(shí)例分析
這篇文章主要介紹了springboot 配置DRUID數(shù)據(jù)源的方法,結(jié)合實(shí)例形式分析了springboot 配置阿里DRUID數(shù)據(jù)源的具體步驟與相關(guān)操作技巧,需要的朋友可以參考下2019-12-12
實(shí)例講解Java并發(fā)編程之ThreadLocal類
這篇文章主要介紹了實(shí)例講解Java并發(fā)編程之ThreadLocal類,本文給出了模擬ThreadLocal、實(shí)用ThreadLocal等代碼實(shí)例,需要的朋友可以參考下2015-04-04
mybatis如何根據(jù)表逆向自動(dòng)化生成代碼實(shí)例
逆向工程是一個(gè)專門(mén)為 MyBatis 框架使用者設(shè)計(jì)的代碼生成器,可以根據(jù)數(shù)據(jù)庫(kù)中的表字段名,自動(dòng)生成 POJO 類,mapper 接口與 SQL 映射文件,這篇文章主要給大家介紹了關(guān)于mybatis如何根據(jù)表逆向自動(dòng)化生成代碼的相關(guān)資料,需要的朋友可以參考下2021-08-08
Java避免死鎖_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
在有些情況下死鎖是可以避免的。本文將展示三種用于避免死鎖的技術(shù)。對(duì)java避免死鎖的相關(guān)知識(shí)感興趣的朋友一起通過(guò)本文學(xué)習(xí)吧2017-06-06

