【GUI】-- 14 GUI編程總結

GUI編程

05 GUI總結

在總結之前,先給出之前的貪吃蛇小游戲全代碼。

  • 游戲的主啟動類:
package com.duo.snake;import javax.swing.*;//游戲的主啟動類
public class StartGame {public static void main(String[] args) {JFrame frame = new JFrame();frame.add(new GamePanel());  //此行代碼的位置會影響后續按下空格時游戲的反應(Tab鍵問題)!!!frame.setVisible(true);frame.setResizable(false);frame.setTitle("貪吃蛇-2023");frame.setBounds(5, 10, 915, 740);frame.setLocationRelativeTo(null);frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);}
}
  • GamePanel類:
package com.duo.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;//游戲的面板
public class GamePanel extends JPanel implements KeyListener, ActionListener {//定義蛇的數據結構int length;  //小蛇總長int[] snakeX = new int[600];  //蛇的X坐標 25*25int[] snakeY = new int[500];  //蛇的Y坐標 25*25String direction;  //蛇頭方向boolean isStart = false;  //默認未開始游戲boolean isFail = false;  //游戲失敗狀態Timer timer = new Timer(100, this);  //定時器,100ms執行一次//食物的坐標int foodX;int foodY;Random random = new Random();//積分面板數據結構int score;//構造器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;  //第二節身體的坐標direction = "R";  //蛇頭初始向右//將食物隨機分布于游戲界面foodX = 25 + 25 * random.nextInt(34);foodY = 75 + 25 * random.nextInt(24);score = 0;  //定義初始得分}//繪制靜態面板@Overrideprotected void paintComponent(Graphics g) {super.paintComponent(g);  //起到清屏的作用Data.header.paintIcon(this, g, 25, 11);  //將廣告欄畫入面板g.fillRect(25, 75, 850, 600);  //默認的游戲界面(黑色區域)this.setBackground(Color.white);//畫出積分面板g.setColor(Color.white);g.setFont(new Font("宋體", Font.BOLD, 18));g.drawString("長度  " + length, 750, 30);g.drawString("得分  " + score, 750, 55);//畫出食物Data.food.paintIcon(this, g, foodX, foodY);//將小蛇(頭)畫入面板中的游戲區域,且蛇頭部分需要判斷方向switch (direction) {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++) {Data.body.paintIcon(this, g, snakeX[i], snakeY[i]);}//繪制當前游戲狀態if (!isStart) {g.setColor(Color.white);g.setFont(new Font("宋體", Font.BOLD, 40));g.drawString("按下空格開始游戲", 270, 300);}if (isFail) {g.setColor(Color.red);g.setFont(new Font("宋體", Font.BOLD, 40));g.drawString("游戲失敗,按下空格重新開始", 220, 300);}}//鍵盤監聽事件@Overridepublic 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 && !direction.equals("D")) {direction = "U";} else if (keyCode == KeyEvent.VK_DOWN && !direction.equals("U")) {direction = "D";} else if (keyCode == KeyEvent.VK_LEFT && !direction.equals("R")) {direction = "L";} else if (keyCode == KeyEvent.VK_RIGHT && !direction.equals("L")) {direction = "R";}}//事件監聽需要定時器來實現,即通過固定的時間進行刷新(例如1s=10次)@Overridepublic void actionPerformed(ActionEvent e) {if (isStart && !isFail) {//小蛇身體右移for (int i = length - 1; i > 0; i--) {  //后一節身體移動至前一節 snakeX[1] = snakeX[0]snakeX[i] = snakeX[i - 1];snakeY[i] = snakeY[i - 1];}//判斷蛇頭是否吃到食物if (snakeX[0] == foodX && snakeY[0] == foodY) {length++;foodX = 25 + 25 * random.nextInt(34);foodY = 75 + 25 * random.nextInt(24);score += 10;}//判斷蛇頭走向switch (direction) {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();}@Overridepublic void keyReleased(KeyEvent e) {}@Overridepublic void keyTyped(KeyEvent e) {}
}

游戲的數據中心類:

package com.duo.snake;import javax.swing.*;
import java.net.URL;//數據中心
public class Data {//相對路徑  tx.jpg//絕對路徑  /:相當于當前的項目public static URL headerURL = Data.class.getResource("static/header.png");public static URL upURL = Data.class.getResource("static/up.png");public static URL downURL = Data.class.getResource("static/down.png");public static URL leftURL = Data.class.getResource("static/left.png");public static URL rightURL = Data.class.getResource("static/right.png");public static URL bodyURL = Data.class.getResource("static/body.png");public static URL foodURL = Data.class.getResource("static/food.png");public static ImageIcon header = new ImageIcon(headerURL);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);public static ImageIcon body = new ImageIcon(bodyURL);public static ImageIcon food = new ImageIcon(foodURL);}

游戲運行結果已于前節展示,可實現小蛇移動、吃到食物長大并且分數增加、失敗判定等操作。下面將對此階段GUI編程作一簡單總結。

GUI編程:

  • AWT
    1. 組件
    2. 容器
    3. 面板
    4. 事件監聽
    5. 文本框監聽
    6. 畫圖類paint(g)
    7. 鼠標/窗口/鍵盤監聽器
  • Swing
    1. 容器
    2. 面板(可帶有滾動條)
    3. label
      • 普通標簽
      • 圖片標簽
      • 圖像標簽
    4. 按鈕
      • 普通按鈕
      • 圖片按鈕
      • 單選框按鈕
      • 多選框按鈕
    5. 列表
      • 下拉框
      • 列表框
    6. 文本框
      • 普通文本框
      • 密碼框
      • 文本域
  • 貪吃蛇小游戲

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

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

相關文章

Java面試-微服務篇-SpringCloud

Java面試-微服務篇-SpringCloud SpringCloud 常見組件注冊中心Eureka, Nacos負載均衡Ribbon服務雪崩, 熔斷降級微服務的監控來源 SpringCloud 常見組件 通常情況下 Eureka: 注冊中心Ribbon: 負載均衡Feign: 遠程調用Hystrix: 服務熔斷Zuul/Gateway: 網關 SpringCloudAlibaba…

【開源】基于Vue.js的天然氣工程運維系統的設計和實現

項目編號&#xff1a; S 022 &#xff0c;文末獲取源碼。 \color{red}{項目編號&#xff1a;S022&#xff0c;文末獲取源碼。} 項目編號&#xff1a;S022&#xff0c;文末獲取源碼。 目錄 一、摘要1.1 項目介紹1.2 項目錄屏 二、功能模塊2.1 系統角色分類2.2 核心功能2.2.1 流程…

服務限流算法:從令人頭疼到信手拈來

前言 隨著系統規模的擴大和用戶量的增加&#xff0c;服務限流成為了一個非常重要的話題。一方面&#xff0c;系統需要能夠處理大量的請求&#xff0c;不至于因為負載過高而崩潰&#xff1b;另一方面&#xff0c;又需要避免惡意攻擊或者其他異常情況對系統造成影響。本文將介紹…

npm相關和私有云

安裝node時npm會自動安裝&#xff0c;npm也可以單獨安裝。 package.json 在使用npm時&#xff0c;package.json文件是非常重要的&#xff0c;因為它包含了關于項目的必要信息&#xff0c;比如名稱、版本、依賴項等。在初始化新項目時&#xff0c;通常會使用npm init命令生成一…

pip安裝python包到指定python版本下

python -m pip install 包名1.命令行進入到指定python安裝目錄。比如我電腦上有python3.8也有python3.9。準備給python3.9安裝指定的包

【青書學堂】 2023年第二學期 HTML5+CSS3(直播課) 作業

【青書學堂】 2023年第二學期 HTML5CSS3(直播課) 作業 為了方便日后復習&#xff0c;青書學堂成人大專試題整理。 若有未整理的課程&#xff0c;請私信我補充&#xff0c;歡迎愛學習的同學們收藏點贊關注&#xff01;文章內容僅限學習使用&#xff01;&#xff01;&#xff01;…

3.OpenFeign的使用

OpenFeign 文章目錄 OpenFeign一. 什么是OpenFeign二. OpenFeign基礎使用1.添加依賴2.配置Nacos配置信息3.在項目中開啟OpenFeign4.編寫OpenFeign調用代碼5.調用OpenFeign接口 三. OpenFeign內置的超時重試機制1.配置超時重試2.覆蓋Retryer對象 四.自定義超時重試機制1.自定義超…

Hive中常出現的錯誤(不定時更新)

1.加載數據失敗 hive> load data local inpath /home/user/hive.txt into table studentl> ; FAILED: SemanticException [Error 10001]: Line 1:56 Table not found studentl hive> load data local inpath /home/user/hive.txt into table student; Loading data to…

技術分享| anyRTC之RTN網絡

RTN(Real-time Network)中文名&#xff1a;實時音視頻傳輸網絡。 RTN是最近幾年由各大RTC的云廠商提出的一個全新架構的音視頻實時傳輸網絡概念。類似于直播的CDN網絡&#xff0c;RTN是對音視頻的實時性又強烈要求的場景而設計的&#xff0c;原理上全球端到端的時延通過RTN網絡…

JSP EL表達式獲取list/Map集合與java Bean對象

上文 JSP EL表達式基本使用 中 我們對EL表達式做了一個基本的了解 也做了基礎的字符串數據使用 那么 我們可以來看一下我們的集合 首先 list 這個比較簡單 我們直接這樣寫代碼 <% page import"java.util.ArrayList" %> <% page import"java.util.Lis…

基于C#實現優先隊列

一、堆結構 1.1性質 堆是一種很松散的序結構樹&#xff0c;只保存了父節點和孩子節點的大小關系&#xff0c;并不規定左右孩子的大小&#xff0c;不像排序樹那樣嚴格&#xff0c;又因為堆是一種完全二叉樹&#xff0c;設節點為 i,則 i/2 是 i 的父節點&#xff0c;2i 是 i 的…

安卓開發之HTTP API服務接口設計(基于okhttp3請求)

安卓中的請求 OkHttp3 是一個開源的 Java/Android HTTP 客戶端庫,由 Square 公司開發。它提供了簡潔和高效 的 API ,用于進行 HTTP 請求、處理響應以及與服務器進行通信。 以下是 OkHttp3 的一些主要特點和功能: 簡單易用: OkHttp3 提供了簡潔的 API ,使得發送 HTTP 請求變…

信息系統的安全保護等級的五個級別

信息系統的安全保護等級分為五級&#xff1a;第一級為自主保護級、第二級為指導保護級、第三級為監督保護級、第四級為強制保護級、第五級為專控保護級。 法律依據&#xff1a;《信息安全等級保護管理辦法》第四條 信息系統的安全保護等級分為以下五級&#xff1a;   &#…

【C語言】計算實時太陽角度(高度角、方位角),以及使用stm32單片機實時獲取時間戳

整體計算方法 在編寫該代碼的過程中尋找了多篇博文和論文&#xff0c;綜合所有文章且按網上的以0時的方位角的0&#xff0c;且隨時間累加累加至360度。我修改了博文和論文的一些角度的計算方法。得到一下代碼與網站計算的方位角相互驗證過&#xff0c;誤差不超過1 驗證網站 太…

LoRaWAN 中國地區文件詳細解讀

目錄 一、LoRaWAN簡介 二、CN470-510地區參數分析 1.信道頻率 2.支持功率 3.支持空速 4.最大負載大小 5.接受窗口參數 三、CN470_510默認參數 Lora LoraWAN教程 一、LoRaWAN簡介 LoraWAN是一種基于LoRa遠距離通信技術配套設計的一套通訊協議和系統架構。LoRaWAN網絡通…

Java實現拼圖游戲

1、了解拼圖游戲基本功能&#xff1a; 拼圖游戲內容由若干小圖像塊組成的&#xff0c;通過鼠標點擊圖像塊上下左右移動&#xff0c;完成圖像的拼湊。 2、拼圖游戲交互界面設計與開發&#xff1a; 通過創建窗體類、菜單、中間面板和左右面板完成設計拼圖的交互界面 &#xff…

外貿自建站服務器怎么選?網站搭建的工具?

外貿自建站服務器用哪個好&#xff1f;如何選海洋建站的服務器&#xff1f; 外貿自建站是企業拓展海外市場的重要手段之一。而在這個過程中&#xff0c;選擇一個適合的服務器對于網站的穩定運行和優化至關重要。海洋建站將為您介紹如何選擇適合的外貿自建站服務器。 外貿自建…

CSDN如何完整轉載別人的文章并做自己的筆記

1、這篇文章介紹主體的轉載&#xff08;粘貼&#xff09;方法&#xff1a; 轉載&#xff1a;CSDN快速轉載文章方法&#xff08;簡單&#xff09;_csdn轉載_biggolden1的博客-CSDN博客 2、這篇文章解決&#xff0c;對于含有代碼塊的文章粘貼后&#xff0c;出現的額外行號塊問題…

【STM32外設系列】GPS定位模塊(ATGM336H)

&#x1f380; 文章作者&#xff1a;二土電子 &#x1f338; 關注公眾號獲取更多資料&#xff01; &#x1f438; 期待大家一起學習交流&#xff01; 文章目錄 一、GPS模塊簡介二、使用方法2.1 引腳介紹2.2 數據幀介紹2.3 關于不同的啟動方式 三、前置知識3.1 strstr函數3.2…