用Deepseek寫一個 HTML 和 JavaScript 實現一個簡單的飛機游戲

大家好!今天我將分享如何使用 HTML 和 JavaScript 編寫一個簡單的飛機游戲。這個游戲的核心功能包括:控制飛機移動、發射子彈、敵機生成、碰撞檢測和得分統計。代碼簡潔易懂,適合初學者學習和實踐。

游戲功能概述

  1. 玩家控制:使用鍵盤的??和??鍵控制飛機的左右移動,按下?空格鍵?發射子彈。

  2. 敵機生成:每隔 1 秒生成一個敵機,敵機從屏幕頂部隨機位置向下移動。

  3. 碰撞檢測:子彈擊中敵機后,敵機和子彈都會消失,并增加 10 分;如果玩家飛機與敵機碰撞,游戲結束。

  4. 得分統計:擊中敵機后,得分會顯示在屏幕左上角。

實現步驟

1. HTML 結構

我們使用?<canvas>?元素作為游戲畫布,所有的游戲元素(如飛機、子彈、敵機)都將在畫布上繪制。

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>飛機游戲</title><style>body {margin: 0;overflow: hidden;background-color: #000;}canvas {display: block;margin: 0 auto;background-color: #000;}</style>
</head>
<body><canvas id="gameCanvas"></canvas><script>// JavaScript 代碼將在下面實現</script>
</body>
</html>
2. JavaScript 邏輯

JavaScript 部分負責實現游戲的核心邏輯,包括玩家控制、敵機生成、碰撞檢測和得分統計。

const canvas = document.getElementById('gameCanvas');
const ctx = canvas.getContext('2d');canvas.width = 480;
canvas.height = 640;// 飛機對象
const player = {x: canvas.width / 2 - 25,y: canvas.height - 60,width: 50,height: 50,speed: 5,color: '#00FF00',bullets: [],fire: function() {this.bullets.push({ x: this.x + this.width / 2 - 2.5, y: this.y, width: 5, height: 10, color: '#FF0000' });}
};// 敵機數組
const enemies = [];// 得分
let score = 0;// 監聽鍵盤事件
document.addEventListener('keydown', (e) => {if (e.code === 'ArrowLeft' && player.x > 0) {player.x -= player.speed;}if (e.code === 'ArrowRight' && player.x < canvas.width - player.width) {player.x += player.speed;}if (e.code === 'Space') {player.fire();}
});// 生成敵機
function spawnEnemy() {const x = Math.random() * (canvas.width - 50);enemies.push({ x: x, y: -50, width: 50, height: 50, color: '#0000FF', speed: 2 });
}// 檢測碰撞
function checkCollision(rect1, rect2) {return rect1.x < rect2.x + rect2.width &&rect1.x + rect1.width > rect2.x &&rect1.y < rect2.y + rect2.height &&rect1.y + rect1.height > rect2.y;
}// 更新游戲狀態
function update() {// 移動子彈player.bullets.forEach((bullet, index) => {bullet.y -= 5;if (bullet.y < 0) {player.bullets.splice(index, 1);}});// 移動敵機enemies.forEach((enemy, index) => {enemy.y += enemy.speed;if (enemy.y > canvas.height) {enemies.splice(index, 1);}});// 檢測子彈與敵機的碰撞player.bullets.forEach((bullet, bulletIndex) => {enemies.forEach((enemy, enemyIndex) => {if (checkCollision(bullet, enemy)) {player.bullets.splice(bulletIndex, 1);enemies.splice(enemyIndex, 1);score += 10;}});});// 檢測玩家與敵機的碰撞enemies.forEach((enemy, index) => {if (checkCollision(player, enemy)) {alert('游戲結束!得分:' + score);document.location.reload();}});
}// 繪制游戲元素
function draw() {ctx.clearRect(0, 0, canvas.width, canvas.height);// 繪制玩家飛機ctx.fillStyle = player.color;ctx.fillRect(player.x, player.y, player.width, player.height);// 繪制子彈ctx.fillStyle = '#FF0000';player.bullets.forEach(bullet => {ctx.fillRect(bullet.x, bullet.y, bullet.width, bullet.height);});// 繪制敵機ctx.fillStyle = '#0000FF';enemies.forEach(enemy => {ctx.fillRect(enemy.x, enemy.y, enemy.width, enemy.height);});// 繪制得分ctx.fillStyle = '#FFFFFF';ctx.font = '20px Arial';ctx.fillText('得分: ' + score, 10, 30);
}// 游戲主循環
function gameLoop() {update();draw();requestAnimationFrame(gameLoop);
}// 定時生成敵機
setInterval(spawnEnemy, 1000);// 啟動游戲
gameLoop();
3. 運行游戲

將上述代碼保存為一個?.html?文件,然后在瀏覽器中打開即可運行游戲。你可以使用鍵盤控制飛機,體驗游戲的樂趣!

擴展與優化

這個游戲是一個簡單的示例,你可以在此基礎上進行擴展和優化,例如:

  1. 增加敵機類型:添加不同速度和血量的敵機。

  2. 添加音效:為子彈發射、擊中敵機和游戲結束添加音效。

  3. 提升游戲難度:隨著時間推移,逐漸增加敵機的生成速度和數量。

  4. 添加背景音樂:為游戲增加背景音樂,提升沉浸感。

總結

通過這個簡單的飛機游戲項目,你可以學習到如何使用 HTML 和 JavaScript 實現基本的游戲邏輯,包括玩家控制、碰撞檢測和動態生成游戲元素。希望這篇文章對你有所幫助,也歡迎大家在評論區分享你的改進和優化建議!

如果你對游戲開發感興趣,不妨嘗試擴展這個項目,或者基于此開發更多有趣的游戲!🚀

完整代碼

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>飛機游戲</title><style>body {margin: 0;overflow: hidden;background-color: #000;}canvas {display: block;margin: 0 auto;background-color: #000;}</style>
</head>
<body><canvas id="gameCanvas"></canvas><script>const canvas = document.getElementById('gameCanvas');const ctx = canvas.getContext('2d');canvas.width = 480;canvas.height = 640;// 飛機對象const player = {x: canvas.width / 2 - 25,y: canvas.height - 60,width: 50,height: 50,speed: 5,color: '#00FF00',bullets: [],fire: function() {this.bullets.push({ x: this.x + this.width / 2 - 2.5, y: this.y, width: 5, height: 10, color: '#FF0000' });}};// 敵機數組const enemies = [];// 得分let score = 0;// 監聽鍵盤事件document.addEventListener('keydown', (e) => {if (e.code === 'ArrowLeft' && player.x > 0) {player.x -= player.speed;}if (e.code === 'ArrowRight' && player.x < canvas.width - player.width) {player.x += player.speed;}if (e.code === 'Space') {player.fire();}});// 生成敵機function spawnEnemy() {const x = Math.random() * (canvas.width - 50);enemies.push({ x: x, y: -50, width: 50, height: 50, color: '#0000FF', speed: 2 });}// 檢測碰撞function checkCollision(rect1, rect2) {return rect1.x < rect2.x + rect2.width &&rect1.x + rect1.width > rect2.x &&rect1.y < rect2.y + rect2.height &&rect1.y + rect1.height > rect2.y;}// 更新游戲狀態function update() {// 移動子彈player.bullets.forEach((bullet, index) => {bullet.y -= 5;if (bullet.y < 0) {player.bullets.splice(index, 1);}});// 移動敵機enemies.forEach((enemy, index) => {enemy.y += enemy.speed;if (enemy.y > canvas.height) {enemies.splice(index, 1);}});// 檢測子彈與敵機的碰撞player.bullets.forEach((bullet, bulletIndex) => {enemies.forEach((enemy, enemyIndex) => {if (checkCollision(bullet, enemy)) {player.bullets.splice(bulletIndex, 1);enemies.splice(enemyIndex, 1);score += 10;}});});// 檢測玩家與敵機的碰撞enemies.forEach((enemy, index) => {if (checkCollision(player, enemy)) {alert('游戲結束!得分:' + score);document.location.reload();}});}// 繪制游戲元素function draw() {ctx.clearRect(0, 0, canvas.width, canvas.height);// 繪制玩家飛機ctx.fillStyle = player.color;ctx.fillRect(player.x, player.y, player.width, player.height);// 繪制子彈ctx.fillStyle = '#FF0000';player.bullets.forEach(bullet => {ctx.fillRect(bullet.x, bullet.y, bullet.width, bullet.height);});// 繪制敵機ctx.fillStyle = '#0000FF';enemies.forEach(enemy => {ctx.fillRect(enemy.x, enemy.y, enemy.width, enemy.height);});// 繪制得分ctx.fillStyle = '#FFFFFF';ctx.font = '20px Arial';ctx.fillText('得分: ' + score, 10, 30);}// 游戲主循環function gameLoop() {update();draw();requestAnimationFrame(gameLoop);}// 定時生成敵機setInterval(spawnEnemy, 1000);// 啟動游戲gameLoop();</script>
</body>
</html>

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

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

相關文章

面向高質量視頻生成的擴散模型方法-算法、架構與實現【附核心代碼】

目錄 算法原理 架構 代碼示例 算法原理 正向擴散過程&#xff1a;從真實的視頻數據開始&#xff0c;逐步向其中添加噪聲&#xff0c;隨著時間步 t 的增加&#xff0c;噪聲添加得越來越多&#xff0c;最終將原始視頻數據變成純噪聲。數學上&#xff0c;t 時刻的視頻數據與 t…

水下機器人推進器PID參數整定與MATLAB仿真

水下機器人推進器PID參數整定與MATLAB仿真 1. PID控制原理 目標:通過調節比例(P)、積分(I)、微分(D)參數,使推進器輸出力快速穩定跟蹤期望值。傳遞函數(示例):推進器動力學模型可簡化為: [ G(s) = \frac{K}{\tau s + 1} \cdot e^{-Ts} ] 其中:K為增益,τ為時間常…

游戲引擎學習第149天

今日回顧與計劃 在今天的直播中&#xff0c;我們將繼續進行游戲的開發工作&#xff0c;目標是完成資產文件&#xff08;pack file&#xff09;的測試版本。目前&#xff0c;游戲的資源&#xff08;如位圖和聲音文件&#xff09;是直接從磁盤加載的&#xff0c;而我們正在將其轉…

Java函數式接口四部曲之Consumer

Consumer 是一個函數式接口&#xff0c;位于 java.util.function 包中。它表示一個接受單個輸入參數并且不返回任何結果的操作。Consumer 通常用于需要對輸入參數執行某些操作但不產生返回值的場景。 Consumer 接口定義了一個抽象方法&#xff1a;accept(T t)&#xff1a;接受…

ForceMimic:以力為中心的模仿學習,采用力運動捕捉系統進行接觸豐富的操作

25年3月來自上海交大盧策吾教授團隊的論文“ForceMimic: Force-Centric Imitation Learning with Force-Motion Capture System for Contact-Rich Manipulation”。 在大多數接觸豐富的操作任務中&#xff0c;人類會將隨時間變化的力施加到目標物體上&#xff0c;以補償視覺引…

【愚公系列】《Python網絡爬蟲從入門到精通》045-Charles的SSL證書的安裝

標題詳情作者簡介愚公搬代碼頭銜華為云特約編輯&#xff0c;華為云云享專家&#xff0c;華為開發者專家&#xff0c;華為產品云測專家&#xff0c;CSDN博客專家&#xff0c;CSDN商業化專家&#xff0c;阿里云專家博主&#xff0c;阿里云簽約作者&#xff0c;騰訊云優秀博主&…

vulnhub靶場【digitalworld.local系列】的electrical靶機

前言 靶機&#xff1a;digitalworld.local-electrical&#xff0c;IP地址為192.168.10.12&#xff0c;后期因為卡頓&#xff0c;重新安裝&#xff0c;ip地址后面為192.168.10.11 攻擊&#xff1a;kali&#xff0c;IP地址為192.168.10.6 kali采用VMware虛擬機&#xff0c;靶機…

macos 程序 運行

sudo xattr -r -d com.apple.quarantine [/Applications/Name]使用stow 管理配置文件

多視圖幾何--結構恢復--三角測量

三角測量 1. 核心公式推導 假設兩個相機的投影矩陣為 P P P 和 P ′ P P′&#xff0c;對應的匹配圖像點(同名點)為 ( u , v ) (u, v) (u,v) 和 ( u ′ , v ′ ) (u, v) (u′,v′)&#xff0c;目標是求解三維點 X [ X x , X y , X z , 1 ] T X [X_x, X_y, X_z, 1]^T X…

共享內存的原理和創建

目錄 共享內存的原理 共享內存的創建 代碼實現創建 共享內存的管理指令 我們今天來學習共享內存&#xff01;&#xff01;&#xff01; 共享內存的原理 兩個進程同時使用內存中開辟的共享空間進行通信就是建立并使用共享內存進行進程間的通信。System V 共享內存&#xf…

3.10[A]cv

核心模塊&#xff1a; rasterizer&#xff1a;光柵化器&#xff0c;負責三角形遍歷和像素繪制Shader&#xff1a;包含頂點著色器和多種片元著色器Texture&#xff1a;紋理處理模塊 頂點著色器的計算量一般遠小于片元著色器。因為組成三角形的頂點相對有限&#xff0c;而片元需…

mac使用Homebrew安裝miniconda(mac搭建python環境),并在IDEA中集成miniconda環境

一、安裝Homebrew mac安裝brew 二、使用Homebrew安裝miniconda brew search condabrew install miniconda安裝完成后的截圖&#xff1a; # 查看是否安裝成功 brew list環境變量&#xff08;無需手動配置&#xff09; 先執行命令看能不能正常返回&#xff0c;如果不能正常…

多視圖幾何--相機標定--從0-1理解張正友標定法

1基本原理 1.1 單應性矩陣&#xff08;Homography&#xff09;的建立 相機模型&#xff1a;世界坐標系下棋盤格平面&#xff08;Z0&#xff09;到圖像平面的投影關系為&#xff1a; s [ u v 1 ] K [ r 1 r 2 t ] [ X Y 1 ] s \begin{bmatrix} u \\ v \\ 1 \end{bmatrix} K…

WWDG窗口看門狗原理

WWDG&#xff08;窗口看門狗&#xff09;在窗口期喂狗 作用&#xff1a; 原理&#xff1a; 框圖 WWDG寄存器&#xff1a; WWDG_CR控制寄存器 WWDG_CFR配置寄存器 狀態寄存器WWDG_SR 超時時間計算公式 最小最大超時值 HAL配置函數&#xff1a; 1. IWDG 和 WWDG 的區別 IWDG&…

無公網IP也能遠程控制Windows:Linux rdesktop內網穿透實戰

文章目錄 前言1. Windows 開啟遠程桌面2. Linux安裝rdesktop工具3. Win安裝Cpolar工具4. 配置遠程桌面地址5. 遠程桌面連接測試6. 設置固定遠程地址7. 固定地址連接測試 前言 如今遠程辦公已經從一種選擇變成了許多企業和個人的必修課&#xff0c;而如何在Linux系統上高效地訪…

Pygame實現射擊鴨子游戲3-2

2 鴨子類Target的創建 2.1 __init__()函數 Target類的__init__()函數代碼如圖5所示。 圖5 __init__()函數代碼 其中&#xff0c;第18行將Target類聲明為pygame.sprite.Sprite類的子類&#xff1b;第19行代碼中&#xff0c;__init__()函數的img_path參數表示鴨子圖片的文件名…

利用Java爬蟲獲取衣聯網商品詳情:實戰指南

在電商領域&#xff0c;獲取商品詳情是數據分析和市場研究的重要環節。衣聯網作為知名的電商平臺&#xff0c;提供了豐富的服裝商品資源。本文將詳細介紹如何利用Java編寫爬蟲程序&#xff0c;通過商品ID獲取衣聯網商品詳情。 一、準備工作 &#xff08;一&#xff09;環境搭…

五、OpenGL中Shader與C++數據傳輸

文章目錄 一、概述二、Shader 代碼文件的基本格式三、Shader的向量語法介紹四、Shader之間的數據傳輸五、Shader與C的數據傳輸uniform六、完整示例 一、概述 在 OpenGL 中&#xff0c;Shader&#xff08;著色器&#xff09;使用 GLSL&#xff08;OpenGL Shading Language&…

【3DMAX插件】3DMAX建筑大師插件MasterBuilder使用方法

3DMAX建筑大師插件是一款專為3DMAX設計的程序化&#xff08;參數化&#xff09;建筑建模工具&#xff0c;其最大特點是能夠一鍵生成建筑模型&#xff0c;極大地提升了工作效率。該插件配備了多種結構控制選項&#xff0c;涵蓋陽臺、門窗、欄桿、樓頂水塔等附屬建筑元素&#xf…

隱私保護在 Facebook 用戶身份驗證中的應用

在這個數字化的時代&#xff0c;個人隱私保護成為了公眾關注的焦點。社交媒體巨頭 Facebook 作為全球最大的社交平臺之一&#xff0c;擁有數十億用戶&#xff0c;其在用戶身份驗證過程中對隱私保護的重視程度直接影響著用戶的安全感和信任度。本文將探討 Facebook 在用戶身份驗…