日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

贪吃蛇Java版

發(fā)布時間:2024/1/1 java 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 贪吃蛇Java版 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

貪吃蛇小游戲

1. 簡介

??這是用Java的Swing工具實現(xiàn)的一個小程序。

??與傳統(tǒng)的貪吃蛇游戲一樣,通過“上、下、左、右”控制方向覓食,隨著吃的食物越多,身體會變得越長,移動速度也會變得越快。

??死亡條件:①頭碰到身體。②頭碰到墻壁。

關(guān)于這個程序的源代碼及打包資源,我上傳到資源下載和GitHub倉庫了,可以直接去下載:

資源下載地址:CSDN資源下載
GitHub地址:Gluttonous-Snake



2. 程序代碼部分

我這里的開發(fā)環(huán)境是:

  • IDEA_2019.2.3
  • Java_8

2.1 目錄結(jié)構(gòu)

2.2 代碼實現(xiàn)

  • StartGames.java
  • package com.jacks.snake;import javax.swing.*;/*** 程序啟動類,main方法*/ public class StartGames {public static void main(String[] args) {/*** 繪制一個游戲窗口 JFrame*/JFrame frame = new JFrame("貪吃蛇小游戲 作者:赤魂丶");//窗口標題frame.setBounds(10,10,900,720); //設(shè)置窗口的大小frame.setResizable(false); //窗口大小不可以改變frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //設(shè)置關(guān)閉事件,游戲關(guān)閉,程序結(jié)束/*** 添加面板 Panel*/frame.add(new GamePanel());//添加面板frame.setVisible(true);//展示窗口} }
  • Data.java
  • package com.jacks.snake;import javax.swing.*; import java.net.URL;/*** 游戲的數(shù)據(jù)存放類*/ class Data {//頂部圖片背景private static URL headerUrl = Data.class.getResource("/statics/header.png");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");static ImageIcon up = new ImageIcon(upUrl);static ImageIcon down = new ImageIcon(downUrl);static ImageIcon left = new ImageIcon(leftUrl);static ImageIcon right = new ImageIcon(rightUrl);// 身體private static URL bodyUrl = Data.class.getResource("/statics/body.png");static ImageIcon body = new ImageIcon(bodyUrl);//食物private static URL foodUrl = Data.class.getResource("/statics/food.png");static ImageIcon food = new ImageIcon(foodUrl); }
  • GamePanel.java
  • package com.jacks.snake;import javax.swing.*; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyEvent; import java.awt.event.KeyListener; import java.util.Random;/*** 游戲的業(yè)務(wù)邏輯類,制作 JPanel 面板*/ public class GamePanel extends JPanel implements KeyListener, ActionListener {/*蛇的相關(guān)屬性*/private int length; //蛇長度private int[] snakeX = new int[600]; //蛇的X坐標private int[] snakeY = new int[500]; //蛇的Y坐標private String fx; //蛇頭方向/*食物的相關(guān)屬性*/private int foodX;private int foodY;private Random random = new Random();/*系統(tǒng)相關(guān)屬性*/private int speed;private Timer timer = new Timer(speed, this);//定時器private boolean isStart = false; //游戲是否開始private int isFail = 0; //游戲是否失敗,默人不失敗private int score; //分數(shù)系統(tǒng)private int scoreM = 0; //歷史最高分/*** 初始化函數(shù)*/private void init() {speed = 100;timer.setDelay(speed);length = 3;snakeX[0] = 100;snakeY[0] = 100;snakeX[1] = 75;snakeY[1] = 100;snakeX[2] = 50;snakeY[2] = 100;foodX = 25 + 25 * random.nextInt(34);foodY = 75 + 25 * random.nextInt(24);score = 0;fx = "R";}/*** 構(gòu)造函數(shù)*/GamePanel() {init();//獲取鍵盤的監(jiān)聽事件this.setFocusable(true);this.addKeyListener(this);timer.start();//定時器啟動}@Overrideprotected void paintComponent(Graphics g) {//TODO:畫靜態(tài)界面super.paintComponent(g); //清屏this.setBackground(Color.BLACK); //背景顏色Data.header.paintIcon(this, g, 25, 11);//繪制頭部的廣告欄g.fillRect(25, 75, 850, 600);//繪制游戲區(qū)域switch (fx) {//TODO:根據(jù)控制畫蛇頭方向case "R":Data.right.paintIcon(this, g, snakeX[0], snakeY[0]);break;case "L":Data.left.paintIcon(this, g, snakeX[0], snakeY[0]);break;case "U":Data.up.paintIcon(this, g, snakeX[0], snakeY[0]);break;case "D":Data.down.paintIcon(this, g, snakeX[0], snakeY[0]);break;}for (int i = 1; i < length; i++) {//TODO:根據(jù)長度畫蛇的身體Data.body.paintIcon(this, g, snakeX[i], snakeY[i]);}Data.food.paintIcon(this, g, foodX, foodY);//TODO:畫食物// 畫積分g.setColor(Color.WHITE);//TODO:畫計分系統(tǒng)g.setFont(new Font("華文楷體", Font.BOLD, 18));g.drawString("當前長度:" + length, 520, 35);g.drawString("當前分數(shù):" + score, 370, 35);if (score >= scoreM) scoreM = score;g.drawString("歷史最高分:" + scoreM, 370, 50);if (!isStart) {//TODO:用字符串提示游戲開始g.setColor(Color.RED);g.setFont(new Font("華文楷體", Font.BOLD, 45));//字體、加粗、大小g.drawString("按下空格開始游戲", 300, 300);}if (isFail == 1) {//TODO:用字符串提示游戲失敗g.setColor(Color.RED);g.setFont(new Font("華文楷體", Font.BOLD, 40));//字體、加粗、大小g.drawString("游戲失敗,你啃到自己了,按空格重新開始!", 35, 300);} else if (isFail == 2) {//TODO:提示游戲失敗g.setColor(Color.RED);g.setFont(new Font("華文楷體", Font.BOLD, 40));//字體、加粗、大小g.drawString("游戲失敗,您撞到墻了,按空格重新開始!", 35, 300);}}// TODO:監(jiān)聽鍵盤輸入// 按下不釋放@Overridepublic void keyPressed(KeyEvent e) {int keyCode = e.getKeyCode();//記錄按鍵if (keyCode == KeyEvent.VK_SPACE) {//TODO:按下空格暫停或重啟游戲if (isFail != 0) {//失敗后按空格重啟isFail = 0;init();} else {//為失敗按空格為暫停isStart = !isStart;}repaint();//刷新界面}if (keyCode == KeyEvent.VK_LEFT && !fx.equals("R")) {//TODO:用鍵盤控制移動方向fx = "L";} else if (keyCode == KeyEvent.VK_RIGHT && !fx.equals("L")) {fx = "R";} else if (keyCode == KeyEvent.VK_UP && !fx.equals("D")) {fx = "U";} else if (keyCode == KeyEvent.VK_DOWN && !fx.equals("U")) {fx = "D";}}@Overridepublic void actionPerformed(ActionEvent e) {//TODO:控制游戲狀態(tài)if (isStart && isFail == 0) {//TODO:游戲開啟并且沒有失敗for (int i = length - 1; i > 0; i--) {//TODO:移動身體snakeX[i] = snakeX[i - 1];snakeY[i] = snakeY[i - 1];}switch (fx) {//TODO:判斷是否碰到邊界case "R":snakeX[0] = snakeX[0] + 25;if (snakeX[0] > 850) {isFail = 2;init();// snakeX[0] = 25;}break;case "L":snakeX[0] = snakeX[0] - 25;if (snakeX[0] < 25) {isFail = 2;init();//snakeX[0] = 850;}break;case "U":snakeY[0] = snakeY[0] - 25;if (snakeY[0] < 75) {isFail = 2;init();//snakeY[0] = 650;}break;case "D":snakeY[0] = snakeY[0] + 25;if (snakeY[0] > 650) {isFail = 2;init();//snakeY[0] = 75;}break;}//判斷吃食物if (snakeX[0] == foodX && snakeY[0] == foodY) {length++; //蛇長度加1score += 10; //分數(shù)+10if (length <= 7) {speed -= 5;} else if (length <= 10) {speed -= 2;} else if (length <= 20) {speed -= 1;} else if (length % 3 == 0) {speed -= 1;}timer.setDelay(speed);//生成新食物foodX = 25 + 25 * random.nextInt(34);foodY = 75 + 25 * random.nextInt(24);}// 吃到自己失敗for (int i = 1; i < length; i++) {if (snakeX[0] == snakeX[i] && snakeY[0] == snakeY[i]) {isFail = 1;break;}}//刷新界面repaint();}timer.start();//定時器啟動}/*以下是未用到的按鍵監(jiān)聽函數(shù)復(fù)寫*/@Overridepublic void keyTyped(KeyEvent e) {//鍵盤按下并釋放}@Overridepublic void keyReleased(KeyEvent e) {//釋放某個鍵} }

    ??注釋已經(jīng)寫的很詳細了,就不再過多贅述了。

    總結(jié)

    以上是生活随笔為你收集整理的贪吃蛇Java版的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。