首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python中的数独游戏

Python中的数独游戏
EN

Stack Overflow用户
提问于 2019-10-11 19:58:11
回答 3查看 781关注 0票数 0

我需要帮助处理我的密码。我知道如何启动板,但我不知道如何检查数字是否在行和列中重复,以及如何更改。

列表,矩阵,用于循环

代码语言:javascript
复制
import turtle
import random
import time

board = [                        #Initialize board.
            ["X","X","X","X"],
            ["X","X","X","X"],
            ["X","X","X","X"],
            ["X","X","X","X"]
            ]

values = ["0","1","2","3"]      #Accepted values

def sudoku():
    #Start screen
    print("SUDOKU".center(50,"-"))
    print("Rules")                #To be changed later c:
    start = int(input("Type 1 to start."))
    crearTablero()
    checkDuplicates()

def createBoard():
    for row in range(len(board)):
        if row%2 == 0:
            board[row][0] = random.sample(values,1)
            board[row][2] = random.sample(values,1)

        if row%2 == 1:
            board[row][1] = random.sample(values,1)
            board[row][3] = random.sample(values,1)

        print(board[row])

def checkDuplicates():                  #Check for duplicates while creating 
    for column in range(len(board[0])):
        #Tried to check if a number has been used in the column, change it to a new number
        val = [x for x in val]          
        for i in range(4):
            while board[columna][0] != board[columna][i]:
                celda = board[columna][i]
                celda = random.sample(valores,1)
                celdastr = "".join(celda)
                check = val.index(celdastr) #I'm stuck here. I get ValueError when trying to delete the used number from val.
                if check != "-1":
                    val.remove(check)

#I still have to create functions to enter the answer, check it and check if the board is full

sudoku()

当我试图从值列表中删除时,我会得到一个ValueError,并且数字不会改变:

跟踪(最近一次调用):文件"sudoku.py",第54行,在sudoku()文件“sudoku.py”中,第21行,在sudoku checarDuplicado()文件“sudoku.py”中,第52行,在checarDuplicado val.remove(check) ValueError: list.remove(x):X不在列表

EN

回答 3

Stack Overflow用户

发布于 2019-10-12 05:16:59

如果将示例简化为最小形式,您会发现如下所示:

代码语言:javascript
复制
val = ["a"]
celdastr = "b"
check = val.index(celdastr)
if check != "-1":
    val.remove(celdastr)

问题的根本原因是check != "-1"

list.index(item)函数返回整数索引,而不是字符串--您需要使用check != -1

票数 0
EN

Stack Overflow用户

发布于 2020-06-09 13:33:19

代码语言:javascript
复制
SIZE = 9
SUB_SIZE = 3
sudoku = [9*[0]]
p = 1
while p != 9:
    sudoku.append (9*[0])
    p += 1

def printSudoku():
    for x in sudoku:
        print("-------------------------------------")
        for y in x:
            print("|", y,end = " ")
        print("| ")
    print("-------------------------------------")

row = int(input("Enter the row \n"))
while row > 8 or row < 0:
    row = int(input("Enter a valid row number(between 0-8) \n"))

col = int(input("Enter the column \n"))
while col > 8 or col < 0:
    col = int(input("Enter a valid column number(between 0-8) \n"))

val = int(input("Enter the value \n"))
while val > 9 or val < 1:
    val = int(input("Enter a valid value(between 1-9) \n"))

sudoku[row][col] = val

while row != -1:
    row = int(input("Enter the row \n"))
    while row > 8 or row < -1:
        row = int(input("Enter a valid row number(between 0-8) \n"))
    col = int(input("Enter the column \n"))
    while col > 8 or col < 0:
        col = int(input("Enter a valid column number(between 0-8) \n"))   
    val = int(input("Enter the value \n"))
    while val > 9 or val < 0:
        val = int(input("Enter a valid value(between 1-9) \n"))

    sudoku[row][col] = val

printSudoku()

def isAvailable(row, col, num):

    rowStart = int(int(row/3) * 3);
    colStart = int(int(col/3) * 3);
    i = 0
    while(i<9):
        if (sudoku[row][i] == num):
            return False
        if (sudoku[i][col] == num):
            return False
        if (sudoku[int(rowStart + (i%3))][int(colStart + (i/3))] == num):
            return False

        i = i+1
    return True;

def fillSudoku(row, col):

    if(row<9 and col<9):

        if(sudoku[row][col] != 0):

            if((col+1)<9):
                return fillSudoku(row, col+1)
            elif((row+1)<9):
                return fillSudoku(row+1, 0)
            else:
                return True
        else:
            i = 0
            while(i<9):
                if(isAvailable(row, col, i+1)):
                    sudoku[row][col] = i+1
                    if((col+1)<9):
                        if(fillSudoku(row, col +1)):
                            return True
                        else :
                            sudoku[row][col] = 0
                    elif((row+1)<9):
                        if(fillSudoku(row+1, 0)):
                            return True;
                        else:
                            sudoku[row][col] = 0
                    else :
                        return True;
                i = i+1
        return False;
    else:
        return True;

if (fillSudoku(0, 0)) : 
    print ("\n\nSolution is \n")
    printSudoku()

else :
    print("\n\nNO SOLUTION\n\n")

输入完值后,输入行为-1

行号和列号从0开始,而不是从1开始。

票数 0
EN

Stack Overflow用户

发布于 2020-06-28 20:19:51

此函数检查作为参数传递的列表是否包含从“1”到“9”的九位数字。

代码语言:javascript
复制
def checkset(digs):
    return sorted(list(digs)) == [chr(x + ord('0')) for x in range(1, 10)]

这将是表示sudoku的行列表。

代码语言:javascript
复制
rows = [ ]
for r in range(9):
    ok = False
    while not ok:
        row = input("Enter row #" + str(r + 1) + ": ")
        ok = len(row) == 9 or row.isdigit()
        if not ok:
            print("Incorrect row data - 9 digits required")
    rows.append(row)

ok = True

检查所有行是否良好

代码语言:javascript
复制
for r in range(9):
    if not checkset(rows[r]):
        ok = False
        break

检查所有列是否良好

代码语言:javascript
复制
if ok:
    for c in range(9):
        col = []
        for r in range(9):
            col.append(rows[r][c])
        if not checkset(col):
            ok = False
            break

检查所有子方格(3x3)是否良好。

代码语言:javascript
复制
if ok:
    for r in range(0, 9, 3):
        for c in range(0, 9, 3):
            sqr = ''
            # make a string containing all digits from a sub-square
            for i in range(3):
                sqr += rows[r+i][c:c+3]
            if not checkset(list(sqr)):
                ok = False
                break

打印最终裁决

代码语言:javascript
复制
if ok:
    print("Yes")
else:
    print("No")
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58347736

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档