最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java+swing實(shí)現(xiàn)經(jīng)典貪吃蛇游戲

 更新時(shí)間:2022年01月27日 10:08:51   作者:小虛竹and掘金  
貪吃蛇(也叫做貪食蛇)游戲是一款休閑益智類游戲,有PC和手機(jī)等多平臺(tái)版本。既簡(jiǎn)單又耐玩。本文將通過java的swing來(lái)實(shí)現(xiàn)這一游戲,需要的可以參考一下

前言

貪吃蛇(也叫做貪食蛇)游戲是一款休閑益智類游戲,有PC和手機(jī)等多平臺(tái)版本。既簡(jiǎn)單又耐玩。該游戲通過控制蛇頭方向吃東西,從而使得蛇變得越來(lái)越長(zhǎng)。

本程序是通過java的swing來(lái)實(shí)現(xiàn)《貪吃蛇大作戰(zhàn)》這款游戲。

主要需求

1、通過上下左右控制蛇的方向,尋找吃的東西,每吃一口就能得到一定的積分,蛇的身體會(huì)變長(zhǎng)

2、蛇頭碰到自己的身體,則算失敗

主要設(shè)計(jì)

1、設(shè)置swing的窗體大小

2、隨機(jī)初始化蛇的位置和食物的位置,且食物不能落在蛇的身體上。

4、添加鍵盤監(jiān)聽器,監(jiān)聽上下左右的方向鍵,來(lái)控制蛇的上下左右運(yùn)動(dòng)

5、蛇運(yùn)行時(shí),頭向前走一步,增加一個(gè)頭部節(jié)點(diǎn),去掉尾部節(jié)點(diǎn)。

6、蛇吃了一個(gè)食物后,蛇的尾部節(jié)點(diǎn)添加一個(gè)節(jié)點(diǎn),食物消失。

7、食物每次被蛇吃掉后,要隨機(jī)再次生成一個(gè)新的食物節(jié)點(diǎn)。

8、有個(gè)計(jì)數(shù)器,統(tǒng)計(jì)蛇的長(zhǎng)度和積分,吃一個(gè)食物,蛇的長(zhǎng)度+1,積分+10

9、通過按空格開始/暫停游戲

功能截圖

代碼實(shí)現(xiàn)

啟動(dòng)類

?
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;//吃食物后多出來(lái)一個(gè)的坐標(biāo)
	//目標(biāo)的數(shù)據(jù)結(jié)構(gòu)
	int foodx,foody;
	//隨機(jī)數(shù)
	Random random =new Random();
	//計(jì)時(shí)器
	Timer timer=new Timer(100, this);
	
	int score;
	
	public GamePanel(){
		init();
		//添加鍵盤監(jiān)聽器
		this.addKeyListener(this);
		//必須設(shè)置可以獲得焦點(diǎn)才能監(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);//清屏,這樣不會(huì)閃爍
		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("長(zhǎng)度: "+length, 800, 30);
		g.drawString("積分: "+score, 800, 55);
	}
	//實(shí)現(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){
			
			//身體移動(dòng)
			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];
			}
			//頭移動(dòng)
			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),讓我對(duì)swing的相關(guān)知識(shí)有了進(jìn)一步的了解,對(duì)java這門語(yǔ)言也有了比以前更深刻的認(rèn)識(shí)。

java的一些基本語(yǔ)法,比如數(shù)據(jù)類型、運(yùn)算符、程序流程控制和數(shù)組等,理解更加透徹。java最核心的核心就是面向?qū)ο笏枷?,?duì)于這一個(gè)概念,終于悟到了一些。

以上就是Java+swing實(shí)現(xiàn)經(jīng)典貪吃蛇游戲的詳細(xì)內(nèi)容,更多關(guān)于Java swing貪吃蛇的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 手?jǐn)]一個(gè) spring-boot-starter的全過程

    手?jǐn)]一個(gè) spring-boot-starter的全過程

    這篇文章主要介紹了手?jǐn)]一個(gè) spring-boot-starter的全過程,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-01-01
  • Dubbo服務(wù)校驗(yàn)參數(shù)的解決方案

    Dubbo服務(wù)校驗(yàn)參數(shù)的解決方案

    這篇文章主要介紹了Dubbo服務(wù)如何優(yōu)雅的校驗(yàn)參數(shù),Dubbo框架本身是支持參數(shù)校驗(yàn)的,同時(shí)也是基于JSR303去實(shí)現(xiàn)的,今天通過示例代碼介紹下詳細(xì)實(shí)現(xiàn)過程,需要的朋友可以參考下
    2022-03-03
  • List集合對(duì)象中按照不同屬性大小排序的實(shí)例

    List集合對(duì)象中按照不同屬性大小排序的實(shí)例

    下面小編就為大家?guī)?lái)一篇List集合對(duì)象中按照不同屬性大小排序的實(shí)例。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來(lái)看看吧
    2017-03-03
  • Collection stream使用示例詳解

    Collection stream使用示例詳解

    這篇文章主要介紹了Collection stream使用示例,stream流幾乎可以完成對(duì)集合的任意操作,映射、去重、分組、排序、過濾等
    2022-12-12
  • SpringCloudAlibaba Nacos開啟鑒權(quán)解決跳過登錄頁(yè)面問題

    SpringCloudAlibaba Nacos開啟鑒權(quán)解決跳過登錄頁(yè)面問題

    對(duì)于Nacos,如果需要開啟權(quán)限控制,可以在 Nacos 控制臺(tái)上進(jìn)行配置,本文主要介紹了SpringCloudAlibaba Nacos開啟鑒權(quán)解決跳過登錄頁(yè)面問題,感興趣的可以了解一下
    2023-10-10
  • linux部署出現(xiàn)java文件操作報(bào)錯(cuò):java.io.FileNotFoundException解決辦法

    linux部署出現(xiàn)java文件操作報(bào)錯(cuò):java.io.FileNotFoundException解決辦法

    這篇文章主要g介紹了linux部署出現(xiàn)java文件操作報(bào)錯(cuò):java.io.FileNotFoundException解決的相關(guān)資料,這個(gè)錯(cuò)誤通常表示你的Spring Boot應(yīng)用程序無(wú)法找到指定的文本文件,需要的朋友可以參考下
    2023-12-12
  • Java基礎(chǔ)之類型封裝器示例

    Java基礎(chǔ)之類型封裝器示例

    這篇文章主要介紹了Java基礎(chǔ)之類型封裝器,結(jié)合實(shí)例形式分析了java類型封裝相關(guān)原理與操作技巧,需要的朋友可以參考下
    2019-08-08
  • Spring中的@ComponentScan注解使用詳解

    Spring中的@ComponentScan注解使用詳解

    這篇文章主要介紹了Spring中的@ComponentScan注解使用詳解,@ComponentScan 注解的作用就是根據(jù)指定的掃描路徑,把路徑中符合掃描規(guī)則的類裝配到 Spring 容器中,需要的朋友可以參考下
    2024-01-01
  • 使用Java實(shí)現(xiàn)百萬(wàn)Excel數(shù)據(jù)導(dǎo)出

    使用Java實(shí)現(xiàn)百萬(wàn)Excel數(shù)據(jù)導(dǎo)出

    這篇文章主要為大家詳細(xì)介紹了如何使用Java實(shí)現(xiàn)百萬(wàn)Excel數(shù)據(jù)導(dǎo)出,文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,有需要的小伙伴可以參考一下
    2024-03-03
  • Web三大組件之Filter,Listener和Servlet詳解

    Web三大組件之Filter,Listener和Servlet詳解

    這篇文章主要為大家詳細(xì)介紹了Web三大組件之Filter,Listener和Servlet,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助
    2022-03-03

最新評(píng)論

南雄市| 确山县| 石城县| 广元市| 楚雄市| 黄陵县| 保康县| 吉安市| 孝感市| 长宁区| 东丰县| 桐庐县| 桐乡市| 乌海市| 迭部县| 邵武市| 泗洪县| 沐川县| 铜鼓县| 抚松县| 大连市| 新郑市| 昌图县| 洞口县| 河西区| 南召县| 宜兴市| 合肥市| 南开区| 宁武县| 永安市| 宝应县| 金华市| 禄劝| 南昌县| 来宾市| 乌拉特前旗| 基隆市| 平定县| 湾仔区| 西昌市|