一笔画完C语言程序寻找路径算法

过年这几天疫情严重,哈哈,想必各位在家也是闲得慌。
于是,玩了一款叫 “一笔画完” 的游戏打发时间,要求从起点一笔连接所有格子,不能重复,不能空格。
有些关卡还真是意想不到,于是想到能不能用计算机去帮我找路径,间接“开挂”,哈哈。
游戏界面截图如下:(其中一个关卡,用来测试程序)在这里插入图片描述
废话不多说,来看代码:(vc++6.0写的)
代码说明:程序比较短,但实测是可以用的,还未发现不能通关的。主要利用的是穷举法。难度等级默认是6,如果超过了这个难度的可以更改#define L后面的值,上限127,因为定义的行列是char型。这里还用到了setjmp();跳转,与goto不同的是,setjmp();可实现函数间的跳转(具体使用方法其他博客上有,我就不说明了哈)。

#include <stdio.h>
#include <setjmp.h>  //用于setjmp跳转的头文件

#define L 6	    //初始化行列数,上限127
			
char i,j,p;		//p用于记录路径步数
jmp_buf buf;

unsigned char check();
void next_step (char,char);
/******路径迷宫,0:空白  1:待连路径    2:起点*******/
unsigned char a[L][L]={
   
						0,0,1,0,0,0,
						1,1,1,1,0,0,
						1,1,0,1
  • 7
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
在实现一笔画的过程中,需要准备一个包含了所有关键点的数组,例如: ```javascript var points = [ [100, 100], [200, 100], [200, 200], [100, 200], ]; ``` 接着,在画布上绘制这些关键点: ```javascript var ctx = wx.createCanvasContext('myCanvas'); points.forEach(function (point, index) { ctx.beginPath(); ctx.arc(point[0], point[1], 10, 0, Math.PI * 2, true); ctx.closePath(); ctx.fillStyle = '#000'; ctx.fill(); }); ctx.draw(); ``` 接下来,需要监听触摸事件,并记录下触摸点的位置: ```javascript var lastX = 0; var lastY = 0; var isDrawing = false; wx.createSelectorQuery().select('#myCanvas').fields({ node: true, size: true }).exec(function (res) { var canvas = res[0].node; var ctx = canvas.getContext('2d'); var width = res[0].width; var height = res[0].height; canvas.addEventListener('touchstart', function (e) { var x = e.touches[0].clientX; var y = e.touches[0].clientY; points.forEach(function (point, index) { if (Math.abs(x - point[0]) < 10 && Math.abs(y - point[1]) < 10) { lastX = point[0]; lastY = point[1]; isDrawing = true; } }); }); canvas.addEventListener('touchmove', function (e) { if (!isDrawing) { return; } var x = e.touches[0].clientX; var y = e.touches[0].clientY; ctx.beginPath(); ctx.moveTo(lastX, lastY); ctx.lineTo(x, y); ctx.stroke(); lastX = x; lastY = y; }); canvas.addEventListener('touchend', function (e) { isDrawing = false; var isComplete = true; points.forEach(function (point, index) { if (Math.abs(lastX - point[0]) < 10 && Math.abs(lastY - point[1]) < 10) { points.splice(index, 1); isComplete = false; } }); if (isComplete) { wx.showToast({ title: '恭喜你成了一笔画', icon: 'success', duration: 2000 }); } }); }); ``` 在触摸事件中,判断当前触摸点是否在关键点的范围内,如果是,则记录下该点的位置,并将 isDrawing 设置为 true,表示正在绘制。在移动事件中,如果 isDrawing 为 true,则绘制一条连接上一个点和当前点的线段。在结束事件中,判断当前触摸点是否在关键点的范围内,如果是,则从关键点数组中删除该点,并判断是否还有未连接的关键点,如果没有,则表示一笔画已经成,弹出提示框。 最后,需要在画布上绘制连线的线段: ```javascript ctx.beginPath(); points.forEach(function (point, index) { if (index === 0) { ctx.moveTo(point[0], point[1]); } else { ctx.lineTo(point[0], point[1]); } }); ctx.stroke(); ``` 这样,一个简单的一笔画的微信小程序成了。整示例代码如下: ```javascript var points = [ [100, 100], [200, 100], [200, 200], [100, 200], ]; var lastX = 0; var lastY = 0; var isDrawing = false; wx.createSelectorQuery().select('#myCanvas').fields({ node: true, size: true }).exec(function (res) { var canvas = res[0].node; var ctx = canvas.getContext('2d'); var width = res[0].width; var height = res[0].height; canvas.addEventListener('touchstart', function (e) { var x = e.touches[0].clientX; var y = e.touches[0].clientY; points.forEach(function (point, index) { if (Math.abs(x - point[0]) < 10 && Math.abs(y - point[1]) < 10) { lastX = point[0]; lastY = point[1]; isDrawing = true; } }); }); canvas.addEventListener('touchmove', function (e) { if (!isDrawing) { return; } var x = e.touches[0].clientX; var y = e.touches[0].clientY; ctx.beginPath(); ctx.moveTo(lastX, lastY); ctx.lineTo(x, y); ctx.stroke(); lastX = x; lastY = y; }); canvas.addEventListener('touchend', function (e) { isDrawing = false; var isComplete = true; points.forEach(function (point, index) { if (Math.abs(lastX - point[0]) < 10 && Math.abs(lastY - point[1]) < 10) { points.splice(index, 1); isComplete = false; } }); if (isComplete) { wx.showToast({ title: '恭喜你成了一笔画', icon: 'success', duration: 2000 }); } }); ctx.beginPath(); points.forEach(function (point, index) { ctx.beginPath(); ctx.arc(point[0], point[1], 10, 0, Math.PI * 2, true); ctx.closePath(); ctx.fillStyle = '#000'; ctx.fill(); if (index === 0) { ctx.moveTo(point[0], point[1]); } else { ctx.lineTo(point[0], point[1]); } }); ctx.stroke(); }); ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值