No offense intended, but your code was just too complex to understand easily. Below is an optimized version of what you are trying to do. It is not a complete solution, however, because a Sudoku game apparently cannot be created completely randomly as this program illustrates. I hope what you can take from this is not the solution as handed to you, but a means to understand how math, loops, and functions can aid in readability, optimization, and simplicity. Try to understand what I did here and not simply use it. Then, perhaps you can further find ways to improve it to actually do what you want to do. It does solve your '1' problem though. It just may not solve your 5 and up problem :-D. Good luck and I hope this helps!!
#sudoku game
from random import randint
#generate board
def build_board():
board=[]
for i in range(9):
block=[[" "," "," "],
[" "," "," "],
[" "," "," "]]
board.append(block)
return board
##
## Ensure no other block in the same row has the value
##
def row_available(block, row, board, num):
# Determine which of the main 3 rows this 3x3 block is at
boardRow = int(block / 3);
good = True
for b in range(boardRow * 3, (boardRow * 3) + 3):
if b != block:
if num in board[b][row]:
good = False
break
return good
##
## Ensure no other block in the same col has the value
##
def col_available(block, row, col, board, num):
# Determine which of the main 3 columns this 3x3 block is at
boardCol = block % 3;
good = True
for b in (boardCol, boardCol + 3, boardCol + 6):
if b != block:
if num == board[b][row][col]:
good = False
break
return good
def fill_board(board):
# to fill all numbers 1 through 9
for num in range(1,10):
# for each of the 9 3x3 blocks
for block in range(len(board)):
triedRow = [-1]
foundSpot = False
for i in range(3):
row = -1
while row in triedRow:
row = randint(0,2)
triedRow.append(row)
if " " in board[block][row] and row_available(block, row, board, num):
triedCol = [-1]
for j in range(3):
col = -1
while col in triedCol:
col = randint(0,2)
triedCol.append(col)
if " " == board[block][row][col] and col_available(block, row, col, board, num):
board[block][row][col] = num
foundSpot = True
if foundSpot:
break
if foundSpot:
break
if not foundSpot:
print("Never Found a Spot for " + str(num) + " in block " + str(block))
return board
#display board
def display(board):
num=[]
for i in board: #block level
for subI in i: #row
for subsubI in subI: #item
num.append(subsubI)
print("---------------------------------------")
print("| {} | {} | {} || {} | {} | {} || {} | {} | {} |".format(num[0],num[1],num[2],num[9],num[10],num[11],num[18],num[19],num[20]))
print("---------------------------------------")
print("| {} | {} | {} || {} | {} | {} || {} | {} | {} |".format(num[3],num[4],num[5],num[12],num[13],num[14],num[21],num[22],num[23]))
print("---------------------------------------")
print("| {} | {} | {} || {} | {} | {} || {} | {} | {} |".format(num[6],num[7],num[8],num[15],num[16],num[17],num[24],num[25],num[26]))
print("---------------------------------------")
print("---------------------------------------")
print("| {} | {} | {} || {} | {} | {} || {} | {} | {} |".format(num[27],num[28],num[29],num[36],num[37],num[38],num[45],num[46],num[47]))
print("---------------------------------------")
print("| {} | {} | {} || {} | {} | {} || {} | {} | {} |".format(num[30],num[31],num[32],num[39],num[40],num[41],num[48],num[49],num[50]))
print("---------------------------------------")
print("| {} | {} | {} || {} | {} | {} || {} | {} | {} |".format(num[33],num[34],num[35],num[42],num[43],num[44],num[51],num[52],num[53]))
print("---------------------------------------")
print("---------------------------------------")
print("| {} | {} | {} || {} | {} | {} || {} | {} | {} |".format(num[54],num[55],num[56],num[63],num[64],num[65],num[72],num[73],num[74]))
print("---------------------------------------")
print("| {} | {} | {} || {} | {} | {} || {} | {} | {} |".format(num[57],num[58],num[59],num[66],num[67],num[68],num[75],num[76],num[77]))
print("---------------------------------------")
print("| {} | {} | {} || {} | {} | {} || {} | {} | {} |".format(num[60],num[61],num[62],num[69],num[70],num[71],num[78],num[79],num[80]))
print("---------------------------------------")
#test
board=build_board()
board=fill_board(board)
display=display(board)
Typical Output:
Never Found a Spot for 5 in block 5
Never Found a Spot for 9 in block 4
---------------------------------------
| 7 | 9 | 1 || 4 | 6 | 8 || 5 | 3 | 2 |
---------------------------------------
| 6 | 8 | 3 || 2 | 5 | 9 || 4 | 1 | 7 |
---------------------------------------
| 2 | 5 | 4 || 3 | 7 | 1 || 8 | 6 | 9 |
---------------------------------------
---------------------------------------
| 3 | 2 | 9 || 7 | 8 | || 6 | 4 | 1 |
---------------------------------------
| 1 | 7 | 6 || 5 | 3 | 4 || 9 | 8 | 2 |
---------------------------------------
| 8 | 4 | 5 || 6 | 1 | 2 || | 7 | 3 |
---------------------------------------
---------------------------------------
| 4 | 3 | 6 || 5 | 9 | 2 || 7 | 1 | 8 |
---------------------------------------
| 5 | 1 | 2 || 3 | 7 | 8 || 6 | 9 | 4 |
---------------------------------------
| 7 | 9 | 8 || 1 | 6 | 4 || 5 | 3 | 2 |
---------------------------------------