Sudoku python

软件工程基础-个人项目-sudoku游戏]

 

 

cnblob项目地址

 https://github.com/dinodeahonf/Sudoku

 

 

 

 解题思路


其目标是用数字填充9×9网格,以便组成网格的93×3子网格(也称为区域)中的每列,每行和每一个包含所有的数字从19.这个益智设置器提供了一个部分完成的网格,这对于一个良好的拼图有一个单一的解决方案。 完成的游戏总是一种拉丁广场,对各个区域的内容有额外的限制。例如,相同的单个整数可能不会在同一行,列或9x9播放板的九个3×3子区域中的任何一个中出现两次

 

PSP 表格

PSP2.1

 

Personal Software Process Stages

预估耗时(分钟)

 实际耗时(分钟)

Planning

计划

 30

 40

Estimate

估计这个任务需要多少时间 

 50

 50

Development

开发

 90

 90

Analysis

需求分析(包括学习新技术) 

 75

 80

Design Spec

生成射进文档 

 25

 30

Design Review

设计复审(和同事审核设计文档

 40

 40

Coding Standard

代码规范 (为目前的开发制定合适的规范)

 60

 80

Design

具体设计

 80

 90

Coding

具体编码 

 1300

 1400

coding review

代码复审 

 130

 140

Test

测试(自我测试,修改代码,提交修改) 

 100

 120

Reporting

报告

 70

 80

Test Report

测试报告 

 50

 50

Size Management

计算工作量

 60

 60

 Postmortem & Process Improvement Plan

事后总结,并提出过程进计划 

 40

 40

 

 合计

 2200

 2390

 

 

 

 

 

 

 

 

 

 

 

 

 

 

覆盖率测试

 

 

 

 

 

可以先阅读游戏介绍。打开这个链接https://en.wikipedia.org/wiki/Sudoku

Full code:

#file = open("output.txt","w")

# function to print the board on to a file.

# returns a string variable with the board info

def printFileBoard(board):

    string = ""

    string = string + "*********************\n"

    for x in range(0, 9):

        if x == 3 or x == 6:

            string = string + "*********************\n"

        for y in range(0, 9):

            if y == 3 or y == 6:

                string = string + " * "

            string = string + str(board[x][y]) + " "

        string = string + "\n"

    string = string + "*********************\n"

    return string

 

# function to print the board on to the console

def printBoard(board):

    print("*********************")

    for x in range(0, 9):

        if x == 3 or x == 6:

            print("*********************")

        for y in range(0, 9):

            if y == 3 or y == 6:

                print("*", end=" ")

            print(board[x][y], end=" ")

        print()

    print("*********************")

    

# function to check if the board is full or not

# returns true if it is full and false if it isn't

# it works on the fact that if it finds at least one

# zero in the board it returns false

def isFull(board):

    for x in range(0, 9):

        for y in range (0, 9):

            if board[x][y] == 0:

                return False

    return True

    

# function to find all of the possible numbers

# which can be put at the specifies location by

# checking the horizontal and vertical and the

# three by three square in which the numbers are

# housed

def possibleEntries(board, i, j):

    

    possibilityArray = {}

    

    for x in range (1, 10):

        possibilityArray[x] = 0

    

    #For horizontal entries

    for y in range (0, 9):

        if not board[i][y] == 0:

            possibilityArray[board[i][y]] = 1

     

    #For vertical entries

    for x in range (0, 9):

        if not board[x][j] == 0:

            possibilityArray[board[x][j]] = 1

            

    #For squares of three x three

    k = 0

    l = 0

    if i >= 0 and i <= 2:

        k = 0

    elif i >= 3 and i <= 5:

        k = 3

    else:

        k = 6

    if j >= 0 and j <= 2:

        l = 0

    elif j >= 3 and j <= 5:

        l = 3

    else:

        l = 6

    for x in range (k, k + 3):

        for y in range (l, l + 3):

            if not board[x][y] == 0:

                possibilityArray[board[x][y]] = 1          

    

    for x in range (1, 10):

        if possibilityArray[x] == 0:

            possibilityArray[x] = x

        else:

            possibilityArray[x] = 0

    

    return possibilityArray

 

# recursive function which solved the board and

# prints it.

def sudokuSolver(board):

    

    i = 0

    j = 0

    

    possiblities = {}

    

    # if board is full, there is no need to solve it any further

    if isFull(board):

        print("Board Solved Successfully!")

        printBoard(board)

        return

    else:

        # find the first vacant spot

        for x in range (0, 9):

            for y in range (0, 9):

                if board[x][y] == 0:

                    i = x

                    j = y

                    break

            else:

                continue

            break

        

        # get all the possibilities for i,j

        possiblities = possibleEntries(board, i, j)

        

        # go through all the possibilities and call the the function

        # again and again

        for x in range (1, 10):

            if not possiblities[x] == 0:

                board[i][j] = possiblities[x]

                #file.write(printFileBoard(board))

                sudokuSolver(board)

        # backtrack

        board[i][j] = 0

 

def main():

    SudokuBoard = [[0 for x in range(9)] for x in range(9)]

    SudokuBoard[0][0] = 0

    SudokuBoard[0][1] = 0

    SudokuBoard[0][2] = 0

    SudokuBoard[0][3] = 3

    SudokuBoard[0][4] = 0

    SudokuBoard[0][5] = 0

    SudokuBoard[0][6] = 2

    SudokuBoard[0][7] = 0

    SudokuBoard[0][8] = 0

    SudokuBoard[1][0] = 0

    SudokuBoard[1][1] = 0

    SudokuBoard[1][2] = 0

    SudokuBoard[1][3] = 0

    SudokuBoard[1][4] = 0

    SudokuBoard[1][5] = 8

    SudokuBoard[1][6] = 0

    SudokuBoard[1][7] = 0

    SudokuBoard[1][8] = 0

    SudokuBoard[2][0] = 0

    SudokuBoard[2][1] = 7

    SudokuBoard[2][2] = 8

    SudokuBoard[2][3] = 0

    SudokuBoard[2][4] = 6

    SudokuBoard[2][5] = 0

    SudokuBoard[2][6] = 3

    SudokuBoard[2][7] = 4

    SudokuBoard[2][8] = 0

    SudokuBoard[3][0] = 0

    SudokuBoard[3][1] = 4

    SudokuBoard[3][2] = 2

    SudokuBoard[3][3] = 5

    SudokuBoard[3][4] = 1

    SudokuBoard[3][5] = 0

    SudokuBoard[3][6] = 0

    SudokuBoard[3][7] = 0

    SudokuBoard[3][8] = 0

    SudokuBoard[4][0] = 1

    SudokuBoard[4][1] = 0

    SudokuBoard[4][2] = 6

    SudokuBoard[4][3] = 0

    SudokuBoard[4][4] = 0

    SudokuBoard[4][5] = 0

    SudokuBoard[4][6] = 4

    SudokuBoard[4][7] = 0

    SudokuBoard[4][8] = 9

    SudokuBoard[5][0] = 0

    SudokuBoard[5][1] = 0

    SudokuBoard[5][2] = 0

    SudokuBoard[5][3] = 0

    SudokuBoard[5][4] = 8

    SudokuBoard[5][5] = 6

    SudokuBoard[5][6] = 1

    SudokuBoard[5][7] = 5

    SudokuBoard[5][8] = 0

    SudokuBoard[6][0] = 0

    SudokuBoard[6][1] = 3

    SudokuBoard[6][2] = 5

    SudokuBoard[6][3] = 0

    SudokuBoard[6][4] = 9

    SudokuBoard[6][5] = 0

    SudokuBoard[6][6] = 7

    SudokuBoard[6][7] = 6

    SudokuBoard[6][8] = 0

    SudokuBoard[7][0] = 0

    SudokuBoard[7][1] = 0

    SudokuBoard[7][2] = 0

    SudokuBoard[7][3] = 7

    SudokuBoard[7][4] = 0

    SudokuBoard[7][5] = 0

    SudokuBoard[7][6] = 0

    SudokuBoard[7][7] = 0

    SudokuBoard[7][8] = 0

    SudokuBoard[8][0] = 0

    SudokuBoard[8][1] = 0

    SudokuBoard[8][2] = 9

    SudokuBoard[8][3] = 0

    SudokuBoard[8][4] = 0

    SudokuBoard[8][5] = 5

    SudokuBoard[8][6] = 0

    SudokuBoard[8][7] = 0

    SudokuBoard[8][8] = 0

    printBoard(SudokuBoard)

    sudokuSolver(SudokuBoard)

    #file.close()

    

if __name__ == "__main__":

    main()

 

小结

  这次个人项目对我来说有点麻烦。因为用python的能力没那么厉害。起初,我想用C语言来写,但在写代码有点麻烦,也没那么厉害。然后我使用python来写。完成作业后,我得到了很多知识,用python的能力提高了一点点。

 

posted @ 2018-04-16 19:47  丁诺  阅读(382)  评论(0编辑  收藏  举报