Java+swing實(shí)現(xiàn)經(jīng)典貪吃蛇游戲
前言
貪吃蛇(也叫做貪食蛇)游戲是一款休閑益智類(lèi)游戲,有PC和手機(jī)等多平臺(tái)版本。既簡(jiǎn)單又耐玩。該游戲通過(guò)控制蛇頭方向吃東西,從而使得蛇變得越來(lái)越長(zhǎng)。
本程序是通過(guò)java的swing來(lái)實(shí)現(xiàn)《貪吃蛇大作戰(zhàn)》這款游戲。
主要需求
1、通過(guò)上下左右控制蛇的方向,尋找吃的東西,每吃一口就能得到一定的積分,蛇的身體會(huì)變長(zhǎng)
2、蛇頭碰到自己的身體,則算失敗
主要設(shè)計(jì)
1、設(shè)置swing的窗體大小
2、隨機(jī)初始化蛇的位置和食物的位置,且食物不能落在蛇的身體上。
4、添加鍵盤(pán)監(jiān)聽(tīng)器,監(jiān)聽(tīng)上下左右的方向鍵,來(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、通過(guò)按空格開(kāi)始/暫停游戲
功能截圖



代碼實(shí)現(xiàn)
啟動(dòng)類(lèi)
?
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);
}
?
}游戲核心類(lèi)
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();
//添加鍵盤(pán)監(jiān)聽(tīng)器
this.addKeyListener(this);
//必須設(shè)置可以獲得焦點(diǎn)才能監(jiān)聽(tīng)到鍵盤(pá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);
//暫停開(kāi)始狀態(tài)的繪制
if(isStart==false){
g.setFont(new Font("微軟雅黑",Font.BOLD,40));
g.setColor(Color.WHITE);
g.drawString("按空格開(kāi)始/暫停游戲", 275, 350);
}
//失敗情況的繪制
if(isfail==true){
g.setFont(new Font("微軟雅黑",Font.BOLD,40));
g.setColor(Color.red);
g.drawString("失敗!按空格重新開(kāi)始", 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)鍵盤(pán)監(jiān)聽(tīng)的接口方法
@Override
public void keyPressed(KeyEvent e) {
int keycode=e.getKeyCode();
//空格鍵暫?;蛘咧亻_(kāi)
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é)
通過(guò)此次的《貪吃蛇大作戰(zhàn)》游戲?qū)崿F(xiàn),讓我對(duì)swing的相關(guān)知識(shí)有了進(jìn)一步的了解,對(duì)java這門(mén)語(yǔ)言也有了比以前更深刻的認(rèn)識(shí)。
java的一些基本語(yǔ)法,比如數(shù)據(jù)類(lèi)型、運(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)文章
SpringBoot中的@Conditional?注解的使用
@Conditional是Spring4新提供的注解,它的作用是按照一定的條件進(jìn)行判斷,滿(mǎn)足條件的才給容器注冊(cè)Bean,本文主要介紹了SpringBoot中的@Conditional?注解的使用2024-01-01
解決JavaMail附件名字過(guò)長(zhǎng)導(dǎo)致的亂碼問(wèn)題
這篇文章主要介紹了解決JavaMail附件名字過(guò)長(zhǎng)導(dǎo)致的亂碼問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-10-10
jasypt SaltGenerator接口定義方法源碼解讀
這篇文章主要為大家介紹了jasypt SaltGenerator接口定義方法源碼解讀,,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-09-09
手寫(xiě)redis@Cacheable注解?參數(shù)java對(duì)象作為key值詳解
這篇文章主要介紹了手寫(xiě)redis@Cacheable注解?參數(shù)java對(duì)象作為key值詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-01-01
Spring中@Value設(shè)置默認(rèn)值問(wèn)題解決
本文主要介紹了Spring中@Value設(shè)置默認(rèn)值問(wèn)題解決,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-07-07

