Java+swing實現(xiàn)經(jīng)典貪吃蛇游戲
前言
貪吃蛇(也叫做貪食蛇)游戲是一款休閑益智類游戲,有PC和手機(jī)等多平臺版本。既簡單又耐玩。該游戲通過控制蛇頭方向吃東西,從而使得蛇變得越來越長。
本程序是通過java的swing來實現(xiàn)《貪吃蛇大作戰(zhàn)》這款游戲。
主要需求
1、通過上下左右控制蛇的方向,尋找吃的東西,每吃一口就能得到一定的積分,蛇的身體會變長
2、蛇頭碰到自己的身體,則算失敗
主要設(shè)計
1、設(shè)置swing的窗體大小
2、隨機(jī)初始化蛇的位置和食物的位置,且食物不能落在蛇的身體上。
4、添加鍵盤監(jiān)聽器,監(jiān)聽上下左右的方向鍵,來控制蛇的上下左右運(yùn)動
5、蛇運(yùn)行時,頭向前走一步,增加一個頭部節(jié)點,去掉尾部節(jié)點。
6、蛇吃了一個食物后,蛇的尾部節(jié)點添加一個節(jié)點,食物消失。
7、食物每次被蛇吃掉后,要隨機(jī)再次生成一個新的食物節(jié)點。
8、有個計數(shù)器,統(tǒng)計蛇的長度和積分,吃一個食物,蛇的長度+1,積分+10
9、通過按空格開始/暫停游戲
功能截圖
代碼實現(xiàn)
啟動類
? public class StartGame { ? public static void main(String[] args) { JFrame jf=new JFrame("貪吃蛇大作戰(zhàn)"); jf.setBounds(100, 100, 905, 720); jf.setResizable(false); jf.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); jf.add(new GamePanel()); jf.setVisible(true); } ? }
游戲核心類
public class GamePanel extends JPanel implements KeyListener,ActionListener{ //蛇的數(shù)據(jù)結(jié)構(gòu) static int i=0; int length; int[] snakex=new int[600]; int[] snakey=new int[600]; String fx; boolean isStart=false; boolean isfail=false; int lx,ly;//吃食物后多出來一個的坐標(biāo) //目標(biāo)的數(shù)據(jù)結(jié)構(gòu) int foodx,foody; //隨機(jī)數(shù) Random random =new Random(); //計時器 Timer timer=new Timer(100, this); int score; public GamePanel(){ init(); //添加鍵盤監(jiān)聽器 this.addKeyListener(this); //必須設(shè)置可以獲得焦點才能監(jiān)聽到鍵盤事件 this.setFocusable(true); timer.start(); } public void init(){ score=0; length=3; snakex[0]=100;snakey[0]=100; snakex[1]=75;snakey[1]=100; snakex[2]=50;snakey[2]=100; fx="R"; foodx=25+25*random.nextInt(850/25); foody=75+25*random.nextInt(600/25); } protected void paintComponent(Graphics g) { super.paintComponent(g);//清屏,這樣不會閃爍 this.setBackground(Color.white); Data.headicno.paintIcon(this, g, 25, 11); g.setColor(new Color(104,197,107)); g.fillRect(25, 75, 850, 600); //蛇頭的繪制 if(fx.equals("U")){ Data.upicno.paintIcon(this, g, snakex[0], snakey[0]); }else if(fx.equals("D")){ Data.downicno.paintIcon(this, g, snakex[0], snakey[0]); }else if(fx.equals("L")){ Data.lefticno.paintIcon(this, g, snakex[0], snakey[0]); }else if(fx.equals("R")){ Data.righticno.paintIcon(this, g, snakex[0], snakey[0]); } //蛇身體繪制 for(int i=1;i<length;++i){ Data.bodyicno.paintIcon(this, g, snakex[i], snakey[i]); } //食物的繪制 Data.foodicon.paintIcon(this, g, foodx, foody); //暫停開始狀態(tài)的繪制 if(isStart==false){ g.setFont(new Font("微軟雅黑",Font.BOLD,40)); g.setColor(Color.WHITE); g.drawString("按空格開始/暫停游戲", 275, 350); } //失敗情況的繪制 if(isfail==true){ g.setFont(new Font("微軟雅黑",Font.BOLD,40)); g.setColor(Color.red); g.drawString("失敗!按空格重新開始", 275, 350); } //積分的繪制 g.setColor(Color.PINK); g.setFont(new Font("微軟雅黑", Font.ITALIC, 15)); g.drawString("長度: "+length, 800, 30); g.drawString("積分: "+score, 800, 55); } //實現(xiàn)鍵盤監(jiān)聽的接口方法 @Override public void keyPressed(KeyEvent e) { int keycode=e.getKeyCode(); //空格鍵暫?;蛘咧亻_ if(keycode==KeyEvent.VK_SPACE){ if(isfail==true){ System.out.println(1); init(); isfail=false; } else{ System.out.println(2); isStart=!isStart; repaint(); } } //上下左右 if(keycode==KeyEvent.VK_UP){ fx="U"; }else if(keycode==KeyEvent.VK_DOWN){ fx="D"; //System.out.println("down"); }else if(keycode==KeyEvent.VK_LEFT){ fx="L"; }else if(keycode==KeyEvent.VK_RIGHT){ fx="R"; } } @Override public void keyReleased(KeyEvent e) {} @Override public void keyTyped(KeyEvent e){} @Override public void actionPerformed(ActionEvent e) { if(isStart==true&&isfail==false){ //身體移動 lx=snakex[length-1]; ly=snakey[length-1]; for(int i=length-1;i>0;--i){ snakex[i]=snakex[i-1]; snakey[i]=snakey[i-1]; } //頭移動 if(fx=="U"){ snakey[0]-=25; if(snakey[0]<75)snakey[0]=650; }else if(fx=="D"){ snakey[0]+=25; if(snakey[0]>650)snakey[0]=75; }else if(fx=="L"){ snakex[0]-=25; if(snakex[0]<25)snakex[0]=850; }else if(fx=="R"){ snakex[0]+=25; if(snakex[0]>850)snakex[0]=25; } //失敗判定 for(int i=1;i<length;++i){ if(snakex[i]==snakex[0]&&snakey[i]==snakey[0]){ isfail=true; } } //吃食物 if(snakex[0]==foodx&&snakey[0]==foody){ length++; score+=10; snakex[length-1]=lx; snakey[length-1]=ly; foodx=25+25*random.nextInt(850/25); foody=75+25*random.nextInt(600/25); } repaint(); } } }
總結(jié)
通過此次的《貪吃蛇大作戰(zhàn)》游戲?qū)崿F(xiàn),讓我對swing的相關(guān)知識有了進(jìn)一步的了解,對java這門語言也有了比以前更深刻的認(rèn)識。
java的一些基本語法,比如數(shù)據(jù)類型、運(yùn)算符、程序流程控制和數(shù)組等,理解更加透徹。java最核心的核心就是面向?qū)ο笏枷?,對于這一個概念,終于悟到了一些。
以上就是Java+swing實現(xiàn)經(jīng)典貪吃蛇游戲的詳細(xì)內(nèi)容,更多關(guān)于Java swing貪吃蛇的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
SpringBoot中的@Conditional?注解的使用
@Conditional是Spring4新提供的注解,它的作用是按照一定的條件進(jìn)行判斷,滿足條件的才給容器注冊Bean,本文主要介紹了SpringBoot中的@Conditional?注解的使用2024-01-01jasypt SaltGenerator接口定義方法源碼解讀
這篇文章主要為大家介紹了jasypt SaltGenerator接口定義方法源碼解讀,,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-09-09手寫redis@Cacheable注解?參數(shù)java對象作為key值詳解
這篇文章主要介紹了手寫redis@Cacheable注解?參數(shù)java對象作為key值詳解,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-01-01Spring中@Value設(shè)置默認(rèn)值問題解決
本文主要介紹了Spring中@Value設(shè)置默認(rèn)值問題解決,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-07-07