Java+swing實(shí)現(xiàn)經(jīng)典貪吃蛇游戲
前言
貪吃蛇(也叫做貪食蛇)游戲是一款休閑益智類游戲,有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、添加鍵盤監(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、通過(guò)按空格開始/暫停游戲
功能截圖



代碼實(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é)
通過(guò)此次的《貪吃蛇大作戰(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的全過(guò)程
這篇文章主要介紹了手?jǐn)]一個(gè) spring-boot-starter的全過(guò)程,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-01-01
Dubbo服務(wù)校驗(yàn)參數(shù)的解決方案
這篇文章主要介紹了Dubbo服務(wù)如何優(yōu)雅的校驗(yàn)參數(shù),Dubbo框架本身是支持參數(shù)校驗(yàn)的,同時(shí)也是基于JSR303去實(shí)現(xiàn)的,今天通過(guò)示例代碼介紹下詳細(xì)實(shí)現(xiàn)過(guò)程,需要的朋友可以參考下2022-03-03
List集合對(duì)象中按照不同屬性大小排序的實(shí)例
下面小編就為大家?guī)?lái)一篇List集合對(duì)象中按照不同屬性大小排序的實(shí)例。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-03-03
SpringCloudAlibaba Nacos開啟鑒權(quán)解決跳過(guò)登錄頁(yè)面問(wèn)題
對(duì)于Nacos,如果需要開啟權(quán)限控制,可以在 Nacos 控制臺(tái)上進(jìn)行配置,本文主要介紹了SpringCloudAlibaba Nacos開啟鑒權(quán)解決跳過(guò)登錄頁(yè)面問(wèn)題,感興趣的可以了解一下2023-10-10
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實(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詳解
這篇文章主要為大家詳細(xì)介紹了Web三大組件之Filter,Listener和Servlet,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助2022-03-03

