基于java的貪吃蛇小游戲

貪吃蛇游戲需要做兩點:圖形界面和游戲邏輯。在 Java 中,可以使用 Swing 或 JavaFX 來創建圖形界面。下面代碼創建了一個簡單的 Swing 窗口,實現了一個基本的貪吃蛇游戲。在游戲中,使用方向鍵控制貪吃蛇的移動,吃到食物會增加蛇的長度,如果蛇撞到墻壁或者自己的身體,則游戲結束。

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.ArrayList;
import java.util.Random;public class SnakeGame extends JFrame implements ActionListener, KeyListener {private ArrayList<Point> snake;private Point fruit;private Timer timer;private int direction;private boolean gameOver;public SnakeGame() {setTitle("貪吃蛇游戲");setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);setSize(400, 400);setLocationRelativeTo(null);snake = new ArrayList<>();snake.add(new Point(10, 10));fruit = new Point(5, 5);direction = KeyEvent.VK_RIGHT;gameOver = false;timer = new Timer(100, this);timer.start();addKeyListener(this);setFocusable(true);setFocusTraversalKeysEnabled(false);setVisible(true);}public void actionPerformed(ActionEvent e) {if (!gameOver) {move();checkCollision();checkFruit();repaint();}}public void paint(Graphics g) {super.paint(g);if (!gameOver) {g.setColor(Color.RED);g.fillRect(fruit.x * 20, fruit.y * 20, 20, 20);g.setColor(Color.GREEN);for (Point point : snake) {g.fillRect(point.x * 20, point.y * 20, 20, 20);}} else {g.setColor(Color.BLACK);g.setFont(new Font("Arial", Font.BOLD, 30));g.drawString("游戲結束", 130, 200);}}public void move() {for (int i = snake.size() - 1; i > 0; i--) {snake.get(i).x = snake.get(i - 1).x;snake.get(i).y = snake.get(i - 1).y;}switch (direction) {case KeyEvent.VK_UP:snake.get(0).y--;break;case KeyEvent.VK_DOWN:snake.get(0).y++;break;case KeyEvent.VK_LEFT:snake.get(0).x--;break;case KeyEvent.VK_RIGHT:snake.get(0).x++;break;}}public void checkCollision() {Point head = snake.get(0);if (head.x < 0 || head.x >= 20 || head.y < 0 || head.y >= 20) {gameOver = true;timer.stop();}for (int i = 1; i < snake.size(); i++) {if (head.x == snake.get(i).x && head.y == snake.get(i).y) {gameOver = true;timer.stop();break;}}}public void checkFruit() {Point head = snake.get(0);if (head.x == fruit.x && head.y == fruit.y) {snake.add(new Point(snake.get(snake.size() - 1)));generateFruit();}}public void generateFruit() {Random random = new Random();boolean validFruit = false;while (!validFruit) {int x = random.nextInt(20);int y = random.nextInt(20);fruit = new Point(x, y);boolean collision = false;for (Point point : snake) {if (fruit.x == point.x && fruit.y == point.y) {collision = true;break;}}if (!collision) {validFruit = true;}}}public void keyPressed(KeyEvent e) {int key = e.getKeyCode();if ((key == KeyEvent.VK_LEFT || key == KeyEvent.VK_RIGHT || key == KeyEvent.VK_UP || key == KeyEvent.VK_DOWN) &&(key + direction) % 2 != 0) {direction = key;}}public void keyReleased(KeyEvent e) {}public void keyTyped(KeyEvent e) {}public static void main(String[] args) {new SnakeGame();}
}

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

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

相關文章

`Numpy`數組中 數據的修改(第10講)

Numpy數組中 數據的修改(第10講) ??????? ??博主 侯小啾 感謝您的支持與信賴。?? ????????????????????????????????????????????????????????????????????????????????????…

YOLOv5獨家原創改進:SPPF自研創新 | 可變形大核注意力(D-LKA Attention),大卷積核提升不同特征感受野的注意力機制

??????本文自研創新改進: 可變形大核注意力(D-LKA Attention)高效結合SPPF進行二次創新,大卷積核提升不同特征感受野的注意力機制。 收錄 YOLOv5原創自研 https://blog.csdn.net/m0_63774211/category_12511931.html ??????全網獨家首發創新(原創),適合p…

Python學習路線 - Python語言基礎入門 - 函數使用

Python學習路線 - Python語言基礎入門 - 函數使用 函數介紹函數函數的快速體驗 函數的定義函數的定義 函數的參數函數的傳入參數函數的傳入參數 - 傳參定義函數的傳入參數 - 語法解析練習案例&#xff1a;升級版自動查詢核酸 函數的返回值函數返回值的定義返回值的語法None類型…

Python----異常

1、什么是異常 當檢測到一個錯誤時&#xff0c;解釋器就無法繼續執行了&#xff0c;反而出現了一些錯誤的提示&#xff0c;這就是所謂的"異常"。 2、異常演示 # 運算符 # print(10/0) # 文件異常 f open(python.txt, r) content f.readlines() print(content) 3…

vue中el-upload結合vuedraggable實現圖片的上傳、排序、刪除以及預覽等功能

實現效果&#xff1a; 功能實現&#xff1a; 要實現圖片的拖拽功能首先需要安裝vuedraggable庫 npm install vuedraggable --save在組件中引入并注冊 vuedraggable <script>import draggable from "vuedraggable";export default {// 注冊組件components: {…

SI24R03 高度集成低功耗SOC 2.4G 收發一體芯片

今天給大家介紹一款Soc 2.4G 收發一體模塊-SI24R03 Si24R03是一款高度集成的低功耗無線SOC芯片&#xff0c;芯片為QFN32 5x5mm封裝&#xff0c;集成了資源豐富的MCU內核與2.4G收發器模塊&#xff0c;最低功耗可達1.6uA&#xff0c;極少外圍器件&#xff0c;大幅降低系統應用成本…

詳解Android單元測試最佳實踐

目的 充分的單元測試就是提高代碼質量最有效的手段之一&#xff0c;而單元測試嚴重依賴代碼的可測試性&#xff0c;本文主要通過一個簡單的DEMO演示如何對Android原生應用進行單元測試&#xff0c;同時示例代碼采用MVP模式以提高代碼的可讀性和可測試性 簡介 在Android原生應…

mmdetection測試保存到新的文件夾,無需標簽

這個是用demo這個代碼測試的&#xff0c;需要先訓練一個pth文件夾&#xff0c;訓練之后再調用pth文件夾進行測試。測試的代碼文件名是&#xff1a;image_demo_new.py&#xff0c;代碼如系所示&#xff1a; # Copyright (c) OpenMMLab. All rights reserved. import asyncio fr…

使用selenium的edge瀏覽器登錄某為

互聯網上基本都是某哥的用法&#xff0c;其實edge和某哥的用法是一樣的就有一下參數不一樣。 一、運行環境 Python&#xff1a;3.7 Selenium&#xff1a;4.11.2 Edge&#xff1a;版本 120.0.2210.61 (正式版本) (64 位) 二、執行代碼 from time import sleepfrom selenium…

調新浪分享

前端寫一個按鈕,通過按鈕來調出新浪界面, window.location.href http://service.weibo.com/share/share.php?url 這行代碼調出新浪分享界面,要是想要添加一些圖片和文字 使用: window.location.href http://service.weibo.com/share/share.php?url encodeURIComponent…

P2 Qt Creator創建第一個Qt程序

前言 &#x1f3ac; 個人主頁&#xff1a;ChenPi &#x1f43b;推薦專欄1: 《C_ChenPi的博客-CSDN博客》??? &#x1f525; 推薦專欄2: 《LLinux C應用編程&#xff08;概念類&#xff09;_ChenPi的博客-CSDN博客》??? &#x1f33a;本篇簡介 &#xff1a;這一章我們學…

Python基礎——兩個常用且容易忘記的知識點

1. replace函數的第三個參數 replace 方法提供了一個可選的參數 count&#xff0c;可以用于指定替換的次數。你可以將 count 設置為 1 來限制替換的次數&#xff0c;只替換第一個匹配項。 下面是使用 replace 方法限制替換次數的示例&#xff1a; date_str "2023/05/1…

二百一十一、Flume——Flume實時采集Linux中的Hive日志寫入到HDFS中(親測、附截圖)

一、目的 為了實現用Flume實時采集Hive的操作日志到HDFS中&#xff0c;于是進行了一場實驗 二、前期準備 &#xff08;一&#xff09;安裝好Hadoop、Hive、Flume等工具 &#xff08;二&#xff09;查看Hive的日志在Linux系統中的文件路徑 [roothurys23 conf]# find / -name…

smarty模版 [BJDCTF2020]The mystery of ip 1

打開題目 點擊flag給了我們一個ip 點擊hint&#xff0c;查看源代碼處告訴了我們要利用這個ip bp抓包&#xff0c;并添加X-Forward-For頭 所以這道題是XFF可控 本來聯想到XFF漏洞引起的sql注入&#xff0c;但是我們無論輸入什么都會正常回顯&#xff0c;就聯想到ssti注入 我們…

C/C++指針操作整理

C/C指針操作整理 面向曾經學習過指針的人&#xff0c;并非針對究極初學者。 一維指針 數據類型存儲的地址&#xff0c;指向數據存儲的地址&#xff0c;可以使用 &運算符取變量的地址&#xff0c;將其賦給指針變量。 int a 2; int *p &a;同時因為C/C中數組是連續存儲…

Java實現插入排序算法

插入排序算法 &#xff08;1&#xff09;概念&#xff1a;通過構建有序序列&#xff0c;對于未排序數據&#xff0c;在已排序序列中從后向前掃描&#xff0c;找到相應的位置并插入。 &#xff08;2&#xff09;一個通俗的比喻&#xff1a; 插入排序就類似于斗地主時&#xf…

CloudCompare 二次開發(23)——計算兩點云之間的放縮倍數

目錄 一、概述二、代碼集成三、結果展示一、概述 使用CloudCompare編程實現計算兩點云之間的放縮倍數。具體計算原理見:。 二、代碼集成 1、mainwindow.h文件public中添加: void doActionComputeScale(); // 計算兩點云的放縮倍數2、mainwindow.cpp文件void MainWin…

vue-element使用html2canvas實現網頁指定區域(指定dom元素)截圖

直接上代碼&#xff1a; <template><el-dialog :visible.sync"printDialogVisible" width"1000px" :close-on-click-modal"false" append-to-body><template><div :id"print_content" ref"print_content&q…

Python網絡爬蟲的基礎理解-對應的自我理解誤區

##通過一個中國大學大學排名爬蟲的示例進行基礎性理解 以軟科中國最好大學排名為分析對象&#xff0c;基于requests庫和bs4庫編寫爬蟲程序&#xff0c;對2015年至2019年間的中國大學排名數據進行爬取&#xff1a;&#xff08;1&#xff09;按照排名先后順序輸出不同年份的前10…

Linux下通過find找文件---通過修改時間查找(-mtime)

通過man手冊查找和-mtime選項相關的內容 man find | grep -A 3 mtime # 這里簡單介紹了 -mtime &#xff0c;還有一個簡單的示例-mtime n Files data was last modified n*24 hours ago. See the comments for -atime to understand how rounding affects the interpretati…