欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

前言

貪吃蛇(也叫做貪食蛇)游戲是一款休閑益智類游戲,有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?注解的使用

    SpringBoot中的@Conditional?注解的使用

    @Conditional是Spring4新提供的注解,它的作用是按照一定的條件進(jìn)行判斷,滿足條件的才給容器注冊Bean,本文主要介紹了SpringBoot中的@Conditional?注解的使用
    2024-01-01
  • 解決JavaMail附件名字過長導(dǎo)致的亂碼問題

    解決JavaMail附件名字過長導(dǎo)致的亂碼問題

    這篇文章主要介紹了解決JavaMail附件名字過長導(dǎo)致的亂碼問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-10-10
  • 詳解Java的面向?qū)ο蠛兔嫦蜻^程

    詳解Java的面向?qū)ο蠛兔嫦蜻^程

    我們知道,Java是面向?qū)ο蟮木幊陶Z言,但是至今仍有不少同學(xué)還不太懂”面向?qū)ο蟆暗拇_切含義,今天這篇文章就帶大家真正地認(rèn)識面向?qū)ο螅信d趣的同學(xué)可以跟著小編一起來學(xué)習(xí)
    2023-05-05
  • jasypt SaltGenerator接口定義方法源碼解讀

    jasypt SaltGenerator接口定義方法源碼解讀

    這篇文章主要為大家介紹了jasypt SaltGenerator接口定義方法源碼解讀,,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-09-09
  • Java裝飾器設(shè)計模式初探

    Java裝飾器設(shè)計模式初探

    這篇文章主要為大家詳細(xì)介紹了Java裝飾器設(shè)計模式,感興趣的小伙伴們可以參考一下
    2016-09-09
  • java網(wǎng)絡(luò)編程之群聊功能

    java網(wǎng)絡(luò)編程之群聊功能

    這篇文章主要為大家詳細(xì)介紹了java網(wǎng)絡(luò)編程之群聊功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-05-05
  • 手寫redis@Cacheable注解?參數(shù)java對象作為key值詳解

    手寫redis@Cacheable注解?參數(shù)java對象作為key值詳解

    這篇文章主要介紹了手寫redis@Cacheable注解?參數(shù)java對象作為key值詳解,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-01-01
  • Java管理對象方法總結(jié)

    Java管理對象方法總結(jié)

    在本篇文章中小編給大家分享了關(guān)于Java管理對象方法以及相關(guān)代碼知識點,需要的朋友們跟著學(xué)習(xí)下。
    2019-05-05
  • java 字節(jié)流和字符流的區(qū)別詳解

    java 字節(jié)流和字符流的區(qū)別詳解

    這篇文章主要介紹了java 字節(jié)流和字符流的區(qū)別詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-09-09
  • Spring中@Value設(shè)置默認(rèn)值問題解決

    Spring中@Value設(shè)置默認(rèn)值問題解決

    本文主要介紹了Spring中@Value設(shè)置默認(rèn)值問題解決,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-07-07

最新評論