首页 > 其他分享 >vue3开发扫雷游戏,支持调整难度,支持计时

vue3开发扫雷游戏,支持调整难度,支持计时

时间:2024-11-13 15:56:58浏览次数:1  
标签:const color cells vue3 value cell let 支持 计时

闲来练习练习js,写了个扫雷游戏,直接拿去复制粘到自己本地某个html文件里就能运行,记得把vue加载地址改成线上的~~

有空了可以再加上计分板

运行起来长下面这样

 直接上代码

 

  1 <!DOCTYPE html>
  2 <html lang="en">
  3 <head>
  4     <meta charset="UTF-8">
  5     <meta name="viewport" content="width=device-width, initial-scale=1.0">
  6     <title>扫雷v1.0</title>
  7     <!-- <script src="https://unpkg.com/vue@3/dist/vue.global.js"></script> -->
  8     <script src="vue.global-v3.5.12.js"></script>
  9     <style>
 10         *{ margin:0; padding:0; font-size:14px; color:#333;}
 11         body{ padding: 20px; }
 12         .container{
 13             background-color: #efefef;
 14             padding: 10px;
 15             display: flex;
 16         }
 17         .warper{
 18             padding:1px;
 19             background-color: #cfcfcf;
 20         }
 21         .row{
 22             display: flex;
 23             flex-direction: row;
 24         }
 25         .cell{
 26             width: 30px;
 27             text-align: center;
 28             height: 30px;
 29             line-height: 30px;
 30             background-color: #dfdfdf;
 31             border: 2px solid #cfcfcf;
 32         }
 33         .cell:hover{
 34             border-color:rgb(250, 179, 112);
 35             background-color: rgb(231, 202, 164);
 36             cursor: pointer;
 37         }
 38         .board{
 39             width: 170px;
 40             margin-right: 20px;
 41         }
 42         .config-item{
 43             padding:10px;
 44         }
 45         .config-item .btn{
 46             margin-right: 20px;
 47         }
 48         .cell.clicked-0{ background-color: #f7f7f7; }
 49         .cell.clicked-1{ background-color: #fff0f0; }
 50         .cell.clicked-2{ background-color: #ffdbdb; }
 51         .cell.clicked-3{ background-color: #ffc3c3; }
 52         .cell.clicked-4{ background-color: #ffa3a3; }
 53         .cell.clicked-5{ background-color: #ff9898; color: white; }
 54         .cell.clicked-6{ background-color: #ff6f6f; color: white; }
 55         .cell.clicked-7{ background-color: #ff5a5a; color: white; }
 56         .cell.clicked-8{ background-color: #ff2424; color: white; }
 57         .cell.boom{ background-color: #ffffff; color: rgb(255, 0, 0); font-size:22px;}
 58         .cell.flag{ border-color: #fdafaf; }
 59     </style>
 60 </head>
 61 <body>
 62     <div class="container" id="app">
 63         <div class="board">
 64             <div class="config-item">
 65                 <h3>请点击START开始游戏</h3>
 66                 <h3>点击RESET重置游戏</h3>
 67             </div>
 68             <div class="config-item">
 69                 <form>
 70                     <label for="rowsindex">难度</label>
 71                     <select v-model="currentLevel" @change="handleLevelChange">
 72                         <option v-for="(level, index) in levels" :key="index" :value="level">{{ level.name }}</option>
 73                     </select>
 74                 </form>
 75             </div>
 76             <div class="config-item">
 77                 用时 <strong>{{ costTime }}</strong>
 78             </div>
 79             <div class="config-item">
 80                 <button class="btn" @click="resetGame">RESET</button>
 81                 <button class="btn" :disabled="gameStatus == 'start'" @click="startGame">START</button>
 82             </div>
 83         </div>
 84         <div class="warper">
 85             <div class="row" v-for="(row, indexRow) in cells" :key="indexRow">
 86                 <div 
 87                     v-for="(column, indexColumn) in cells[indexRow]" 
 88                     :key="indexColumn" 
 89                     :class="'cell '+column.style" 
 90                     @click="handleCellClick(indexRow, indexColumn)"
 91                     @click.right.prevent="handleCellFlag(indexRow, indexColumn)"
 92                 >
 93                     {{ column.text }}
 94                 </div>
 95             </div>
 96         </div>
 97     </div>
 98 
 99 <script>
100     const { createApp, ref, computed, nextTick } = Vue
101     createApp({
102         setup() {
103             const boomValue = 332962963;
104             const levels = ref([
105                 { name: '黑铁', rowsindex: 8, columnsindex: 8, boomCount: 6 },
106                 { name: '青铜', rowsindex: 10, columnsindex: 10, boomCount: 11 },
107                 { name: '白银', rowsindex: 14, columnsindex: 14, boomCount: 20 },
108                 { name: '黄金', rowsindex: 16, columnsindex: 16, boomCount: 28 },
109                 { name: '白金', rowsindex: 20, columnsindex: 20, boomCount: 44 },
110                 { name: '钻石', rowsindex: 24, columnsindex: 24, boomCount: 60 },
111                 { name: '大师', rowsindex: 30, columnsindex: 30, boomCount: 95 },
112                 { name: '王者', rowsindex: 36, columnsindex: 36, boomCount: 120 }
113             ]);
114             const currentLevel = ref(levels.value[0]);
115 
116             let rowsindex = currentLevel.value.rowsindex;
117             let columnsindex = currentLevel.value.columnsindex;
118             let boomCount = currentLevel.value.boomCount;
119 
120             const start = 0;
121             let end = computed(()=>{
122                 return rowsindex*columnsindex-1;
123             })
124             const gameStatus = ref("stop");
125             const costTime = ref("00:00:00");
126             let timer;
127             let startTime = 0;
128 
129             const cells = ref([]);
130             let randoms = [];
131             let rightsZero = [];
132 
133             const startGame = () => {
134                 gameStatus.value = "start";
135                 startTimer();
136                 initGame();
137             }
138 
139             const resetGame = () => {
140                 gameStatus.value = "stop";
141                 stopTimer();
142                 resetTimer();
143                 initGame();
144             }
145 
146             const handleLevelChange = () => {
147                 console.log(currentLevel.value)
148                 resetGame();
149             }
150 
151             const handleCellClick = (i, j) => {
152                 if(gameStatus.value!=='start'){
153                     return;
154                 }
155 
156                 if(cells.value[i][j].value != boomValue){
157                     rightsZero = [];
158                     clickRights(i, j);
159                     for(let i=0; i<rightsZero.length; i++){
160                         let [rowIndex, columnIndex] = getRowIndexColumnIndex(rightsZero[i]);
161                         cells.value[rowIndex][columnIndex] = getCellClickedInfo(rowIndex, columnIndex);
162                     }
163                     ifWin();
164                 }else{
165                     cells.value[i][j] = {style:'boom', clicked: true, text: '⭕️', value: boomValue};
166                     finishGame();
167                 }
168             }
169 
170             const handleCellFlag = (i, j) => {
171                 if(gameStatus.value!=='start'){
172                     return;
173                 }
174                 
175                 let cell = cells.value[i][j];
176                 if(cell.clicked){
177                     return;
178                 }
179                 if(cell.style === 'flag'){
180                     cells.value[i][j] = {style:'unClicked', clicked: false, text: '', value: cell.value};
181                 }else{
182                     cells.value[i][j] = {style:'flag', clicked: false, text: '

标签:const,color,cells,vue3,value,cell,let,支持,计时
From: https://www.cnblogs.com/leesen/p/18544170

相关文章

  • (系列十一)Vue3框架中路由守卫及请求拦截(实现前后端交互)
    说明  该文章是属于OverallAuth2.0系列文章,每周更新一篇该系列文章(从0到1完成系统开发)。   该系统文章,我会尽量说的非常详细,做到不管新手、老手都能看懂。   说明:OverallAuth2.0是一个简单、易懂、功能强大的权限+可视化流程管理系统。友情提醒:本篇文章是属于系......
  • 网页全终端安防视频流媒体播放器EasyPlayer.js无插件H5播放器包含的直播协议支持(封装
    EasyPlayer.jsH5播放器,是一款能够同时支持HTTP、HTTP-FLV、HLS(m3u8)、WS、WEBRTC、FMP4视频直播与视频点播等多种协议,支持H.264、H.265、AAC、G711A、Mp3等多种音视频编码格式,支持MSE、WASM、WebCodec等多种解码方式,支持Windows、Linux、Android、iOS全平台终端的H5播放器,使用简单......
  • Vue3 -- 项目配置之eslint【企业级项目配置保姆级教程1】
    下面是项目级完整配置1➡eslint:【吐血分享,博主踩过的坑你跳过去!!跳不过去?太过分了给博主打钱】浏览器自动打开项目:你想释放双手吗?你想每天早上打开电脑运行完项目自动在浏览器打开吗?不要9998,不要998,只要你在我们爱的package.json中配置一下即可显示。如下图所示:是的......
  • vue3使用tsParticles实现爆开五彩碎纸屑动效,简单高效免费(撒花特效、粒子效果)
    实现效果:tsParticles|ConfettiPreset|JavaScriptParticles,ConfettiandFireworksanimationsforyourwebsitetsParticles-Easilycreatehighlycustomizableparticles,confettiandfireworksanimationsandusethemasanimatedbackgroundsforyourweb......
  • 国标GB28181视频平台LiteGBS国标GB28181软件多协议支持与灵活应用解析
    LiteGBS国标GB28181视频平台是一款基于云-边-端一体化架构的视频融合与AI智能分析平台,广泛应用于工地、仓储、工厂、社区、校园、楼宇等多个领域。凭借其强大的数据接入、处理、转码和分发能力,LiteGBS国标GB28181软件平台在视频监控领域展现出显著的技术优势和广阔的应用前景。本......
  • CVPR截稿倒计时|无问芯穹Infini-AI超级算力周延长
    随着CVPR2025的投稿截止日期(11月14日)的临近,科研人员正全力以赴进行最后的冲刺。为了帮助大家轻松应对这一关键时刻,无问芯穹Infini-AI异构云平台特别延长了“超级算力周”活动,活动日期直至11月15日。现在,您只需支付每小时0.99元的优惠价格,即可享受到搭载4090显卡的高性能......
  • 推荐一个.NetCore开源的CMS项目,功能强大、扩展性强、支持插件的系统!
    推荐一个基于.NetCore开发的开源CMS项目,该项目功能完善、涉及知识点比较多,不管是作为二次开发、还是学习都是不错的选择。01项目简介Cofoundry是基于.Net开发的、代码优先开发、具备可扩展且灵活的架构、简单易用的内容管理系统。02项目框架1、基于.Net8开发。2、数据......
  • EHOME视频平台EasyCVR宇视设备视频平台支持海康ehome/SDK接入:EHOME协议(ISUP协议)有什么
    在数字化转型的浪潮中,视频监控系统已成为保障公共安全、提升管理效率的重要工具。特别是在大中型项目中,跨区域网络化的视频监控集中管理平台的需求日益增长。EasyCVR视频监控汇聚管理平台,作为TSINGSEE青犀视频的核心产品,正是为了满足这一市场需求而设计的。它不仅集成了视频资源......
  • XHEDITOR编辑支持WORD内容和截图的复制黏贴
    编辑器:xhEditor前端:vue2,vue3,vue-cli,html5后端:asp,php,jsp,springboot,asp.net,.netcore功能:复制粘贴word内容图片,要求:免费,开源,技术支持最近搞定块挻火的,今天早上又有网友加我微信私聊,也是想了解这块的技术和方案。昨天晚上论坛里面的一个网友给我发私信,想了解一下......
  • 在Active Directory(AD)域控环境下,推送安装软件并实现静默安装,通常有几种方法可以实现。
    在ActiveDirectory(AD)域控环境下,推送安装软件并实现静默安装,通常有几种方法可以实现。根据你的需求,这里介绍几种常见的方式,它们支持EXE、MSI等多种安装包格式,并且可以实现静默安装。1. 组策略(GroupPolicy)部署组策略是AD域环境中部署软件的一种常见方式。它特别适合MSI安装包。......