HTML5 Canvas制作数独游戏(三)

news/2024/11/10 10:21:23/

上篇已经实现了点选后给予显示,本篇就开始讲解如何往数独中填入数字。这里使用的是在数独右边区域展示1-9数字,选择数字后自动填入。
那这1-9数字也得画出来,那就需要第3块画布了。添加标签如下(当然这里的边框是不需要的,等画完这块区域后可以去掉)。

<div id="divC"><canvas id="canC" width="60" height="540" style="border: 2px green solid;"></canvas></div>

并将展示的1-9数字区域,固定在数独右侧。css样式如下。

#divC {position:absolute;left : 50%;margin:0 300px;
}

准备好后,就可以开始绘制了。先获取一个存储了数字1-9的数组。

function getAllNumArr(min, max){//获取1-9数字数组let arrA = [];for(let i = min, j = 0; i <= max; i++,j++){arrA[j] = i;//1-9顺序数组}return arrA;
}

然后竖向按顺序绘制1-9数字,并将底色设置成斑马线,好区分每个格子。

function drawAllNum(pen, w, h){//竖向绘制1-9数字pen.font = "30px 微软雅黑";pen.textAlign = "center";let arrA = getAllNumArr(1, 9);for(let i = 0; i < arrA.length; i++){if(i%2 == 0){pen.fillStyle = "rgba(0, 0, 255, 0.1)";} else {pen.fillStyle = "rgba(255, 255, 0, 0.1)";}pen.fillRect(0, h/9*i, w, h/9);pen.fillStyle = "blueviolet";pen.fillText(arrA[i]+"", w/2, h/9*i+h/9/3*2);}
}

调用函数,完成绘制。

let penC = canC.getContext('2d');
drawAllNum(penC, w/9, h);

运行代码,效果如下。
在这里插入图片描述
此时已经显示好了待输入的数字,但每次点击在不可编辑块时,这些数字也在,可能误导玩家。可以控制下,只有选择的是可编辑区才显示画布C,否则就不显示。
这就需要在画布B的点击事件中添加代码(省略代码是之前写过的)。

//点击选中方块==>操作画布B
let penB = canB.getContext('2d');
let lastXY = [];//记录上次点击的方块
let penC = canC.getContext('2d');
let myFlag = false;//C区有没有图。true有图,false无图
canB.onclick = function (e) {//清除上次绘制的方块...//绘制本次选中的块...//绘制或清除C区if(arr[blockj][blocki] == 0 && !myFlag){//选中框能修改时,C区绘制1-9数字drawAllNum(penC, w/9, h);myFlag = true;} else if(arr[blockj][blocki] != 0){//清理C区penC.clearRect(0, 0, w/9, h);myFlag = false;}
}

运行效果如下。
在这里插入图片描述
现在就可以开始实现将数字填入格子中了。数字填入后可以要能修改的,并且清除数字填入新数字时,选择底色块不能受影响。那就用到了第4块画布,当然同第1/2块一样重叠起来。
先添加标签,变更如下(这里需要注意的是,画布B有关联的点击事件,所以标签需要放在画布A和画布D的下面。画布C区域不受影响,放哪都可以)。

<div id="div1"><div id="divA"><canvas id="canA" width="540" height="540"></canvas></div><div id="divD"><canvas id="canD" width="540" height="540"></canvas></div><div id="divB"><canvas id="canB" width="540" height="540"></canvas></div><div id="divC"><canvas id="canC" width="60" height="540"></canvas></div></div>

画布D的CSS样式,与第1/2块画布一样。

#divA,#divB,#divD {...
}

最后添加代码实现点击画布D的数字填入选择的格子中。

//点击选中右侧数字方块==>点击画布C,操作画布D
let penD = canD.getContext('2d');
canC.onclick = function (e) {if(lastXY.length != 0){//需要选中方块let myi = lastXY[1];let myj = lastXY[0];if(arr[myi][myj] == 0){//数组该值等于0才能填入新值//绘制本次选中的块var e = event || window.event;let blocki = Math.floor(e.offsetX/(w/9));let blockj = Math.floor(e.offsetY/(h/9));penD.clearRect(w/9*lastXY[0], h/9*lastXY[1], w/9, h/9);penD.font = "30px 微软雅黑";penD.textAlign = "center";penD.fillStyle = "blueviolet";penD.fillText(blockj+1+"", w/9*myj+w/9/2, h/9*myi+h/9/3*2);}}
}

完成后,运行效果如下。
在这里插入图片描述
到这里,其实就相当于可以开始玩数独了,但每次数独变化需要手动改代码中的数组,那这里就需要能自动生成一个数独了。
下一篇就讲一个最简单的算法。有兴趣或者有想法的也可以自己完成这个数独生成的算法。


http://www.ppmy.cn/news/380144.html

相关文章

数独游戏 | c++ | BFS

零、今天是10月5号&#xff0c;我写出了数独游戏的解啦&#xff01; 一、题目描述&#xff08;伪&#xff09; 输入一个未解的数独盘&#xff0c;输出它的结果。 Input 共9行&#xff0c;每行9个数字&#xff08;数字之间没有空格&#xff09; 备注&#xff1a;如果这一格已经填…

Linux数独小游戏C语言,发一个自己制作的数独游戏代码!

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 void draw(int i,int j) {setcolor(5); rectangle(45j*30,45i*30,36(j1)*30,36(i1)*30); } void guding(int i,int j) { setcolor(14); rectangle(45j*30,45i*30,36(j1)*30,36(i1)*30); } void undraw(int i,int j) {setcolor(0);…

HTML5 Canvas制作数独游戏(四)

那现在就开始本篇内容&#xff1a;通过一个简单的算法自动获取数独需要的二维数组。虽然和canvas没太大关系&#xff0c;但是做游戏嘛&#xff0c;总是需要算法的。 首先初始化一个99的数组&#xff0c;全部填入初始值0。 function getArrInit(rowA, colB){//获取9*9的数组&am…

python可以数独游戏吗_如何用Python创建数独游戏

你可以生成一个随机数独解决方案板&#xff0c;在那里所有的数字都被填写&#xff0c;然后删除其中一些&#xff0c;以创建拼图。这将确保谜题始终有一个解决方案。确保它只有一个解决方案会更具挑战性(提示&#xff1a;一个9x9数独游戏必须至少留下17个数字) 下面的算法将立即…

c 语言写数独游戏,经典数独游戏+数独求解器—纯C语言实现

【转】NGUI研究院之三种方式监听NGUI的事件方法(七) NGUI事件的种类很多,比如点击.双击.拖动.滑动等等,他们处理事件的原理几乎万全一样,本文只用按钮来举例. 1.直接监听事件 把下面脚本直接绑定在按钮上,当按钮点击时就可以监听到,这种方法不太好很不 ... PHP解释器引擎执行流…

html数独游戏源代码,数独游戏求解程序(附源代码)

数独游戏规则 是一种源自18世纪末瑞士的数学智力拼图游戏。拼图是九宫格(即3格宽3格高)的正方形状,每一格又细分为一个九宫格。在每一个小九宫格中,分别填上1至9的数字,让整个大九宫格每一列、每一行的数字都不重复。 数独的玩法逻辑简单,数字排列方式千变万化。不少教育者…

C++实现数独游戏

问题描述&#xff1a; 数独&#xff08;Sudoku&#xff09;是一款大众喜爱的数字逻辑游戏。玩家需要根据9X9盘面上的已知数字&#xff0c;推算出所有剩余空格的数字&#xff0c;并且满足每一行、每一列、每一个3X3粗线宫内的数字均含1-9&#xff0c;并且不重复。 例如&#xf…

winform数独C#的数独游戏

功能描述 winform数独C#的数独游戏 本程序基于.netframework使用C#语言开发&#xff0c;实现功能&#xff1a; 1、各个难度随机出题(New)&#xff1b; 2、数独解题提示(Compute)&#xff1b; 3、输入的合法性校验&#xff1b; 思路分享 说一下开发步骤及思路&#xff1a; 1、…