python实现简易数独小游戏

这篇具有很好参考价值的文章主要介绍了python实现简易数独小游戏。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

起源

既然“数独”有一个字是“数”,人们也往往会联想到数学,那就不妨从大家都知道的数学家欧拉说起,但凡想了解数独历史的玩家在网络、书籍中搜索时,共同会提到的就是欧拉的“拉丁方块(Latin square)”。

拉丁方块的规则:每一行(Row)、每一列(Column)均含1-N(N即盘面的规格),不重复。这与前面提到的标准数独非常相似,但少了一个宫的规则

近代发展

数独起源于18世纪初瑞士数学家欧拉等人研究的拉丁方阵(Latin Square)。19世纪80年代,一位美国的退休建筑师格昂斯(Howard Garns)根据这种拉丁方阵发明了一种填数趣味游戏,这就是数独的雏形。20世纪70年代,人们在美国纽约的一本益智杂志《Math Puzzles and Logic Problems》上发现了这个游戏,当时被称为填数字(Number Place),这也是公认的数独最早的见报版本。1984年一位日本学者将其介绍到了日本,发表在Nikoli公司的一本游戏杂志上,当时起名为“数字は独身に限る”(すうじはどくしんにかぎる),就改名为“数独”(すうどく),其中“数”(すう)是数字的意思,“独”(どく)是唯一的意思。后来一位前任香港高等法院的新西兰籍法官高乐德(Wayne Gould)在1997年3月到日本东京旅游时,无意中发现了 [2]  。他首先在英国的《泰晤士报》上发表,不久其他报纸也发表,很快便风靡全英国,之后他用了6年时间编写了电脑程序,并将它放在网站上(这个网站也就是著名的数独玩家论坛),后来因一些原因,网站被关闭,幸好数独大师Glenn Fowler恢复了数据,玩家论坛有了新处所。在90年代国内就有部分的益智类书籍开始刊登,南海出版社在2005年出版了《数独1-2》,随后日本著名数独制题人西尾彻也的《数独挑战》也由辽宁教育出版社出版。《北京晚报》、《扬子晚报》、《羊城晚报》、《新民晚报》、《成都商报》等等报纸媒体也先后刊登了数独游戏。

基础解法

排除法(摒除法)

摒除法:用数字去找单元内唯一可填空格,称为摒除法,数字可填唯一空格称为排除法 (Hidden Single)。

根据不同的作用范围,摒余解可分为下述三种:

数字可填唯一空格在「宫」单元称为宫排除(Hidden Single in Box),也称宫摒除法。

数字可填唯一空格在「行」单元称为行排除法(Hidden Single in Row),也称行摒除法。

数字可填唯一空格在「列」单元称为列排除法(Hidden Single in Column),也称列摒除法。

唯一余数法

唯一余数法:用格位去找唯一可填数字,称为余数法,格位唯一可填数字称为唯余解(Naked Single)。余数法是删减等位群格位(Peer)已出现的数字的方法,每一格位的等位群格位有 20 个

python实现简易数独小游戏

 文章来源地址https://www.toymoban.com/news/detail-448293.html

完整代码如下:

import random
import math
import pygame
matrix = []
sds = []
 
 
def get_random_unit():
    _num_list = [1, 2, 3, 4, 5, 6, 7, 8, 9]
    random.shuffle(_num_list)
    return _num_list
 
 
def print_grid(arr):
    for i in range(9):
        sds.append(arr[i])
 
 
def get_row(row):
    row_arr = []
    for v in matrix[row]:
        if v == 0:
            continue
        row_arr.append(v)
    return row_arr
 
 
def get_col(col):
    col_arr = []
    for i in range(9):
        val = matrix[i][col]
        if val == 0:
            continue
        col_arr.append(matrix[i][col])
    return col_arr
 
 
def get_block(num):
    col_arr = []
    seq = num % 3
    col_end = 9 if seq == 0 else seq * 3
    row_end = int(math.ceil(num / 3) * 3)
    for i in range(row_end - 3, row_end):
        for j in range(col_end - 3, col_end):
            val = matrix[i][j]
            if val != 0:
                col_arr.append(matrix[i][j])
    return col_arr
 
 
def get_block_seq(row, col):
    col_seq = int(math.ceil((col + 0.1) / 3))
    row_seq = int(math.ceil((row + 0.1) / 3))
    return 3 * (row_seq - 1) + col_seq
 
 
def get_enable_arr(row, col):
    avail_arr = get_random_unit()
    seq = get_block_seq(row, col)
    block = get_block(seq)
    row = get_row(row)
    col = get_col(col)
    unable_arr = list(set(block + row + col))
    for v in unable_arr:
        if v in avail_arr:
            avail_arr.remove(v)
    return avail_arr
 
 
def main():
    can_num = {}
    count = 0
    
    for i in range(9):
        matrix.append([0] * 9)
 
    num_list = get_random_unit()
    for row in range(3):
        for col in range(3):
            matrix[row][col] = num_list.pop(0)
 
    num_list = get_random_unit()
    for row in range(3, 6):
        for col in range(3, 6):
            matrix[row][col] = num_list.pop(0)
 
    num_list = get_random_unit()
    for row in range(6, 9):
        for col in range(6, 9):
            matrix[row][col] = num_list.pop(0)
 
    box_list = []
    for row in range(9):
        for col in range(9):
            if matrix[row][col] == 0:
                box_list.append({'row': row, 'col': col})
 
    i = 0
    while i < len(box_list):
        count += 1
        position = box_list[i]
        row = position['row']
        col = position['col']
        key = '%dx%d' % (row, col)
        if key in can_num:
            enable_arr = can_num[key]
        else:
            enable_arr = get_enable_arr(row, col)
            can_num[key] = enable_arr
 
        if len(enable_arr) <= 0:
            i -= 1
            if key in can_num:
                del (can_num[key])
            matrix[row][col] = 0
            continue
        else:
            matrix[row][col] = enable_arr.pop()
            i += 1
 
    print_grid(matrix)
 
if __name__ == "__main__":
    main()
    
 
# --------------------华丽の分割线--------------------
 
ac_num = 0
pausE = True
difficulty = 3
 
from tkinter import *
from tkinter import ttk
import time
import pygame as py 
 
def setDiff(difF):
    global difficulty
    global diff
    try:
        difficulty = int(difF)
        diff.destroy()
    except:
        pass
diff = Tk()
diff.title('难度选择')
diff.geometry('300x90')
diff.resizable(0,0)
Label(diff,text='选择你要挑战的难度!(0~9)',font=('微软雅黑',9)).pack()
cmb = ttk.Combobox(diff)
cmb.pack()
cmb['value'] = (0,1,2,3,4,5,6,7,8,9)
Button(diff,text='我选好了',command=lambda:setDiff(cmb.get())).pack()
diff.mainloop()
window = Tk()
window.title('数独')
window.geometry('390x500')
window.resizable(0,0)
begin_time = 0
steps = 0
rights = 0
wrongs = 0
dwc = difficulty*9
ac_name = None
 
list = range(1,82)
try:
    ran = random.sample(list,dwc)
except:
    if difficulty > 9:
        ran = random.sample(list,9)
    elif difficulty < 0:
        ran = random.sample(list,1)
    print('难度输入出现问题 你将无法通关')
try:
    py.mixer.init()
    py.mixer.music.load('bg.mp3')
    py.mixer.music.play(-1)
except:
    print('未检测到名为 bg.mp3  的背景音乐')
    
def setBlock(num,name):
    global begin_time
    if begin_time == 0:
        begin_time = time.time()
    global ac_name
    global ac_num
    if ac_name != name and name != None and ac_name != None:
        ac_name.config(text='?',bg='orange',activebackground='orange',relief='groove')
    if name.cget('bg') != 'green':
        name.config(text='···',relief='sunken',bg='lightblue',activebackground='lightblue')
        ac_name = name
        ac_num = num
    else:
        ac_name = None
def setNum(num):
    global ac_name
    global begin_time
    global dwc
    global ac_num
    global re
    global difficulty
    global steps
    global wrongs
    global rights
    global steP
    try:
        b_color = ac_name.cget('bg')
        if ac_num == num:
            ac_name.config(text='√',activebackground='green',relief='groove',bg='green')
        else:   
            ac_name.config(text='×',activebackground='red',relief='groove')
        ac_name.flash()
        ac_name.flash()
        if ac_num == num:
            ac_name.config(text=str(num),activebackground='green',background='green',relief='groove')
        else:
            ac_name.config(text='?',bg='orange',activebackground='orange',relief='groove')
        if ac_name.cget('bg') == 'green' and b_color == 'lightblue':
            dwc -= 1
            ac_name = None
            rights += 1
            steps += 1
        elif b_color == 'lightblue' and ac_name.cget('bg') == 'orange':
            ac_name = None
            wrongs += 1
            steps += 1
        if dwc == 0:
            ac_name = None
            print('恭喜,你赢了!')
            Label(window,text='恭喜,你赢了!',font=('微软雅黑',30),bg='lightgreen').place(x=52,y=50)
            use_time = round(time.time()-begin_time,1)
            Label(window,text='用时'+str(use_time)+'秒  正确率'+str(round((rights/steps)*100,1))+'%',bg='yellow').place(x=113,y=121)
        re.config(text='剩余数字数量:'+str(dwc)+' 难度等级:'+str(difficulty))
        steP.config(text='步数:'+str(steps)+' 正确:'+str(rights)+' 错误:'+str(wrongs))
        ac_name = None
        
    except:
        pass
def tipSs():
    '''global sds
    for ynfo in sds:
        print(ynfo)'''
    global ac_num
    global ac_name
    try:
        ac_name.config(text=str(ac_num))
        ac_name.flash()
        ac_name.config(text='···')
    except:
        pass
def pauseOr(bgm):
    global pausE
    if pausE == True:
        py.mixer.music.pause()
        Button(window,text='♪',font=('楷体',7),relief='sunken',bg='white',command=lambda:pauseOr(bgm)).place(x=365,y=11)
        pausE = False
    elif pausE == False:
        py.mixer.music.unpause()
        Button(window,text='♫',font=('楷体',7),relief='sunken',bg='green',command=lambda:pauseOr(bgm)).place(x=365,y=11)
        pausE = True
j=0
i=0.7
_count = 1
wz = False
# 这里通过win10计算器,两年前的项目写出了算法
def spaceBtn(i,j,ri,rj):
    name =  'a'+str(i+1)+str(j+1)
    name = Button(window,text='?',font=('微软雅黑',10),relief='groove',bg='orange',activebackground='orange',command=lambda:setBlock(sds[i][j],name))
    name.place(x=rj*36,y=ri*38,width=30,height=30)
def numBtn(num):
    Button(window,text=str(num),font=('楷体',15),relief='sunken',bg='white',activebackground='blue',command=lambda:setNum(num)).place(x=x*42+9,y=380,width=37,height=37)
for info in sds:
    for jnfo in info:
        j+=1
        for znfo in ran:
            if _count == znfo:
                wz = True
        _count += 1
        if wz == True:
            spaceBtn(round(i-1),j-1,i,j)
            wz = False
        else:
            Label(window,text=jnfo,font=('微软雅黑',10),relief='ridge',bg='grey').place(x=j*36,y=i*38,width=30,height=30)
    j=0
    i+=1
for x in range(0,9):
    numBtn(x+1)
Button(window,text='提示',command=tipSs).place(x=50,y=430)
bgm = Button(window,text='♫',font=('楷体',7),relief='sunken',bg='green',command=lambda:pauseOr(bgm)).place(x=365,y=11)
re = Label(window,text='剩余数字数量:'+str(dwc)+' 难度等级:'+str(difficulty),relief='sunken')
re.place(x=185,y=470)
steP = Label(window,text='步数:'+str(steps)+' 正确:'+str(rights)+' 错误:'+str(wrongs),relief='sunken')
steP.place(x=5,y=470)
window.mainloop()

主要外部依赖库:tkinter,pygame

需要改动地方:    py.mixer.music.load('bg.mp3'),在同一目录准备自己喜欢的游戏背景音乐重命名为bg即可

游戏运行效果如下:

下拉框选择不同等级难度,开始游戏,点击问号方块再点击下方数字即可填入

点击黄色问号方块再点击提示就会显示一秒钟的答案,之后再填入即可

python实现简易数独小游戏python实现简易数独小游戏python实现简易数独小游戏python实现简易数独小游戏

详细来源:

用python实现带界面的数独小游戏_eyz2022的博客-CSDN博客_python 数独游戏

 

 

 

 

 

到了这里,关于python实现简易数独小游戏的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 基于Python pygame简易版斗兽棋小游戏源代码

    基于Python pygame简易版斗兽棋小游戏源代码 游戏规则如下: 胜利条件: 1.吃掉对方全部棋子 2.走入对方兽穴(不可进入自己洞穴) 吃法: 1.象狮虎豹狼狗猫鼠象 2.同类棋子先行者吃掉对方 3.老鼠可以进河,老鼠在河里时,岸上的动物不能捕食他,他也不能捕食岸上的动物 4.狮虎在河中没

    2023年04月09日
    浏览(120)
  • 实现用java做一个简易版《羊了个羊》小游戏(附源代码)

    该项目是跟着这个b站视频一步一步写出来的,初学java有些地方我看不是很明白,但是讲解很仔细,大家可以看原视频,我没有添加背景音乐和背景图片,做出来的效果也勉勉强强。 代码已经上传到github上了,大家可以去github上直接下载代码,附上链接:点击进入github源码链接

    2024年02月04日
    浏览(91)
  • C语言简易小游戏

    本篇博客将带领大家自己动手写一下一些C语言小游戏;以增加对于C语言的兴趣😀😀😀😀😀 首先呢我们先来简单介绍一下这个小游戏: 通常由两个人玩,一方出数字,一方猜。出数字的人要想好一个没有重复数字,不能让猜的人知道。猜的人就可以开始猜。 如正确答案为

    2024年02月07日
    浏览(39)
  • Java制作“简易王者荣耀”小游戏

    第一步是创建项目 项目名自拟 第二部创建个包名 来规范class 然后是创建类 GameFrame   运行类 运行结果如下:

    2024年02月04日
    浏览(53)
  • 纯c++简易的迷宫小游戏

    一个用c++写的黑框框迷宫 适合新手入门学习 也适合大学生小作业 下面附上代码 初始化游戏界面:设置迷宫的大小(WIDTH和HEIGH),生成迷宫地图(map),包括墙壁、空地、起点和终点。 显示欢迎界面和游戏规则:通过Welcome()函数和Rule()函数分别实现。 开始计时:记录游戏开

    2024年01月17日
    浏览(45)
  • python小游戏 拼图小游戏设计与实现

    🔥 Hi,各位同学好呀,这里是L学长! 🥇今天向大家分享一个今年(2022)最新完成的毕业设计项目作品 python小游戏毕设 拼图小游戏设计与实现 (源码) 🥇 学长根据实现的难度和等级对项目进行评分(最低0分,满分5分) 难度系数:3分 工作量:3分 创新点:4分 游戏规则: 将图像

    2024年02月08日
    浏览(51)
  • python小游戏 2048小游戏设计与实现

    🔥 Hi,各位同学好呀,这里是L学长! 🥇今天向大家分享一个今年(2022)最新完成的毕业设计项目作品 python小游戏毕设 2048小游戏设计与实现 (源码) 🥇 学长根据实现的难度和等级对项目进行评分(最低0分,满分5分) 难度系数:3分 工作量:3分 创新点:4分 今天我们用python实现

    2024年02月11日
    浏览(55)
  • python小游戏 打地鼠小游戏设计与实现

    🔥 Hi,各位同学好呀,这里是L学长! 🥇今天向大家分享一个今年(2022)最新完成的毕业设计项目作品 python小游戏毕设 打地鼠小游戏设计与实现 (源码) 🥇 学长根据实现的难度和等级对项目进行评分(最低0分,满分5分) 难度系数:3分 工作量:3分 创新点:4分 打地鼠的游戏规

    2024年02月06日
    浏览(55)
  • python小游戏 滑雪小游戏设计与实现 (源码)

    🔥 Hi,各位同学好呀,这里是L学长! 🥇今天向大家分享一个今年(2022)最新完成的毕业设计项目作品 python小游戏毕设 滑雪小游戏设计与实现 (源码) 🥇 学长根据实现的难度和等级对项目进行评分(最低0分,满分5分) 难度系数:3分 工作量:3分 创新点:4分 我们利用python制作

    2024年02月04日
    浏览(45)
  • python小游戏 接金币小游戏设计与实现

    🔥 Hi,各位同学好呀,这里是L学长! 🥇今天向大家分享一个今年(2022)最新完成的毕业设计项目作品 python小游戏毕设 接金币小游戏设计与实现 (源码) 🥇 学长根据实现的难度和等级对项目进行评分(最低0分,满分5分) 难度系数:3分 工作量:3分 创新点:3分 基于python实现的

    2024年02月09日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包