用python完成一个数独小游戏

时隔一年我回来完善我的数独程序了,在原来使用matlab产生数独的基础上,改为python语法,并对其进行扩展功能,改为一个小游戏。
matlab产生数独的原理在我第一篇博客里有比较详细的介绍,matlab产生数独原理,这里不多说
改为python以后代码如下

def daan():                                          #用于产生数独答案shudu = np.zeros((9,9),dtype=int)                 #产生全0数组备用while (sum(sum(shudu[:,:]))!=405):                #判断数独答案是否正确,简单了点,但很实用n = 1A = np.zeros((9,9), dtype=int)a = [x for x in range(1, 10)]                 #产生1-9数组备用b = [x for x in range(1, 10)]random.shuffle(b)                              #产生随机1-9数组,作为数独第一行A[0,:] = b                                     #赋值for i in range(1,9):                            #开始填数for j in range(0,9):x = A[i,:]                              #取出所在行y = A[:,j]                               #取出所在列if 0<=j and j<3:z = A[:,0:3]elif 3<=j and j<6:z = A[:,3:6]else :z = A[:,6:9]if 0 <= i and i < 3:z = z[0:3,:]elif 3 <= i and i < 6:z = z[3:6,:]else:z = z[6:9,:]                         #取出所在宫x_pos = np.nonzero(x)[0]                   #取出行,列,宫的所有非零值X = np.zeros((len(x_pos)), dtype=int)for p in range(0, len(x_pos)):X[p] = x[x_pos[p]]y_pos = np.nonzero(y)[0]Y = np.zeros((len(y_pos)), dtype=int)for p in range(0, len(y_pos)):Y[p] = y[y_pos[p]]z_pos = np.transpose(np.nonzero(z))Z = np.zeros((len(z_pos)), dtype=int)for p in range(0,len(z_pos)):m = z_pos[p,0]n = z_pos[p,1]Z[p] = z[m,n]t = list(set(X).union(set(Y)))t = list(set(t).union(set(Z)))                 #所有非零值取并集,n = list(set(a).difference(set(t)))            # 并集和a取差集,判断哪些数还可以填try:L = len(n)                                #判断是否还有备选数except BaseException as e:L = 0r = random.random()h = math.ceil(r*L)                            #备选数中随机选择一个try:A[i,j] = n[h-1]                            #进行赋值except BaseException as e:n = 2                                      #报错则说明之前的填数有误breakif n == 2:breakif n == 2:continue                                          #重新开始循环shudu = A                                              #81个数全部正确,则赋值return shudu                                               #返回

这样可以产生一个标准数独作为答案
下面可以随机挖空产生一个数独作为题面

def chansheng(shudu,grade):                                  #随机挖空,产生数独题面for i in range(0,9):b = [x for x in range(0, 9)]random.shuffle(b)for j in range(0,grade):shudu[i,b[j]] = 0return shudu

grade作为输入控制数独难度,每一行挖掉几个数字

然后是修改数独函数,用来让用户填数

def xiugai(shudu,pos,pos_nonling):                          #输入参数,对数独进行修改x = int(pos/100)                                        #得到行值y = int((pos%100)/10)                                  #得到列值for i in range(0,len(pos_nonling)):                     #pos_nonling代表题面非零值的位置a = int(pos_nonling[i,0])b = int(pos_nonling[i,1])if x-1 == a and y-1 == b:print('此数不可修改,请重新输入')                    #这些位置的数字不可修改n = 2return shudu,nnum = int((pos%100)%10)                                   #若不是这些位置,则可进行修改shudu[x-1,y-1] = numn = 1                  #是否正确修改的标志位return shudu,n           #返回修改后的结果和标志位

检查填入的数字是否正确

def jiancha(shudu,pos,shibai):                     #检查填入数字是否正确a = int(pos/100)                                        #得到行值b = int((pos%100)/10)                                  #得到列值c = int((pos%100)%10)                                   #得到所填数字shudu[a-1,b-1] = 0x = shudu[a-1, :]y = shudu[:, b-1]if 0 <= b-1 and b-1 < 3:z = shudu[:, 0:3]elif 3 <= b-1 and b-1 < 6:z = shudu[:, 3:6]else:z = shudu[:, 6:9]if 0 <= a-1 and a-1 < 3:z = z[0:3, :]elif 3 <= a-1 and a-1 < 6:z = z[3:6, :]else:z = z[6:9, :]x_pos = np.nonzero(x)[0]X = np.zeros((len(x_pos)), dtype=int)for p in range(0, len(x_pos)):X[p] = x[x_pos[p]]y_pos = np.nonzero(y)[0]Y = np.zeros((len(y_pos)), dtype=int)for p in range(0, len(y_pos)):Y[p] = y[y_pos[p]]z_pos = np.transpose(np.nonzero(z))Z = np.zeros((len(z_pos)), dtype=int)for p in range(0, len(z_pos)):m = z_pos[p, 0]n = z_pos[p, 1]Z[p] = z[m, n]t = list(set(X).union(set(Y)))t = list(set(t).union(set(Z)))                          #以上和产生答案逻辑相同,获取所有不可填数字if c in t:                                                #与不可填数字相同shibai = shibai+1print('此处已经不能填', c)print("您已失败%d次" % (shibai))print("剩余失败次数:", shibaicishu - shibai)shudu[a-1, b-1] = 0                                   #抹除这次填数return  shibaielse:shudu[a-1, b-1] = c                                  #不同则进行赋值return  shibai

判断游戏是否结束,是否全部填完

def jieshu(shudu):                                      #检查游戏是否结束if sum(sum(shudu[:, :])) == 405:return 1else:return 2

对每一次的数独进行展示

def show(shudu,pos_nonling):                          #对每一步的数独结果进行展示for i in range(0,10):for j in range(0,10):if i == 0 and j == 0:                         #(1,1)位置空白,为了好看print('\t',end='')if i == 0 and j != 0:print('\033[34m',j,'\t',end='')#紫色         #第一行打入用紫色写入横坐标if j == 9:print('\n')                               #结束后换行if i != 0 and j == 0:print('\033[34m',i,'\t',end='')              #第一列用紫色打入列坐标if i != 0 and j != 0:if shudu[i-1,j-1] == 0:print('\033[0m',' ', '\t', end='')          #被挖掉得空不进行显示else:for m in range(0, len(pos_nonling)):         #判断是否为题面固定数字a = int(pos_nonling[m, 0])b = int(pos_nonling[m, 1])if i - 1 == a and j - 1 == b:key = 1breakelse:key = 2if key == 1:print('\033[0m', shudu[i-1,j-1], '\t', end='')               #题面固定数字用白色显示else:print('\033[31m', shudu[i - 1, j - 1], '\t', end='')         #可填数字用红色显示if j == 9:print('\n')                                                        #每行结尾换行

最后,主函数

if __name__ == '__main__':print('游戏开始')global shibaishibai = 0    #用来统计失败次数try:grand = int(input('请选择难度(1——6):'))                                          #每行挖掉几个空while (grand < 1 or grand > 6):                                           #最少挖一个,最多6个try:grand = int(input('您的输入有误,请输入1——6之间的任意一个整数:'))except BaseException as e:continueexcept BaseException as e:grand = 0while(grand<1 or grand>6):try:grand = int(input('您的输入有误,请输入1——6之间的任意一个整数:'))except BaseException as e:continuetry:shibaicishu = int(input('请选择可失败次数:'))                           #允许输入错误的次数while (shibaicishu < 1):try:shibaicishu = int(input('您的输入有误,请输入一个正整数:'))except BaseException as e:continueexcept BaseException as e:shibaicishu = 0while(shibaicishu<1):try:shibaicishu = int(input('您的输入有误,请输入一个正整数:'))except BaseException as e:continueshudu_answer= daan()                                           #产生数独shudu_question = chansheng(shudu_answer,grand)               #挖空pos_nonling = np.transpose(np.nonzero(shudu_question))         #获取非零元素位置show(shudu_question,pos_nonling)                             #展示while(1):n = 2                                               #标志位,输入是否正确while(n == 2):try:pos = int(input('请输入要输入的数字:'))          #输入一个三位数,百位代表行值,十位代表列值,个位代表要填的数,所以最大999,最小111while (pos < 111 or pos > 999):try:pos = int(input('您的输入有误,请输入一个三位数,百位代表行值,十位代表列值,个位代表要填的数:'))except BaseException as e:continueexcept BaseException as e:pos = 0while (pos < 111 or pos > 999):try:pos = int(input('您的输入有误,请输入一个三位数,百位代表行值,十位代表列值,个位代表要填的数:'))except BaseException as e:continue[shudu_change,n] = xiugai(shudu_question,pos,pos_nonling)                                        #修改数独shibai = jiancha(shudu_change,pos,shibai)                                                            #判断是否错误if shibai == shibaicishu:                                                                            #失败次数和预先设定一样,则输key_finish = 1breakshow(shudu_change,pos_nonling)stop = jieshu(shudu_change)                   #判断是否全部填完if stop == 1:key_finish = 2breakif key_finish == 1:                                #标志位print('游戏结束,挑战失败')else:print('恭喜,挑战成功')

实测了一下,在pycharm里跑没有问题,运行如下,但是在cmd里运行出示问题,没有颜色显示,
但是换成Windows terminal以后就可以了,运行结果很漂亮而且我没有办法打包生成exe文件,让我非常苦恼
如果有人可以成功生成exe的话十分希望可以和我联系一下,并且发我一份,十分感谢。
可以发我邮箱:tai_ge@163.com

用python完成一个数独小游戏相关推荐

  1. python大作业数独_python做一个数独小游戏

    最近看了下python的一些知识,在这里记载一下. 1.首先是安装,在官网下载最新的版本3.6,安装的时候要注意在下面勾选上ADD TO PATH,安装的时候会自动写入到环境变量里面,如果没有勾选,可 ...

  2. python经典小游戏-用Python设计一个经典小游戏:猜大小

    码农那点事儿 关注我们,一起学习进步 本文主要介绍如何用Python设计一个经典小游戏:猜大小. 游戏规则: 初始本金是1000元,默认赔率是1倍,赢了,获得一倍金额,输了,扣除1倍金额. 玩家选择下 ...

  3. 20行python代码的入门级小游戏-用Python设计一个经典小游戏

    本文主要介绍如何用Python设计一个经典小游戏:猜大小. 在这个游戏中,将用到前面我介绍过的所有内容:变量的使用.参数传递.函数设计.条件控制和循环等,做个整体的总结和复习. 游戏规则: 初始本金是 ...

  4. python经典小游戏-用Python设计一个经典小游戏

    本文主要介绍如何用Python设计一个经典小游戏:猜大小. 在这个游戏中,将用到前面我介绍过的所有内容:变量的使用.参数传递.函数设计.条件控制和循环等,做个整体的总结和复习. 游戏规则: 初始本金是 ...

  5. 童年经典回忆 | 从零开始带大家用Python撸一个魔塔小游戏呀(2)

    导语 上一期我们带大家完成了魔塔游戏每一层的初始化画面的制作: 童年经典回忆 | 从零开始带大家用Python撸一个魔塔小游戏呀(1) 这一期我们会带大家进一步复现我们的魔塔小游戏,主要内容包括英雄类 ...

  6. python简单代码制作小游戏-用Python设计一个经典小游戏

    本文主要介绍如何用Python设计一个经典小游戏:猜大小. 在这个游戏中,将用到前面我介绍过的所有内容:变量的使用.参数传递.函数设计.条件控制和循环等,做个整体的总结和复习. 游戏规则: 初始本金是 ...

  7. python游戏设计_用Python设计一个经典小游戏

    本文主要介绍如何用Python设计一个经典小游戏:猜大小. 在这个游戏中,将用到前面我介绍过的所有内容:变量的使用.参数传递.函数设计.条件控制和循环等,做个整体的总结和复习. 游戏规则: 初始本金是 ...

  8. 童年经典回忆 | 从零开始带大家用Python撸一个魔塔小游戏呀(3)

    导语 上一期我们主要带大家写了勇士类,以及勇士与一些简单的地图元素接触时所触发的事件: 童年经典回忆 | 从零开始带大家用Python撸一个魔塔小游戏呀(2) 这一期我们会带大家进一步复现我们的魔塔小 ...

  9. python课程设计小游戏大全_用Python设计一个经典小游戏

    本文主要介绍如何用Python设计一个经典小游戏:猜大小. 在这个游戏中,将用到前面我介绍过的所有内容:变量的使用.参数传递.函数设计.条件控制和循环等,做个整体的总结和复习. 游戏规则: 初始本金是 ...

  10. python简单小游戏赌大小分析_用Python设计一个经典小游戏:猜大小

    原标题:用Python设计一个经典小游戏:猜大小 本文主要介绍如何用Python设计一个经典小游戏:猜大小. 游戏规则: 初始本金是1000元,默认赔率是1倍,赢了,获得一倍金额,输了,扣除1倍金额. ...

最新文章

  1. 使用四种框架分别实现百万websocket常连接的服务器--转
  2. 建议收藏:服务器和存储技术知识
  3. 向量收敛在matlab中,matlab实验报告
  4. 5g虚拟技术旅游_5G赋能VR产业变革
  5. boost::mpl模块实现same_as相关的测试程序
  6. 使用nsenter进入docker容器后端报错 mesg: ttyname failed: No such file or directory
  7. 35个非主流开源数据库
  8. SAP 电商云 Spartacus UI Proxy Facade 的一个实际例子
  9. html日历菜鸟,菜鸟第一次发代码 -- JS日历
  10. 收款码合并有什么弊端_为什么明明有个人收款码了,还要申请微信收款商业版?...
  11. spring boot 事务_Redis 事务在 SpringBoot 中的应用
  12. Matplotlib——画图(散点图、柱状图、等高线图、3D图)
  13. 分享DXperience免费汉化下载
  14. 黑莓桌面管理器更新到5.0.1.37版本
  15. 什么是句柄什么是句柄对象
  16. U盘格式化后容量变小了_内存丢失如何恢复?
  17. UY_ELI, EL社区app
  18. 如何利用百度经验做网络推广
  19. 《如果……》拉迪亚德·吉卜林
  20. 计算机网络根据其规模大小和延伸范围,网络管理员考试计算机网络的分类

热门文章

  1. 美团点评数据平台融合实践
  2. edp和edt哪个好_香水edt和edp的区别
  3. response返回中文乱码
  4. 关于北京市电气火灾综合治理实施方案通知的解读
  5. 【Kotlin -- 知识点】Kotlin 中的委托
  6. Windows安装MySql
  7. Elasticsearch:如何在聚合时选择所需要的 bucket 并进行可视化
  8. 数亿人热血狂欢!EDG含泪加冕,我们是冠军!
  9. 瑞利商(Rayleigh quotient)与广义瑞利商(genralized Rayleigh quotient)
  10. Linux Ubuntu16.04 Python3.5.2 Cuda10.1 TITAN XP安装fastai v1