java使用GUI實(shí)現(xiàn)貪吃蛇游戲
本文實(shí)例為大家分享了java使用GUI實(shí)現(xiàn)貪吃蛇游戲的具體代碼,供大家參考,具體內(nèi)容如下
整個(gè)代碼分為三部分
1.游戲開始界面
2.data基本圖片的添加
3.面板,將小蛇畫到面板上
這是游戲完整界面

1. 游戲開始界面
public class StartGame {
? ? public static void main(String[] args) {
? ? ? ? JFrame frame = new JFrame();
? ? ? ? frame.setBounds(10,10,900,720);
? ? ? ? frame.setResizable(false);
? ? ? ? frame.add(new GamePanel());
? ? ? ? frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
? ? ? ? frame.setVisible(true);
? ? }
}2.data數(shù)據(jù)
public class Data {
? ? private static URL headerURL=Data.class.getResource("statics/header.png");
? ? public static ImageIcon header=new ImageIcon(headerURL);
? ? private static URL upURL=Data.class.getResource("statics/up.png");
? ? private static URL downURL=Data.class.getResource("statics/down.png");
? ? private static URL leftURL=Data.class.getResource("statics/left.png");
? ? private static URL rightURL=Data.class.getResource("statics/right.png");
? ? public static ImageIcon up=new ImageIcon(upURL);
? ? public static ImageIcon down=new ImageIcon(downURL);
? ? public static ImageIcon left=new ImageIcon(leftURL);
? ? public static ImageIcon right=new ImageIcon(rightURL);
? ? private static URL bodyURL=Data.class.getResource("statics/body.png");
? ? public static ImageIcon body=new ImageIcon(bodyURL);
? ? private static URL foodURL=Data.class.getResource("statics/food.png");
? ? public static ImageIcon food=new ImageIcon(foodURL);
}3.面板繪制
public class GamePanel extends JPanel ?implements KeyListener, ActionListener {
? ? int length;
? ? int [] snakeX=new int[600];
? ? int [] snakeY=new int[500];
? ? String fx;
? ? int foodx;
? ? int foody;
? ? Random random=new Random();
? ? int score;
? ? boolean isStart=false;
? ? boolean isFail=false;
? ? Timer timer=new Timer(75,this);
? ? public GamePanel() {
? ? ? ? init();
? ? ? ? this.setFocusable(true);
? ? ? ? this.addKeyListener(this);
? ? ? ? timer.start();
? ? }
? ? public void init(){
? ? ? ? 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(34);
? ? ? ? foody=75+25*random.nextInt(24);
? ? ? ? score=0;
? ? }
? ? @Override
? ? protected void paintComponent(Graphics g) {
? ? ? ? super.paintComponent(g);
? ? ? ? this.setBackground(Color.WHITE);
? ? ? ? Data.header.paintIcon(this,g,25,11);
? ? ? ? g.fillRect(25,75,850,600);
? ? ? ? g.setColor(Color.white);
? ? ? ? g.setFont(new Font("微軟雅黑",Font.BOLD,18));
? ? ? ? g.drawString("長度"+length,750,30);
? ? ? ? g.drawString("分?jǐn)?shù)"+score,750,50);
? ? ? ? Data.food.paintIcon(this,g,foodx,foody);
? ? ? ? if(fx.equals("R")){
? ? ? ? ? ? Data.right.paintIcon(this,g,snakeX[0],snakeY[0]);
? ? ? ? }else if(fx.equals("L")){
? ? ? ? ? ? Data.left.paintIcon(this,g,snakeX[0],snakeY[0]);
? ? ? ? }else if(fx.equals("U")){
? ? ? ? ? ? Data.up.paintIcon(this,g,snakeX[0],snakeY[0]);
? ? ? ? }else if(fx.equals("D")){
? ? ? ? ? ? Data.down.paintIcon(this,g,snakeX[0],snakeY[0]);
? ? ? ? }
? ? ? ? //Data.right.paintIcon(this,g,snakeX[0],snakeY[0]);
? ? ? ? for (int i = 1; i < length; i++) {
? ? ? ? ? ? Data.body.paintIcon(this,g,snakeX[i],snakeY[i]);
? ? ? ? }
? ? ? ? if(isStart==false){
? ? ? ? ? ? g.setColor(Color.white);
? ? ? ? ? ? g.setFont(new Font("宋體",Font.BOLD,40));
? ? ? ? ? ? g.drawString("想玩就嗯空格",300,300);
? ? ? ? }
? ? ? ? if(isFail){
? ? ? ? ? ? g.setColor(Color.red);
? ? ? ? ? ? g.setFont(new Font("微軟雅黑",Font.BOLD,40));
? ? ? ? ? ? g.drawString("人生不能重來,請走好每一步",150,350);
? ? ? ? }
? ? }
? ? @Override
? ? public void keyPressed(KeyEvent e) {
? ? ? ? int keyCode = e.getKeyCode();
? ? ? ? if(keyCode == KeyEvent.VK_SPACE){
? ? ? ? ? ? if(isFail){
? ? ? ? ? ? ? ? isFail=false;
? ? ? ? ? ? ? ? init();
? ? ? ? ? ? }else{
? ? ? ? ? ? ? ? isStart=!isStart;
? ? ? ? ? ? }
? ? ? ? ? ? repaint();
? ? ? ? }
? ? ? ? if(keyCode==KeyEvent.VK_UP){
? ? ? ? ? ? fx="U";
? ? ? ? }else ?if(keyCode==KeyEvent.VK_DOWN){
? ? ? ? ? ? fx="D";
? ? ? ? }else ?if(keyCode==KeyEvent.VK_LEFT){
? ? ? ? ? ? fx="L";
? ? ? ? }else ?if(keyCode==KeyEvent.VK_RIGHT){
? ? ? ? ? ? fx="R";
? ? ? ? }
? ? }
? ? @Override
? ? public void actionPerformed(ActionEvent e) {
? ? ? ? if(isStart&&isFail==false){
? ? ? ? ? ? if(foodx==snakeX[0]&&foody==snakeY[0]){
? ? ? ? ? ? ? ? length++;
? ? ? ? ? ? ? ? score+=10;
? ? ? ? ? ? ? ? foodx=25+25*random.nextInt(34);
? ? ? ? ? ? ? ? foody=75+25*random.nextInt(24);
? ? ? ? ? ? }
? ? ? ? ? ? for (int i = length-1; i >0 ; i--) {
? ? ? ? ? ? ? ? ?snakeX[i]=snakeX[i-1];
? ? ? ? ? ? ? ? ?snakeY[i]=snakeY[i-1];
? ? ? ? ? ? }
? ? ? ? ? ? if(fx.equals("R")){
? ? ? ? ? ? ? ? snakeX[0] =snakeX[0]+25;
? ? ? ? ? ? ? ? if(snakeX[0]>850){ snakeX[0]=25; }
? ? ? ? ? ? }else if(fx.equals("L")){
? ? ? ? ? ? ? ? snakeX[0] =snakeX[0]-25;
? ? ? ? ? ? ? ? if(snakeX[0]<25){ snakeX[0]=850; }
? ? ? ? ? ? }else if(fx.equals("U")){
? ? ? ? ? ? ? ? snakeY[0]=snakeY[0]-25;
? ? ? ? ? ? ? ? if(snakeY[0]<75){snakeY[0]=650;}
? ? ? ? ? ? }else if(fx.equals("D")){
? ? ? ? ? ? ? ? snakeY[0]=snakeY[0]+25;
? ? ? ? ? ? ? ? if(snakeY[0]>650){snakeY[0]=75;}
? ? ? ? ? ? }
? ? ? ? ? ? for (int i = 1; i < length; i++) {
? ? ? ? ? ? ? ? if(snakeY[0]==snakeY[i]&&snakeX[0]==snakeX[i]){
? ? ? ? ? ? ? ? ? ? isFail=true;
? ? ? ? ? ? ? ? }
? ? ? ? ? ? }
? ? ? ? ? ? repaint();
? ? ? ? }
? ? ? ? timer.start();
? ? }
? ? @Override
? ? public void keyTyped(KeyEvent e) {
? ? }
? ? @Override
? ? public void keyReleased(KeyEvent e) {
? ? }
}小蛇的各個(gè)部位參數(shù)如下
頭部尺寸

身體尺寸

食物尺寸

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
SpringBoot使用AOP實(shí)現(xiàn)統(tǒng)一角色權(quán)限校驗(yàn)
這篇文章主要介紹了SpringBoot如何使用AOP實(shí)現(xiàn) 統(tǒng)一角色權(quán)限校驗(yàn),文中有詳細(xì)的代碼示例講解和操作流程,具有一定的參考價(jià)值,需要的朋友可以參考下2023-07-07
Java Metrics系統(tǒng)性能監(jiān)控工具的使用詳解
Metrics是一個(gè)Java庫,可以對系統(tǒng)進(jìn)行監(jiān)控,統(tǒng)計(jì)一些系統(tǒng)的性能指標(biāo)。本文就來和大家詳細(xì)聊聊這個(gè)工具的具體使用,希望對大家有所幫助2022-11-11
springboot+vue實(shí)現(xiàn)登錄功能
這篇文章主要為大家詳細(xì)介紹了springboot+vue實(shí)現(xiàn)登錄功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-05-05
SpringBoot整合Mybatis實(shí)現(xiàn)CRUD
這篇文章主要介紹了SpringBoot整合Mybatis實(shí)現(xiàn)CRUD的相關(guān)知識,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-09-09
mybatis向數(shù)據(jù)庫里插入記錄后自動返回記錄ID問題
本文介紹了在接手項(xiàng)目時(shí),對一個(gè)業(yè)務(wù)處理邏輯進(jìn)行重構(gòu)和性能優(yōu)化的經(jīng)歷,作者提到,性能問題可能是導(dǎo)致bug的一個(gè)重要原因,作者提到,在以前的.NET項(xiàng)目中,插入記錄后系統(tǒng)會自動刷新實(shí)體類,為其中的主鍵ID賦值,而SpringBoot項(xiàng)目mybatis也可以通過指定主鍵來優(yōu)化代碼2025-01-01

