求六宫格数独题目及解答解答

数独求解_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!查看: 2071|回复: 20
UID467225注册时间最后登录在线时间138 小时阅读权限30积分561精华0
红盟学员, 积分 561, 距离下一级还需 139 积分
TA的每日心情郁闷 18:11:50签到天数: 81 天[LV.6]常住居民II金钱1007 UID467225注册时间最后登录在线时间138 小时阅读权限30积分561精华0
&&注:鉴于VB简单易用,游戏开发部分代码全部用VB来写(你有兴趣,了解了思路可以用C++来写),又由于C语言的灵活性,编程求解数独的算法全部用C语言来写。不知道什么是九宫格数独的麻烦百度一下,这么著名的游戏,开发游戏部分参考了部分资料,但数独的编程解法均为独立完成。
首先上完成图,只有一个主体哦,想增加难度或者各种其他功能,请各位尽情发挥:
一,& & & & 数独数字的布局生成
数独数字的布局生成是游戏开发的重点。9x9的二维数组n存储数独游戏所有行列的数字。9x9的一维数组t存储每个位置尝试填充的次数,如果某个位置填充超过9次,则表明该位置已经卡住,退回处理。退回处理的原则是:如果不是第一列,则先倒退到前一列,否则倒退到前一行的最后一列。例如,(2,3)处尝试填充的次数超过9次,则说明1~9的数字都已经尝试,不符合游戏规则的要求,则倒退到前一列(2,2)处。如果(2,0)处尝试填充的次数超过9次,则说明1~9的数字都已经尝试,不符合游戏规则要求,则倒退到前一列(1,8)处。
游戏如何知道(i,j)处以前尝试过哪些数字呢?此处采用一个技巧。因为尝试的数字为1~9,第一次尝试随机产生的1~9数即可,第二次则是第一次尝试过的数字加一,以此类推。如果加到10则变为1。直到尝试超过9次。
具体方法是判断n(i,j)=0,如果是则第一次尝试,随机产生1~9数且存储到n(i,j);否则n(i,j)&0,说明(i,j)处以前尝试过,且尝试的数字是存储到n(i,j)的数字k,如果继续尝试的话则可以k+1即可。如果k+1到10则变为1。直到尝试超过9次。
二,& & & & 游戏界面的生成
& && && &窗体上所有的显示数字的按钮控件都不需要手工添加,它们是程序窗体加载时调用PrintButtons()动态添加的。需要填写的数字按钮有效,而不需要填写的数字按钮无效。这个过程是随机的,从random,Next(0,2)随机获取(0,1)的数字,如果产生的是0,则此按钮显示数字而此按钮无效,否则不显示数字但此按钮有效。
三、关键技术
& && & 1、动态添加数独数字按钮
& && && & 用new来建立Button空间,同时通过代码设置好控件大小,位置等属性,然后用me.controls.add方法添加到窗体上自身控件数字Conrtrols中: Dim random As New Random()
& && &&&Dim rdsd As New RandomSuDo()
& && &&&Dim shuzi As String = rdsd.SuDoMake()
& && &&&For i As Integer = 0 To 8
& && && && &For j As Integer = 0 To 8
& && && && && & Dim b As New Button()
& && && && && & '创建一个新的按钮
& && && && && & b.Width = 50
& && && && && & b.Height = 50
& && && && && & Dim r As Integer = random.Next(0, 2)
& && && && && & If r = 0 Then
& && && && && && &&&'此次产生的按钮显示数字
& && && && && && &&&b.Text = shuzi(i * 9 + j).ToString()
& && && && && && &&&b.Enabled = False
& && && && && & End If
& && && && && & Dim font As New Font(&隶书&, 28)
& && && && && & b.ForeColor = Color.Red
& && && && && & b.Font = font
& && && && && & b.Name = &b& & (i + 1) & (j + 1)& && & '用来区别各个按钮的办法
& && && && && & Dim p As Point = New Point(j * 60 + 10, i * 60 + 10)
& && && && && & '创建一个坐标,用来给新的按钮定位
& && && && && & b.Location = p& && && && &'把按钮的位置与刚创建的坐标绑定在一起
& && && && && & Me.Controls.Add(b)& && &&&'向panel中添加此按钮
& && && && && & '将按钮的方法绑定到按钮的键盘和鼠标事件中
& && && && && & AddHandler b.KeyPress, AddressOf btn_keyPress
& && && && && & AddHandler b.MouseMove, AddressOf btn_MouseMove
& && && && && & AddHandler b.MouseUp, AddressOf btn_MouseUp
& && && && &Next
& && &&&Next复制代码2、判断是否为右键单击窗体,代码如下:If e.Button = MouseButtons.Right Then&&'是右键单击
& && && && &For Each c As Control In Me.Controls
& && && && && & If TypeOf c Is Button Then
& && && && && && &&&If c.Name && &btnHelp& Then
& && && && && && && && &'不是帮助,则显示对应数字
& && && && && && && && &c.Text = shuzi(count).ToString()
& && && && && && && && &count += 1
& && && && && && &&&End If
& && && && && & End If
& && && && &Next
& && &&&End If复制代码四、程序完整代码
1、RandomSuDO类部分,用于产生数独游戏的所有行数字形成的字符串,主体部分代码:Public Class RandomSuDo
& & Private m_shuzi As String
& & Public Property Shuzi() As String
& && &&&Get
& && && && &Return m_shuzi
& && &&&End Get
& && &&&Set(ByVal value As String)
& && && && &m_shuzi = value
& && &&&End Set
& & End Property
& & '存储数字的数组
& & Shared n As Integer(,) = New Integer(8, 8) {}
& & '记录每个位置尝试填充的数字次数
& & Dim t As Integer() = New Integer(81) {}
& & Public Function SuDoMake() As String
& && &&&'生成数字
& && &&&Dim Rdm As New Random()
& && &&&For i As Integer = 0 To 8
& && && && &'填充数字
& && && && &For j As Integer = 0 To 8
& && && && && & Do
& && && && && && &&&If n(i, j) = 0 Then
& && && && && && && && &'生成随机数字
& && && && && && && && &n(i, j) = Rdm.Next(1, 10)
& && && && && && &&&Else
& && && && && && && && &Dim k As Integer
& && && && && && && && &k = n(i, j)
& && && && && && && && &n(i, j) = IIf(k + 1 = 10, 1, k + 1)
& && && && && && &&&End If
& && && && && && &&&t(i * 9 + j) += 1
& && && && && && &&&If t(i * 9 + j) = 10 Then
& && && && && && && && &'此处第10次填充,表明该位置已经卡住,退回处理
& && && && && && && && &t(i * 9 + j) = 0 '此处尝试填充的次数置0
& && && && && && && && &n(i, j) = 0 '此处恢复未尝试次数
& && && && && && && && &If j & 0 Then '不是第一列,则退一列
& && && && && && && && && & j -= 2
& && && && && && && && &Else
& && && && && && && && && & '是第一列,则倒退到上一行的最后一列
& && && && && && && && && & i -= 1
& && && && && && && && && & j = 7 '不是j=8;由于步长会加1
& && && && && && && && &End If
& && && && && && && && &Exit Do
& && && && && && &&&End If
& && && && && & Loop Until isCorret(i, j) '(i,j)处填充成功
& && && && &Next
& && &&&Next
& && &&&'输出结果
& && &&&Dim nnn As String = &&
& && &&&For i As Integer = 0 To 8
& && && && &For j As Integer = 0 To 8
& && && && && & nnn = nnn & n(i, j)
& && && && &Next
& && &&&Next
& && &&&Return nnn
& & End Function复制代码isCorret判断是否满足行列、和3x3区域不重复的游戏规则:'是否满足行、列和3x3区域不重复的要求
& & 'row表示行号,col表示列号,return true表示符合要求
& & Public Shared Function isCorret(ByVal row As Integer, ByVal col As Integer) As Boolean
& && &&&Return (checkRow(row) And checkLine(col) And checkNine(row, col))
& & End Function复制代码checkRow判断行是否符合1-9不重复的游戏规则,checkLine判断列,checkNine判断3x3区域:'检测行是否符合要求
& & Public Shared Function checkRow(ByVal row As Integer) As Boolean
& && &&&For j As Integer = 0 To 7
& && && && &If n(row, j) = 0 Then
& && && && && & Continue For
& && && && &End If
& && && && &For k As Integer = j + 1 To 8
& && && && && & If n(row, j) = n(row, k) Then
& && && && && && &&&Return False
& && && && && & End If
& && && && &Next
& && &&&Next
& && &&&Return True
& & End Function
& & '检测列是否符合要求
& & Public Shared Function checkLine(ByVal col As Integer) As Boolean
& && &&&For j As Integer = 0 To 8
& && && && &If n(j, col) = 0 Then
& && && && && & Continue For
& && && && &End If
& && && && &For k As Integer = j + 1 To 8
& && && && && & If n(j, col) = n(k, col) Then
& && && && && && &&&Return False
& && && && && & End If
& && && && &Next
& && &&&Next
& && &&&Return True
& & End Function
& & '检测3x3区域是否符合要求
& & Public Shared Function checkNine(ByVal row As Integer, ByVal col As Integer) As Boolean
& && &&&'获取左上角的坐标
& && &&&Dim j As Integer = (row \ 3) * 3
& && &&&Dim k As Integer = (col \ 3) * 3
& && &&&'循环比较
& && &&&For i As Integer = 0 To 7
& && && && &If n(j + i \ 3, k + i Mod 3) = 0 Then
& && && && && & Continue For
& && && && &End If
& && && && &For m As Integer = i + 1 To 8
& && && && && & If n(j + i \ 3, k + i Mod 3) = n(j + m \ 3, k + m Mod 3) Then
& && && && && && &&&Return False
& && && && && & End If
& && && && &Next
& && &&&Next
& && &&&Return True
& & End Function复制代码
附件: 你需要才可以下载或查看附件。没有帐号?
UID448564注册时间最后登录在线时间393 小时阅读权限50积分1647精华0
红盟成员, 积分 1647, 距离下一级还需 353 积分
TA的每日心情奋斗 14:41:20签到天数: 217 天[LV.7]常住居民III金钱3004 UID448564注册时间最后登录在线时间393 小时阅读权限50积分1647精华0
灌水灌成這樣?
UID474039注册时间最后登录在线时间51 小时阅读权限30积分333精华0
红盟学员, 积分 333, 距离下一级还需 367 积分
TA的每日心情奋斗 22:50:10签到天数: 88 天[LV.6]常住居民II金钱796 UID474039注册时间最后登录在线时间51 小时阅读权限30积分333精华0
好深奥。。
Love the heart of Ling
UID463052注册时间最后登录在线时间285 小时阅读权限50积分1063精华0
红盟成员, 积分 1063, 距离下一级还需 937 积分
TA的每日心情无聊 16:58:12签到天数: 255 天[LV.8]以坛为家I金钱2399 UID463052注册时间最后登录在线时间285 小时阅读权限50积分1063精华0
楼主用易语言写下撒,表示VB不会看
UID435834注册时间最后登录在线时间430 小时阅读权限150积分1715精华0
中国红客联盟监察部
TA的每日心情奋斗昨天&21:13签到天数: 392 天[LV.9]以坛为家II金钱6233 UID435834注册时间最后登录在线时间430 小时阅读权限150积分1715精华0
游戏开发好复杂啊
UID489099注册时间最后登录在线时间24 小时阅读权限30积分152精华0
红盟学员, 积分 152, 距离下一级还需 548 积分
TA的每日心情开心 03:50:39签到天数: 49 天[LV.5]常住居民I金钱253 UID489099注册时间最后登录在线时间24 小时阅读权限30积分152精华0
粘贴到文本中后不能保持 以上格式& && &行 与列不对
繁华落尽苦是真!
UID467225注册时间最后登录在线时间138 小时阅读权限30积分561精华0
红盟学员, 积分 561, 距离下一级还需 139 积分
TA的每日心情郁闷 18:11:50签到天数: 81 天[LV.6]常住居民II金钱1007 UID467225注册时间最后登录在线时间138 小时阅读权限30积分561精华0
抱歉,没发全
UID467225注册时间最后登录在线时间138 小时阅读权限30积分561精华0
红盟学员, 积分 561, 距离下一级还需 139 积分
TA的每日心情郁闷 18:11:50签到天数: 81 天[LV.6]常住居民II金钱1007 UID467225注册时间最后登录在线时间138 小时阅读权限30积分561精华0
请版主将这个帖关闭,我把这个得链接和全的代码发在另一个帖上
UID475014注册时间最后登录在线时间20 小时阅读权限30积分199精华0
红盟学员, 积分 199, 距离下一级还需 501 积分
TA的每日心情郁闷 14:18:03签到天数: 59 天[LV.5]常住居民I金钱491 UID475014注册时间最后登录在线时间20 小时阅读权限30积分199精华0
看不懂!!!
UID463486注册时间最后登录在线时间51 小时阅读权限20积分59精华0
红盟菜鸟, 积分 59, 距离下一级还需 91 积分
TA的每日心情衰 22:10:55签到天数: 22 天[LV.4]偶尔看看III金钱225 UID463486注册时间最后登录在线时间51 小时阅读权限20积分59精华0
太深奥,看不懂
UID172879注册时间最后登录在线时间0 小时阅读权限20积分40精华0
红盟菜鸟, 积分 40, 距离下一级还需 110 积分
TA的每日心情开心 00:00:13签到天数: 4 天[LV.2]偶尔看看I金钱58 UID172879注册时间最后登录在线时间0 小时阅读权限20积分40精华0
顶一个~~羡慕啊!!
UID172879注册时间最后登录在线时间0 小时阅读权限20积分40精华0
红盟菜鸟, 积分 40, 距离下一级还需 110 积分
TA的每日心情开心 00:00:13签到天数: 4 天[LV.2]偶尔看看I金钱58 UID172879注册时间最后登录在线时间0 小时阅读权限20积分40精华0
我只会易语言~~其它不会呢!!
UID503017注册时间最后登录在线时间203 小时阅读权限50积分718精华0
红盟成员, 积分 718, 距离下一级还需 1282 积分
TA的每日心情怒 13:15:08签到天数: 181 天[LV.7]常住居民III金钱1722 UID503017注册时间最后登录在线时间203 小时阅读权限50积分718精华0
完全看不懂。。。
UID362387注册时间最后登录在线时间62 小时阅读权限30积分387精华0
红盟学员, 积分 387, 距离下一级还需 313 积分
TA的每日心情奋斗 22:57:27签到天数: 182 天[LV.7]常住居民III金钱1578 UID362387注册时间最后登录在线时间62 小时阅读权限30积分387精华0
biao\\shi....................
UID494460注册时间最后登录在线时间3 小时阅读权限10积分9精华0
红客新手, 积分 9, 距离下一级还需 21 积分
TA的每日心情郁闷 11:10:23签到天数: 5 天[LV.2]偶尔看看I金钱40 UID494460注册时间最后登录在线时间3 小时阅读权限10积分9精华0
&&唉&&看不懂&&啊
全体成员请点此查看详细内容
Powered by求一篇关于数独的解答技巧的详叙文章 | 死理性派小组 | 果壳网 科技有意思
876384人加入此小组
最近对数独特别有兴趣,但遇到瓶颈了,希望各位大神帮帮忙。
+ 加入我的果篮
(C)2016果壳网&&&&京ICP证100430号&&&&京网文[-239号&&&&新出发京零字东150005号&&&&
违法和不良信息举报邮箱:&&&&举报电话:3025人阅读
windows开发技术(3)
软件作品(10)
“心常乐数独小游戏”(以下简称“本软件”)是一款windows平台下的数独游戏软件。
本软件是开源、免费软件。
本软件使用纯C语言编写,MinGW编译,NSIS打包。
本软件主要特性如下:
支持“闯关模式”和“选关模式”
支持“随机生成游戏”
支持数独游戏提示
支持用户对单元格做标记
提供超级工具“数独求解器”
支持“进度存档”
支持“当前进度保存为迷题”及“将迷题加载为游戏”。
支持背景音乐、游戏音效。
软件界面如下:
最后,软件的下地址如下:
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:297271次
积分:3749
积分:3749
排名:第6836名
原创:114篇
评论:48条
(2)(1)(3)(5)(1)(6)(2)(5)(1)(2)(3)(1)(1)(2)(2)(2)(6)(2)(4)(5)(1)(3)(2)(1)(2)(2)(10)(9)(5)(3)(3)(2)(2)(2)(2)(3)(2)(1)(1)(3)(1)

我要回帖

更多关于 六宫格数独题目及解答 的文章

 

随机推荐