Java+swing實現(xiàn)經典貪吃蛇游戲
前言
貪吃蛇(也叫做貪食蛇)游戲是一款休閑益智類游戲,有PC和手機等多平臺版本。既簡單又耐玩。該游戲通過控制蛇頭方向吃東西,從而使得蛇變得越來越長。
本程序是通過java的swing來實現(xiàn)《貪吃蛇大作戰(zhàn)》這款游戲。
主要需求
1、通過上下左右控制蛇的方向,尋找吃的東西,每吃一口就能得到一定的積分,蛇的身體會變長
2、蛇頭碰到自己的身體,則算失敗
主要設計
1、設置swing的窗體大小
2、隨機初始化蛇的位置和食物的位置,且食物不能落在蛇的身體上。
4、添加鍵盤監(jiān)聽器,監(jiān)聽上下左右的方向鍵,來控制蛇的上下左右運動
5、蛇運行時,頭向前走一步,增加一個頭部節(jié)點,去掉尾部節(jié)點。
6、蛇吃了一個食物后,蛇的尾部節(jié)點添加一個節(jié)點,食物消失。
7、食物每次被蛇吃掉后,要隨機再次生成一個新的食物節(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ù)據結構
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;//吃食物后多出來一個的坐標
//目標的數(shù)據結構
int foodx,foody;
//隨機數(shù)
Random random =new Random();
//計時器
Timer timer=new Timer(100, this);
int score;
public GamePanel(){
init();
//添加鍵盤監(jiān)聽器
this.addKeyListener(this);
//必須設置可以獲得焦點才能監(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();
}
}
}總結
通過此次的《貪吃蛇大作戰(zhàn)》游戲實現(xiàn),讓我對swing的相關知識有了進一步的了解,對java這門語言也有了比以前更深刻的認識。
java的一些基本語法,比如數(shù)據類型、運算符、程序流程控制和數(shù)組等,理解更加透徹。java最核心的核心就是面向對象思想,對于這一個概念,終于悟到了一些。
以上就是Java+swing實現(xiàn)經典貪吃蛇游戲的詳細內容,更多關于Java swing貪吃蛇的資料請關注腳本之家其它相關文章!
相關文章
SpringCloudAlibaba Nacos開啟鑒權解決跳過登錄頁面問題
對于Nacos,如果需要開啟權限控制,可以在 Nacos 控制臺上進行配置,本文主要介紹了SpringCloudAlibaba Nacos開啟鑒權解決跳過登錄頁面問題,感興趣的可以了解一下2023-10-10
linux部署出現(xiàn)java文件操作報錯:java.io.FileNotFoundException解決辦法
這篇文章主要g介紹了linux部署出現(xiàn)java文件操作報錯:java.io.FileNotFoundException解決的相關資料,這個錯誤通常表示你的Spring Boot應用程序無法找到指定的文本文件,需要的朋友可以參考下2023-12-12
使用Java實現(xiàn)百萬Excel數(shù)據導出
這篇文章主要為大家詳細介紹了如何使用Java實現(xiàn)百萬Excel數(shù)據導出,文中的示例代碼講解詳細,具有一定的借鑒價值,有需要的小伙伴可以參考一下2024-03-03
Web三大組件之Filter,Listener和Servlet詳解
這篇文章主要為大家詳細介紹了Web三大組件之Filter,Listener和Servlet,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助2022-03-03

