簡易貪吃蛇小游戲java版_用GUI實現java版貪吃蛇小游戲

本文實例為大家分享了java版貪吃蛇小游戲的具體代碼,供大家參考,具體內容如下

項目結構

652179332c1d50bbc3ee54b64727375a.png

新建一個JFrame窗口,作為程序入口

public class GameStart{

public static void main(String[] args) {

JFrame jFrame = new JFrame();

jFrame.setBounds(100,100,900,720);

jFrame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);

jFrame.setResizable(false);

jFrame.add(new GameJPanel());

jFrame.setVisible(true);

}

}

創建一個面板類

//面板

public class GameJPanel extends JPanel implements ActionListener {

int length;//蛇的長度

int[] snakeX = new int[600];//蛇的X的最大長度

int[] snakeY = new int[500];//蛇的Y的最大長度

String fx = "R";

boolean isStart = false;//默認不開始

//定時器

Timer timer = new Timer(100, this);//100毫秒=1秒

int foodX;

int foodY;

Random random = new Random();//隨機數

boolean isFail = false;//失敗條件

int score;

public GameJPanel() {

init();

this.setFocusable(true);//獲取焦點事件

addKeyListener(new GameKeyListener(this));

//開啟定時器

timer.start();

}

//初始化

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;

}

//繪制面板,所有東西都是通過graphics這個畫筆繪制

@Override

protected void paintComponent(Graphics graphics) {

super.paintComponent(graphics);//清屏

//添加靜態布局

GameData.header.paintIcon(this, graphics, 25, 11);

graphics.fillRect(25, 75, 850, 600);

//積分板

graphics.setColor(Color.white);

graphics.setFont(new Font("微軟雅黑", Font.BOLD, 18));

graphics.drawString("長度:"+length,750,35);

graphics.drawString("得分:"+score,750,55);

//先畫食物,防止吃掉有延遲

GameData.food.paintIcon(this, graphics, foodX, foodY);

//畫小蛇

switch (fx) {

case "R":

GameData.right.paintIcon(this, graphics, snakeX[0], snakeY[0]);

break;

case "L":

GameData.left.paintIcon(this, graphics, snakeX[0], snakeY[0]);

break;

case "U":

GameData.up.paintIcon(this, graphics, snakeX[0], snakeY[0]);

break;

case "D":

GameData.down.paintIcon(this, graphics, snakeX[0], snakeY[0]);

break;

}

//身體

for (int i = 1; i < length; i++) {

GameData.body.paintIcon(this, graphics, snakeX[i], snakeY[i]);

}

//游戲狀態

if (!isStart) {

graphics.setColor(Color.white);

graphics.setFont(new Font("微軟雅黑", Font.BOLD, 40));//設置字體

graphics.drawString("按下空格,開始游戲", 300, 300);

}

//游戲失敗

if (isFail) {

graphics.setColor(Color.red);

graphics.setFont(new Font("微軟雅黑", Font.BOLD, 40));

graphics.drawString("游戲失敗,請按空格繼續", 300, 300);

}

}

//事件監聽--固定事件刷新一次,1s=100ms

@Override

public void actionPerformed(ActionEvent actionEvent) {

if (isStart && !isFail) {

//吃食物

if (snakeX[0] == foodX && snakeY[0] == foodY) {

//長度+1

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];

}

switch (fx) {

case "R":

snakeX[0] += 25;//頭部移動

// 邊界判斷

if (snakeX[0] > 850) { snakeX[0] = 25; }

break;

case "L":

snakeX[0] -= 25;//頭部移動

if (snakeX[0] < 25) { snakeX[0] = 850; }

break;

case "U":

snakeY[0] -= 25;//頭部移動

if (snakeY[0] < 75) { snakeY[0] = 650; }

break;

case "D":

snakeY[0] += 25;//頭部移動

if (snakeY[0] > 650) { snakeY[0] = 75; }

break;

}

//失敗判定

for (int i = 1; i < length; i++) {

if (snakeX[0] == snakeX[i] && snakeY[0] == snakeY[i]) {

isFail = true;

break;

}

}

repaint();//重繪

}

//開啟定時器

timer.start();

}

}

所有組件添加流程基本一致,即先定義數據,然后在畫筆paintComponent方法中繪制,最后添加到監聽事件。

更多有趣的經典小游戲實現專題,分享給大家:

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/260284.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/260284.shtml
英文地址,請注明出處:http://en.pswp.cn/news/260284.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

幾種代價函數

SAD&#xff08;Sum of Absolute Difference&#xff09;SAE&#xff08;Sum of Absolute Error)即絕對誤差和 SATD&#xff08;Sum of Absolute Transformed Difference&#xff09;即hadamard變換后再絕對值求和 SSD&#xff08;Sum of Squared Difference&#xff09;SSE&am…

Markdown文件導出為HTML的小程序

Markdown文件導出為HTML的小程序為什么做 最近把一些學習經驗記下來&#xff0c;總結成MarkDown文件&#xff0c;不知不覺已經有12篇了。 Sublime Text 的 MarkDown Preview 插件能夠將MarkDown語法轉換為HTML&#xff0c;并提供三種預覽方式&#xff1a;瀏覽器預覽、保存為HTM…

python制作自動回復腳本_python itchat實現微信自動回復的示例代碼

今天在實驗樓發現一個特別好玩的&#xff0c;Python 微信庫itchat,可以實現自動回復等多種功能&#xff0c;好玩到根本停不下來啊&#xff0c;尤其是調戲調戲不懂計算機的&#xff0c;特別有成就感&#xff0c;哈哈&#xff01;&#xff01;代碼如下&#xff1a;#codingutf8imp…

pta龜兔賽跑Java_PTA-龜兔賽跑

烏龜與兔子進行賽跑&#xff0c;跑場是一個矩型跑道&#xff0c;跑道邊可以隨地進行休息。烏龜每分鐘可以前進3米&#xff0c;兔子每分鐘前進9米&#xff1b;兔子嫌烏龜跑得慢&#xff0c;覺得肯定能跑贏烏龜&#xff0c;于是&#xff0c;每跑10分鐘回頭看一下烏龜&#xff0c;…

視頻壓縮算法的相關知識

視頻壓縮算法的相關知識MPEG-1MPEG 視頻壓縮編碼后包括三種元素&#xff1a;I幀&#xff08;I-frames&#xff09;、P幀&#xff08;P-frames&#xff09;和B幀&#xff08;B-frames&#xff09;。在MPEG編碼的過程中&#xff0c;部分視頻幀序列壓縮成為I幀&#xff1b;部分壓縮…

安裝MariaDB數據庫(未完成)

1轉載于:https://www.cnblogs.com/centos7/p/5994533.html

python接口開發django_用 Django 開發接口

環境搭建1、pip install django2.2.0一、django-admin startproject UITESTpython manage.py startapp paltform創建Django項目1. 創建方式&#xff1a;#方式1&#xff1a;終端輸入django-admin startproject UITEST#方式2:pycharm中新建django項目在settings.py文件中添加應用…

戒掉dota

立言為證。 每次不想學習想到dota就強迫自己去培養的興趣。 比如看一本喜歡的書&#xff1b;比如去跑個步&#xff1b;比如研究某個興趣點寫個報告&#xff1b;比如寫份隨筆。 轉載于:https://www.cnblogs.com/hongxia/p/3830348.html

java切入式編程顯示屏_C語言嵌入式系統編程修煉之四:屏幕操作

C語言嵌入式系統編程修煉之四:屏幕操作作者:宋寶華 更新日期:2005-07-22漢字處理現在要解決的問題是&#xff0c;嵌入式系統中經常要使用的并非是完整的漢字庫&#xff0c;往往只是需要提供數量有限的漢字供必要的顯示功能。例如&#xff0c;一個微波爐的LCD上沒有必要提供顯…

DIV的邊距屬性在Chrome和IE中的區別

突然間&#xff0c;在Chrome下看起來很整齊的布局&#xff0c;在IE下變成一團糟。為了找出原因&#xff0c;我改動了div的background-color屬性。最后&#xff0c;發現同一個DIV的寬度在IE和Chrome下卻不一樣。這大晚上的&#xff0c;真是怪嚇人滴&#xff01; 之后&#xff0c…

算法之矩陣計算斐波那契數列

算法之矩陣計算斐波那契數列 本節內容 斐波那契介紹普通方式求解斐波那契矩陣概念矩陣求冪矩陣求解斐波那契1.斐波那契介紹 斐波那契數列有關十分明顯的特點&#xff0c;那是&#xff1a;前面相鄰兩項之和&#xff0c;構成了后一項。即f(n)f(n-1)f(n-2),f(0)0,f(1)f(2)1,推導下…

python中去除字符串中首尾空格的函數_Python中去除字符串首尾特定字符的函數:strip()...

Python中strip()函數的作用是去除一個字符串前導和尾部的特定字符&#xff0c;并返回結果字符串。Python中strip()函數默認是刪除字符串前導和尾部空格&#xff0c;通過設定參數&#xff0c;也可以去除字符串前導和尾部的其它特定字符。strip()函數的語法格式str.strip( [ char…

SeekBar和RatingBar

1. SeekBar的主要屬性 2. OnSeekBarChangeListener 3. RatingBar的主要屬性 4. OnRatingBarChangeListener 1. SeekBar的主要屬性 2. OnSeekBarChangeListener 1 <RelativeLayout xmlns:android"http://schemas.android.com/apk/res/android"2 xmlns:tools&qu…

用“Web的思想”做PC客戶端

一直在想&#xff0c;用HTML搭建前端頁面這么方便&#xff0c;而且效果這么炫&#xff0c;為什么在PC端的軟件要如此麻煩呢&#xff1f;就連C#也是&#xff0c;更何況C了。 盡管C有DirectUI這樣優秀的圖形庫&#xff0c;但是開發起來仍然非常吃力。C#的WPF雖然工具鏈完善&#…

Java點擊按鈕div縮放_[Java教程]怎樣給div增加resize事件

[Java教程]怎樣給div增加resize事件0 2016-10-31 11:00:04當瀏覽器窗口被調整到一個新的高度或寬度時&#xff0c;就會觸發resize事件,這個事件在window上面觸發,那么如何給div元素增加resize事件&#xff0c;監聽div的高度或寬度的改變呢&#xff1f;某位大神用jquery實現的方…

python判斷題題庫大數據技術_智慧樹_大數據分析的python基礎_搜題公眾號

智慧樹_大數據分析的python基礎_搜題公眾號更多相關問題社會公眾可以查閱煙草專賣行政主管部門的監督檢查記錄。()公民、法人或者其他組織不得利用自動售貨機銷售煙草制品。()煙草廣告中不得有下列情形()。A、社會公益廣告B、遷址、換房、更名等啟事廣告C、表示吸煙有利人體健公…

Java并發中常用同步工具類

為什么80%的碼農都做不了架構師&#xff1f;>>> 同步工具類可以是任何一個對象&#xff0c;只要它根據其自身的狀態來協調線程控制流。阻塞隊列&#xff08;BlockingQueue&#xff09;可以作為同步工具類&#xff0c;其他類型的同步工具類還包括信號量&#xff08;…

Linux平臺Oracle多個實例啟動說明

環境說明:oracle實例1的SID為orcl(為默認啟動的實例),第二個實例的SID為orcl2 啟動步驟&#xff1a; 1&#xff09;啟動數據庫實例完成后&#xff0c;啟動數據庫監聽服務 #lsnrctl start 2&#xff09;切換到需要啟動的數據庫實例下&#xff0c;如下表示啟動的是orcl數據庫…

RTMP協議發送H.264編碼及AAC編碼的音視頻,實現攝像頭直播

RTMP協議發送H.264編碼及AAC編碼的音視頻&#xff0c;實現攝像頭直播 摘要: RTMP協議發送H.264編碼及AAC編碼的音視頻&#xff0c;實現攝像頭直播  RTMP&#xff08;Real Time Messaging Protocol&#xff09;是專門用來傳輸音視頻數據的流媒體協議&#xff0c;最初由Macrome…

java消息順序執行_Apache Flink:如何并行執行但保持消息順序?

請在下面找到使用側輸出和插槽組進行本地擴展的示例 .package org.example/** Licensed to the Apache Software Foundation (ASF) under one* or more contributor license agreements. See the NOTICE file* distributed with this work for additional information* regardi…