python 数独游戏4x4 一共16个格子


import random
def initialize_4x4():
    row0=[1,2,3,4]
    random.shuffle(row0)
    row1=row0[2:4]+row0[0:2]
    row2=[row0[1],row0[0],row0[3],row0[2]]
    row3=row2[2:4]+row2[0:2]
    return [row0,row1,row2,row3]

def hanghuanhang(board):
    top=board[:2]
    bottom=board[2:]
    random.shuffle(top)
    random.shuffle(bottom)
    return top+bottom
def hengshuhuan(board):
    size=len(board)
    k=[]
    for i in range(size):
        k.append([])
    for row in board:
         for g in range(size):
            k[g].append(row[g])
    return k
def creation_4x4():
    board=initialize_4x4()
    board=hanghuanhang(board)
    board=hengshuhuan(board)
    board=hanghuanhang(board)
    board=hengshuhuan(board)
    return board
def copy_board(board):
    j=[]
    for row in board:
        j.append(row[:])
    return j
def get_messege(messege,a,b):
    messeges=input(messege)
    while not(messeges.isdigit() and a<=int(messeges)<=b):
        messeges=input(messege)
    return int(messeges)

def get_level():
    print("输入你的数独等级")
    level=input("一共1~3个等级 请输入你想进行的等级:")
    while level not in("1","2","3"):
        level=input("一共1~3个等级 请输入你想进行的等级")
    if level=="1":
        return 6
    elif level=="2":
        return 8
    else:
        return 10
def make_holes(copy_board,get_level):
    while get_level >0:
        i=random.randint(0,3)
        j=random.randint(0,3)
        if copy_board[i][j]!=0:
            copy_board[i][j]=0
            get_level-=1
        return copy_board
def show_board(copy_board):
    for row in copy_board:
        for entry in row:
            if entry==0:
                print(".",end=" ")
            else:
                print(entry,end=" ")
    print()
def soduk_mini():
    solution=creation_4x4()
    clone=copy_board(solution)
    data=get_level()
    data1=make_holes(clone,data)
    show_board(data1)
    while data>0:
        i = get_messege("行数#", 1, 4) - 1
        j = get_messege("列数#", 1, 4) - 1
        if data1[i][j]!=0:
            print("这里已经有数了重新输入")
            continue
        n=get_messege("数字#:",1,4)
        if n ==solution[i][j]:
            data1[i][j]=solution[i][j]
            show_board(data1)
            data-=1
        else:
            print("数字有误重新输入")
    print("做的真好,再试一次吧!")
soduk_mini()

@Dick_不周 哥 能不能帮我查一下我哪里没弄对 我检查了2~3遍头都看晕了 还是没找出来!😭

OK

参考ChatGPT部分内容作答:
代码中存在以下问题:
1、在 make_holes 函数中,return 语句应该放在 while 循环外面,否则只会执行一次。
2、在 soduk_mini 函数中,当用户输入的数字与正确答案不同时,应该给出更具体的提示,例如告诉用户正确答案是多少。
3、在 get_messege 函数中,应该将输入的字符串转换为整数,否则会导致后面的比较出错。
4、在 get_level 函数中,应该使用 while 循环来确保用户输入的是合法的等级,而不是使用多个 if/elif 语句。
5、在 show_board 函数中,应该使用 print 函数的 end 参数来避免每个数字后面都有一个空格。
以下是修改后的代码:

import random

def initialize_4x4():
    row0 = [1, 2, 3, 4]
    random.shuffle(row0)
    row1 = row0[2:4] + row0[0:2]
    row2 = [row0[1], row0[0], row0[3], row0[2]]
    row3 = row2[2:4] + row2[0:2]
    return [row0, row1, row2, row3]

def hanghuanhang(board):
    top = board[:2]
    bottom = board[2:]
    random.shuffle(top)
    random.shuffle(bottom)
    return top + bottom

def hengshuhuan(board):
    size = len(board)
    k = []
    for i in range(size):
        k.append([])
    for row in board:
        for g in range(size):
            k[g].append(row[g])
    return k

def creation_4x4():
    board = initialize_4x4()
    board = hanghuanhang(board)
    board = hengshuhuan(board)
    board = hanghuanhang(board)
    board = hengshuhuan(board)
    return board

def copy_board(board):
    j = []
    for row in board:
        j.append(row[:])
    return j

def get_message(message, a, b):
    while True:
        try:
            value = int(input(message))
            if a <= value <= b:
                return value
        except ValueError:
            pass

def get_level():
    while True:
        level = input("请输入数独等级(1-3):")
        if level in ("1", "2", "3"):
            return int(level) * 2 + 4

def make_holes(copy_board, level):
    while level > 0:
        i = random.randint(0, 3)
        j = random.randint(0, 3)
        if copy_board[i][j] != 0:
            copy_board[i][j] = 0
            level -= 1
    return copy_board

def show_board(copy_board):
    for row in copy_board:
        for entry in row:
            if entry == 0:
                print(".", end="")
            else:
                print(entry, end="")
        print()

def sudoku_mini():
    solution = creation_4x4()
    clone = copy_board(solution)
    level = get_level()
    copy_board = make_holes(clone, level)
    show_board(copy_board)
    while level > 0:
        i = get_message("请输入行数(1-4):", 1, 4) - 1
        j = get_message("请输入列数(1-4):", 1, 4) - 1
        if copy_board[i][j] != 0:
            print("这里已经有数了,请重新输入")
            continue
        n = get_message("请输入数字(1-4):", 1, 4)
        if n == solution[i][j]:
            copy_board[i][j] = solution[i][j]
            show_board(copy_board)
            level -= 1
        else:
            print("数字有误,请重新输入(正确答案是{})".format(solution[i][j]))
    print("恭喜你完成数独!")

sudoku_mini()


# 导入随机模块
import random

# 初始化一个4x4的数独
def initialize_4x4():
    row0=[1,2,3,4]
    random.shuffle(row0) # 打乱第一行的数字
    row1=row0[2:4]+row0[0:2] # 第二行是第一行的后两个数字和前两个数字
    row2=[row0[1],row0[0],row0[3],row0[2]] # 第三行是第一行的第二个数字和第一个数字,第四个数字和第三个数字
    row3=row2[2:4]+row2[0:2] # 第四行是第三行的后两个数字和前两个数字
    return [row0,row1,row2,row3]

# 行换行
def hanghuanhang(board):
    top=board[:2] # 取前两行
    bottom=board[2:] # 取后两行
    random.shuffle(top) # 打乱前两行
    random.shuffle(bottom) # 打乱后两行
    return top+bottom # 返回打乱后的四行

# 横竖换
def hengshuhuan(board):
    size=len(board)
    k=[]
    for i in range(size):
        k.append([])
    for row in board:
         for g in range(size):
            k[g].append(row[g])
    return k

# 生成一个4x4的数独
def creation_4x4():
    board=initialize_4x4() # 初始化一个4x4的数独
    board=hanghuanhang(board) # 行换行
    board=hengshuhuan(board) # 横竖换
    board=hanghuanhang(board) # 行换行
    board=hengshuhuan(board) # 横竖换
    return board

# 复制一个数独
def copy_board(board):
    j=[]
    for row in board:
        j.append(row[:])
    return j

# 获取用户输入的数字
def get_messege(messege,a,b):
    messeges=input(messege)
    while not(messeges.isdigit() and a<=int(messeges)<=b):
        messeges=input(messege)
    return int(messeges)

# 获取数独的等级
def get_level():
    print("输入你的数独等级")
    level=input("一共1~3个等级 请输入你想进行的等级:")
    while level not in("1","2","3"):
        level=input("一共1~3个等级 请输入你想进行的等级")
    if level=="1":
        return 6
    elif level=="2":
        return 8
    else:
        return 10

# 随机挖空
def make_holes(copy_board,get_level):
    while get_level >0:
        i=random.randint(0,3)
        j=random.randint(0,3)
        if copy_board[i][j]!=0:
            copy_board[i][j]=0
            get_level-=1
    return copy_board

# 显示数独
def show_board(copy_board):
    for row in copy_board:
        for entry in row:
            if entry==0:
                print(".",end=" ")
            else:
                print(entry,end=" ")
        print()

# 数独小游戏
def soduk_mini():
    solution=creation_4x4() # 生成一个4x4的数独
    clone=copy_board(solution) # 复制一个数独
    data=get_level() # 获取数独等级
    data1=make_holes(clone,data) # 随机挖空
    show_board(data1) # 显示数独
    while data>0:
        i = get_messege("行数#", 1, 4) - 1
        j = get_messege("列数#", 1, 4) - 1
        if data1[i][j]!=0:
            print("这里已经有数了重新输入")
            continue # 如果这个位置已经有数了,重新输入
        else:
            data-=1 # 数独等级减1
            data1[i][j]=solution[i][j] # 将用户输入的数字填入数独中
            show_board(data1) # 显示数独

@Dick_不周 啊啊啊啊 哥我找到哪里错了😭 对不起 打扰了!!!!!

  • 这有个类似的问题, 你可以参考下: https://ask.csdn.net/questions/7456509
  • 这篇博客你也可以参考下:python语言程序设计第一周练习3,4
  • 除此之外, 这篇博客: python中函数的定义以及如何编写一个函数中的 4.函数的实际意义 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 函数应该是某一个功能的集合体,编写程序需要该功能的时候就去调用它
    并不需要每次需要该功能的时候都写一段代码,即节省时间又节省空间

    def qiuhe():
    	num1 = 20
    	num2 = 30
    	result = num1 + num2
    	print('%d + %d = %d' %(num1,num2,result))
    qiuhe()调用函数
    

    在这里插入图片描述
    在这里插入图片描述
    注意:这个函数只能算11+12的值,并不能计算任意两个数的和,不是真正意义上的函数

    函数的嵌套
    def python():
         print('python')
         def westos():
             print('westos')
     python()没有调用westos函数
    

    在这里插入图片描述
    在这里插入图片描述

    函数的嵌套
    def python():
         print('python')
         def westos():
             print('westos')
         westos()函数只有调用才会执行
     python()
    

    在这里插入图片描述
    在这里插入图片描述

    def hello(a):
        print('hello',a)
    hello('laoli')
    hello('laowu')
    hello('coco')
    

    在这里插入图片描述
    在这里插入图片描述

  • 您还可以看一下 韦玮老师的Python 数据挖掘与机器学习进阶实训-4课程中的 图像分类思路小节, 巩固相关知识点
  • 以下回答由chatgpt基于相关博客总结生成:

    抱歉,以上参考资料并没有直接回答数独游戏的问题。但是我可以给你一些关于Python解决数独游戏的参考资料和思路,希望可以帮到你。

    1. 数独游戏的原理和解法:

    数独游戏本质上是一个逻辑谜题,需要利用计算机算法来解决。数独游戏的解法可以参考以下文章:

    https://www.cnblogs.com/coco7/p/9764525.html

    https://zhuanlan.zhihu.com/p/21890984

    1. Python解决数独游戏的方法:

    可以使用Python编写一个数独游戏的解函数,来自动解决数独谜题。也可以使用Python来编写一个数独游戏的生成函数,来生成新的数独谜题。

    具体的Python代码实现可以参考以下文章:

    https://zhuanlan.zhihu.com/p/37418573

    https://blog.csdn.net/qq_41185868/article/details/80704668

    1. 关于错误检查:

    对于数独游戏的错误检查,可以编写一个函数来判断数独游戏的答案是否正确。可以通过逐行、逐列和逐九宫格来判断是否有重复数字。具体的Python代码实现可以参考以下文章:

    https://www.runoob.com/python/python-exercise-example36.html

    https://www.cnblogs.com/BrightSunshine/p/9038064.html

    1. Notepad++的使用:

    Notepad++是一个非常实用的文本编辑器,可以用来编辑各种编程语言的代码。具体的使用方法可以参考以下文章:

    https://blog.csdn.net/oqdasa/article/details/80513016

    https://blog.csdn.net/chuxin2010/article/details/78951890

    希望以上信息可以对你有所帮助。如果还有其他的问题,可以再次向我提问。