java使用GUI實(shí)現(xiàn)貪吃蛇游戲
本文實(shí)例為大家分享了java使用GUI實(shí)現(xiàn)貪吃蛇游戲的具體代碼,供大家參考,具體內(nèi)容如下
整個(gè)代碼分為三部分
1.游戲開(kāi)始界面
2.data基本圖片的添加
3.面板,將小蛇畫(huà)到面板上
這是游戲完整界面
1. 游戲開(kāi)始界面
public class StartGame { ? ? public static void main(String[] args) { ? ? ? ? JFrame frame = new JFrame(); ? ? ? ? frame.setBounds(10,10,900,720); ? ? ? ? frame.setResizable(false); ? ? ? ? frame.add(new GamePanel()); ? ? ? ? frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); ? ? ? ? frame.setVisible(true); ? ? } }
2.data數(shù)據(jù)
public class Data { ? ? private static URL headerURL=Data.class.getResource("statics/header.png"); ? ? public static ImageIcon header=new ImageIcon(headerURL); ? ? private static URL upURL=Data.class.getResource("statics/up.png"); ? ? private static URL downURL=Data.class.getResource("statics/down.png"); ? ? private static URL leftURL=Data.class.getResource("statics/left.png"); ? ? private static URL rightURL=Data.class.getResource("statics/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); ? ? private static URL bodyURL=Data.class.getResource("statics/body.png"); ? ? public static ImageIcon body=new ImageIcon(bodyURL); ? ? private static URL foodURL=Data.class.getResource("statics/food.png"); ? ? public static ImageIcon food=new ImageIcon(foodURL); }
3.面板繪制
public class GamePanel extends JPanel ?implements KeyListener, ActionListener { ? ? int length; ? ? int [] snakeX=new int[600]; ? ? int [] snakeY=new int[500]; ? ? String fx; ? ? int foodx; ? ? int foody; ? ? Random random=new Random(); ? ? int score; ? ? boolean isStart=false; ? ? boolean isFail=false; ? ? Timer timer=new Timer(75,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; ? ? ? ? fx ="R"; ? ? ? ? foodx=25+25*random.nextInt(34); ? ? ? ? foody=75+25*random.nextInt(24); ? ? ? ? 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("長(zhǎng)度"+length,750,30); ? ? ? ? g.drawString("分?jǐn)?shù)"+score,750,50); ? ? ? ? Data.food.paintIcon(this,g,foodx,foody); ? ? ? ? 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]); ? ? ? ? } ? ? ? ? //Data.right.paintIcon(this,g,snakeX[0],snakeY[0]); ? ? ? ? for (int i = 1; i < length; i++) { ? ? ? ? ? ? Data.body.paintIcon(this,g,snakeX[i],snakeY[i]); ? ? ? ? } ? ? ? ? if(isStart==false){ ? ? ? ? ? ? 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("人生不能重來(lái),請(qǐng)走好每一步",150,350); ? ? ? ? } ? ? } ? ? @Override ? ? public void keyPressed(KeyEvent e) { ? ? ? ? int keyCode = e.getKeyCode(); ? ? ? ? if(keyCode == KeyEvent.VK_SPACE){ ? ? ? ? ? ? if(isFail){ ? ? ? ? ? ? ? ? isFail=false; ? ? ? ? ? ? ? ? init(); ? ? ? ? ? ? }else{ ? ? ? ? ? ? ? ? isStart=!isStart; ? ? ? ? ? ? } ? ? ? ? ? ? repaint(); ? ? ? ? } ? ? ? ? if(keyCode==KeyEvent.VK_UP){ ? ? ? ? ? ? fx="U"; ? ? ? ? }else ?if(keyCode==KeyEvent.VK_DOWN){ ? ? ? ? ? ? fx="D"; ? ? ? ? }else ?if(keyCode==KeyEvent.VK_LEFT){ ? ? ? ? ? ? fx="L"; ? ? ? ? }else ?if(keyCode==KeyEvent.VK_RIGHT){ ? ? ? ? ? ? fx="R"; ? ? ? ? } ? ? } ? ? @Override ? ? public void actionPerformed(ActionEvent e) { ? ? ? ? if(isStart&&isFail==false){ ? ? ? ? ? ? if(foodx==snakeX[0]&&foody==snakeY[0]){ ? ? ? ? ? ? ? ? length++; ? ? ? ? ? ? ? ? score+=10; ? ? ? ? ? ? ? ? foodx=25+25*random.nextInt(34); ? ? ? ? ? ? ? ? foody=75+25*random.nextInt(24); ? ? ? ? ? ? } ? ? ? ? ? ? for (int i = length-1; i >0 ; i--) { ? ? ? ? ? ? ? ? ?snakeX[i]=snakeX[i-1]; ? ? ? ? ? ? ? ? ?snakeY[i]=snakeY[i-1]; ? ? ? ? ? ? } ? ? ? ? ? ? if(fx.equals("R")){ ? ? ? ? ? ? ? ? snakeX[0] =snakeX[0]+25; ? ? ? ? ? ? ? ? if(snakeX[0]>850){ snakeX[0]=25; } ? ? ? ? ? ? }else if(fx.equals("L")){ ? ? ? ? ? ? ? ? snakeX[0] =snakeX[0]-25; ? ? ? ? ? ? ? ? if(snakeX[0]<25){ snakeX[0]=850; } ? ? ? ? ? ? }else if(fx.equals("U")){ ? ? ? ? ? ? ? ? snakeY[0]=snakeY[0]-25; ? ? ? ? ? ? ? ? if(snakeY[0]<75){snakeY[0]=650;} ? ? ? ? ? ? }else if(fx.equals("D")){ ? ? ? ? ? ? ? ? snakeY[0]=snakeY[0]+25; ? ? ? ? ? ? ? ? if(snakeY[0]>650){snakeY[0]=75;} ? ? ? ? ? ? } ? ? ? ? ? ? for (int i = 1; i < length; i++) { ? ? ? ? ? ? ? ? if(snakeY[0]==snakeY[i]&&snakeX[0]==snakeX[i]){ ? ? ? ? ? ? ? ? ? ? isFail=true; ? ? ? ? ? ? ? ? } ? ? ? ? ? ? } ? ? ? ? ? ? repaint(); ? ? ? ? } ? ? ? ? timer.start(); ? ? } ? ? @Override ? ? public void keyTyped(KeyEvent e) { ? ? } ? ? @Override ? ? public void keyReleased(KeyEvent e) { ? ? } }
小蛇的各個(gè)部位參數(shù)如下
頭部尺寸
身體尺寸
食物尺寸
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
java中實(shí)現(xiàn)視頻處理以及播放功能代碼詳解
這篇文章主要給大家介紹了關(guān)于java中實(shí)現(xiàn)視頻處理以及播放功能的相關(guān)資料,最近要實(shí)現(xiàn)一套音視頻播放程序,所以這里給大家總結(jié)下,需要的朋友可以參考下2023-09-09Java 如何解析key為動(dòng)態(tài)的json操作
這篇文章主要介紹了Java 如何解析key為動(dòng)態(tài)的json操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-02-02JAVA Iterator接口與增強(qiáng)for循環(huán)的實(shí)現(xiàn)
這篇文章主要介紹了JAVA Iterator接口與增強(qiáng)for循環(huán)的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-11-11SpringBoot實(shí)現(xiàn)Md5對(duì)數(shù)據(jù)庫(kù)數(shù)據(jù)加密的示例
本文主要介紹了SpringBoot實(shí)現(xiàn)Md5對(duì)數(shù)據(jù)庫(kù)數(shù)據(jù)加密的示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-04-04Java動(dòng)態(tài)代理四種實(shí)現(xiàn)方式詳解
這篇文章主要介紹了Java四種動(dòng)態(tài)代理實(shí)現(xiàn)方式,對(duì)于開(kāi)始學(xué)習(xí)java動(dòng)態(tài)代理或者要復(fù)習(xí)java動(dòng)態(tài)代理的朋友來(lái)講很有參考價(jià)值,有感興趣的朋友可以參考一下2021-04-04Java中使用BeanMap將對(duì)象轉(zhuǎn)為Map詳解
這篇文章主要介紹了Java中使用BeanMap將對(duì)象轉(zhuǎn)為Map詳解,BeanMap?是?Apache?Commons?BeanUtils?庫(kù)中的一個(gè)類(lèi),BeanMap?可以將?Java?對(duì)象的屬性作為鍵,屬性值作為對(duì)應(yīng)的值,存儲(chǔ)在一個(gè)?Map?中,它提供了一種將?Java?對(duì)象轉(zhuǎn)換為?Map?的方式,需要的朋友可以參考下2024-01-01Idea為java程序添加啟動(dòng)參數(shù)(含:VM?options、Program?arguments、Environme
設(shè)置啟動(dòng)參數(shù)的意義就是當(dāng)啟動(dòng)程序時(shí),程序會(huì)優(yōu)先讀取idea的配置參數(shù),這樣就可以不用修改配置文件,下面這篇文章主要給大家介紹了關(guān)于Idea為java程序添加啟動(dòng)參數(shù)(含:VM?options、Program?arguments、Environment?variable)的相關(guān)資料,需要的朋友可以參考下2022-12-12