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



代碼實(shí)現(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;//吃食物后多出來一個(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);//清屏,這樣不會閃爍
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);
}
//實(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){
//身體移動
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ū)ο笏枷耄瑢τ谶@一個(gè)概念,終于悟到了一些。
以上就是Java+swing實(shí)現(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-01
jasypt SaltGenerator接口定義方法源碼解讀
這篇文章主要為大家介紹了jasypt SaltGenerator接口定義方法源碼解讀,,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-09-09
手寫redis@Cacheable注解?參數(shù)java對象作為key值詳解
這篇文章主要介紹了手寫redis@Cacheable注解?參數(shù)java對象作為key值詳解,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-01-01
Spring中@Value設(shè)置默認(rèn)值問題解決
本文主要介紹了Spring中@Value設(shè)置默認(rèn)值問題解決,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-07-07

