Java實(shí)現(xiàn)貪吃蛇大作戰(zhàn)小游戲的示例代碼
大家好,今天嘗試用swing技術(shù)寫一個(gè)貪吃蛇大作戰(zhàn)小游戲,供大家參考。
效果展示

效果展示
一、游戲界面

二、得分情況

項(xiàng)目介紹
項(xiàng)目背景
“貪吃蛇大作戰(zhàn)”游戲是一個(gè)經(jīng)典的游戲,它因操作簡(jiǎn)單、娛樂性強(qiáng),自從計(jì)算機(jī)實(shí)現(xiàn)以來(lái),深受廣大電腦玩家的喜愛,本項(xiàng)目基于Java技術(shù),開發(fā)了一個(gè) 操作簡(jiǎn)單、界面美觀、功能較齊全 的“貪吃蛇”游戲。通過(guò)本游戲的開發(fā),達(dá)到學(xué)習(xí)Java技術(shù)和熟悉軟件開發(fā)流程的目的。
總體需求
本系統(tǒng)主要是完成貪吃蛇游戲的基本操作,用戶可自己練習(xí)和娛樂。需要滿足以下幾點(diǎn)要求:
(1)利用方向鍵來(lái)改變蛇的運(yùn)行方向。
(2)空格鍵暫?;蚶^續(xù)游戲,并在隨機(jī)的地方產(chǎn)生食物。
(3)吃到食物就變成新的蛇體(蛇身長(zhǎng)度變長(zhǎng),游戲繼續(xù))。
實(shí)現(xiàn)過(guò)程
(1)繪制窗體對(duì)象。
(2)靜態(tài)UI設(shè)計(jì)(包括小蛇,食物,游戲區(qū)域和標(biāo)題區(qū)域)。
(3)使用鍵盤監(jiān)聽事件和定時(shí)器實(shí)現(xiàn)小蛇的移動(dòng)。
(4)小蛇與食物碰撞的實(shí)現(xiàn)。
(5)定義變量存放小蛇長(zhǎng)度,遍歷數(shù)組實(shí)現(xiàn)小蛇身體的增加功能。
(6)退出條件:當(dāng)游戲積分到達(dá)指定分?jǐn)?shù),游戲退出。
代碼展示
主類 :Demo類
package Demo;
/**
* 1.畫出窗體對(duì)象
*
*
* @author 青00-Java
*
*/
public class Demo0 {
}MyPanel類 構(gòu)造方法
package Demo;
import java.awt.Color;
import java.awt.Component;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.Random;
import javax.swing.ImageIcon;
import javax.swing.JPanel;
import javax.swing.Timer;
//畫布類
public class MyPanel extends JPanel implements KeyListener,ActionListener{//繼承
private static final Component This = null;
//鍵盤監(jiān)聽交互接口
int length;
int score;
int[] snakeX=new int[500];//坐標(biāo)
int[] snakeY=new int[500];
String fx;
boolean ifStart=false;
//定時(shí)器
Timer timer =new Timer(100,this);
int foodx;
int foody;
Random random =new Random();
public MyPanel(){
init();
//添加監(jiān)聽事件
this.setFocusable(true);
this.addKeyListener(this);
score=0;
}初始化方法
public void init(){
length=3;
fx="r";
//初始化小蛇的位置
snakeX[0]=100;
snakeY[0]=150;
snakeX[1]=75;
snakeY[1]=150;
snakeX[2]=50;
snakeY[2]=150;
foodx=25+25*random.nextInt(57);
foody=125+25*random.nextInt(27);
System.out.println(foodx);
System.out.println(foody);
timer.start();
}繪制方法
@Override
protected void paintComponent(Graphics g){//畫筆對(duì)象
super.paintComponent(g);
//繪制頂部的標(biāo)題
new ImageIcon("C:/Users/Desktop/img/title2.png").paintIcon(this,g,25,11);//創(chuàng)建對(duì)象
//繪制游戲區(qū)域
g.fillRect(25, 125, 1450, 700);
//繪制小蛇
//蛇頭
new ImageIcon("C:/Users/Desktop/img/l.png").paintIcon(this, g, snakeX[0], snakeY[0]);
//蛇身
for(int i=1;i<length;i++){
new ImageIcon("C:/Users/Desktop/img/body.png").paintIcon(This, g, snakeX[i], snakeY[i]);
}
//游戲的提示語(yǔ)
if(ifStart==false){
g.setColor(Color.white);
g.setFont(new Font("微軟雅黑",Font.BOLD,40));
g.drawString("按壓空格鍵繼續(xù)游戲", 550,500);
g.drawString("無(wú)盡模式", 650,400);
}
//畫出食物的位置
new ImageIcon("C:/Users/Desktop/img/body.png").paintIcon(this, g, foodx, foody);
}
@Override//按壓
public void keyPressed(KeyEvent e) {
int keyCode=e.getKeyCode();
if(keyCode==KeyEvent.VK_SPACE){
ifStart=!ifStart;
}
if(ifStart==true){
if(keyCode==KeyEvent.VK_LEFT&&fx!="r"){
fx="l";
}else if(keyCode==KeyEvent.VK_RIGHT&&fx!="l"){
fx="r";
}else if(keyCode==KeyEvent.VK_UP&&fx!="d"){
fx="u";
}else if(keyCode==KeyEvent.VK_DOWN&&fx!="u"){
fx="d";
}
}
repaint();
}定時(shí)器執(zhí)行方法
@Override
public void actionPerformed(ActionEvent e) {
//改變蛇的位置
if(ifStart==true){
for(int i=length-1;i>0;i--){
snakeX[i]=snakeX[i-1];
snakeY[i]=snakeY[i-1];
}
if(fx.equals("l")){
snakeX[0]=snakeX[0]-25;
if(snakeX[0]<25){
snakeX[0]=1450;
}
}else if(fx.equals("r")){
snakeX[0]=snakeX[0]+25;
if(snakeX[0]>1450){
snakeX[0]=25;
}
}else if(fx.equals("u")){
snakeY[0]=snakeY[0]-25;
if(snakeY[0]<120){
snakeY[0]=800;
}
}else if(fx.equals("d")){
snakeY[0]=snakeY[0]+25;
if(snakeY[0]>800){
snakeY[0]=120;
}
}
//判斷是否吃了食物
if(snakeX[0]==foodx&&snakeY[0]==foody){
length++;
score++;
if(score==100){
ifStart=!ifStart;
}
foodx=25+25*random.nextInt(57);
foody=125+25*random.nextInt(27);
System.out.print("當(dāng)前食物坐標(biāo)("+foodx+",");
System.out.print(foody+")");
System.out.println("|||當(dāng)前分?jǐn)?shù):"+score+" ");
}
repaint();
}
timer.start();
}
@Override
public void keyReleased(KeyEvent arg0) {
// TODO Auto-generated method stub
}
@Override
public void keyTyped(KeyEvent arg0) {
// TODO Auto-generated method stub
}
}框架Ui類
package Demo;
import javax.swing.JFrame;
public class Ui {
public static void main(String[] args){
JFrame frame=new JFrame("無(wú)盡版貪吃蛇");
frame.setSize(1500, 900);
frame.setLocationRelativeTo(null);//居中顯示
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setResizable(true);
frame.add(new MyPanel());
frame.setVisible(true);
}
}項(xiàng)目結(jié)構(gòu)

本程序用于初學(xué)者學(xué)習(xí),共封裝三個(gè)類,分別是Demo類,MyPanel類,框架Ui類,結(jié)構(gòu)簡(jiǎn)單,所有方法均在MyPanel類中實(shí)現(xiàn)。
總結(jié)
本游戲的設(shè)計(jì)思路類似于游戲“貪吃蛇大作戰(zhàn)”,程序在一些功能的實(shí)現(xiàn)上還存在許多不足,但該項(xiàng)目的實(shí)現(xiàn)對(duì)Java新手的實(shí)戰(zhàn)能力有很大的提升。
在使用Java編寫該項(xiàng)目時(shí)遇到了很多問題,在解決問題時(shí),可以對(duì)java的面向?qū)ο缶幊逃懈由钊氲睦斫夂驼J(rèn)識(shí)。
本項(xiàng)目在一定程度上還有缺陷,僅用于初學(xué)者學(xué)習(xí),歡迎各位指正。
到此這篇關(guān)于Java實(shí)現(xiàn)貪吃蛇大作戰(zhàn)小游戲的示例代碼的文章就介紹到這了,更多相關(guān)Java 貪吃蛇內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單FTP軟件 FTP協(xié)議分析(1)
這篇文章主要介紹了Java語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單FTP軟件的第一篇,針對(duì)FTP協(xié)議進(jìn)行分析,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-03-03
java定長(zhǎng)隊(duì)列的實(shí)現(xiàn)示例
定長(zhǎng)隊(duì)列是一種有限容量的隊(duì)列,對(duì)于某些應(yīng)用場(chǎng)景非常有用,本文主要介紹了java定長(zhǎng)隊(duì)列的實(shí)現(xiàn)示例,具有一定的參考價(jià)值,感興趣的可以了解一下2024-02-02
基于java實(shí)現(xiàn)具有時(shí)效性文件鏈接
這篇文章主要為大家詳細(xì)介紹了如何基于java實(shí)現(xiàn)具有時(shí)效性的文件鏈接,文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,感興趣的小伙伴可以了解一下2023-12-12
java如何從地址串中解析提取省市區(qū)(完美匹配中國(guó)所有地址)
這篇文章主要給大家介紹了關(guān)于java如何從地址串中解析提取省市區(qū)的相關(guān)資料,通過(guò)這個(gè)方法可以完美匹配中國(guó)所有地址,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-07-07
Feign遠(yuǎn)程調(diào)用參數(shù)里面內(nèi)容丟失的解決方案
這篇文章主要介紹了Feign遠(yuǎn)程調(diào)用參數(shù)里面內(nèi)容丟失的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-03-03
詳解Java MyBatis 插入數(shù)據(jù)庫(kù)返回主鍵
這篇文章主要介紹了詳解Java MyBatis 插入數(shù)據(jù)庫(kù)返回主鍵,有興趣的可以了解一下。2017-01-01
Java如何實(shí)現(xiàn)通過(guò)鍵盤輸入一個(gè)數(shù)組
這篇文章主要介紹了Java實(shí)現(xiàn)通過(guò)鍵盤輸入一個(gè)數(shù)組,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-02-02

