Welcome, guest | Sign In | My Account | Store | Cart

This is a simple sudoku game.

Python, 124 lines
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
 #<><><><><><><><><><><><><><><><><><><><><><><><> sodoko puzzle <><><><><><><><><><><><><><><><><><><><><><><><>
#  By : Amir Naghvi , Olempico@Gmail.com  #


import random

global Platform
global fill
Platform=[[0 for i in  "."*9]for i in "."*9] # Main table to Handle Game

class main(object):
    "------------- start --------------"
    def __init__(self):
        pass
    
    def gameloop(self): # ----------------GAME LOOP
        while True:
            o=raw_input('to show puzzle enter s to quit enter q: ')
            if o=="s":self.show()
            elif o=="q":return
            d=raw_input('first X then Y then NUM like  XyNumber (for example 245):  ')
            x=int(d[0]);y=int(d[1]);num=int(d[2])
            if self.give(x,y,num):
                print "True"
            else:
                print "you entered incorrect";
            self.show()
            
    def show(self): # -------To Printing puzzle
        c1=0
        c2=0
        for i in Platform:
            if c1%3==0:print" ->>"*21,
            print "     "
            c1+=1
            for j in i:
                c2+=1
                if j==0:
                    print " ","_ _"," ",
                    if c2%3==0:print r"|||",;
                else:
                    print " ",j," "," ",
                    if c2%3==0:print r"|||",;
            print "\n";
        print "\n\n";
            
    def give(self,x,y,NUM):  # ---for recieving number and it's position
        """ first checks if the position in not filled then change position's number
        then if the number is not valid changes the position number to 0 again and returns False"""
        
        if Platform[x-1][y-1]!=0:
            print"\n_________Already Filled__________\n";
            return False
        Platform [x-1][y-1]=NUM
        if not self.control(x,y):
            Platform [x-1][y-1]=0
            return False
        else:
            return True
            
    def control(slef,x,y):
        """There is Three checking stages:1st we find the number's row ,column and cube number then
        check if the row has not the same numbers  ,2nd we collect the number's colmn neigbours in 'colmns' list
        and simply do checking again 3rd: for checking the number in its cube area i explain below:"""
        row=x-1;#print row
        col=y-1;#print col
        
        # 1. row test >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>.1
        rows=[Platform[row][i] for i in range(9)]
        for i in range(9):
            for j in range(9):
                if j!=i:
                    if rows[i]==rows[j] and rows[i]!=0 and rows[j]!=0:
                        if not fill:
                            print 'row'
                        return False
                        
        # 2. column test >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>.2
        colmns=[Platform[i][col] for i in range(9)]
        for i in range(9):
            for j in range(9):
                if j!=i:
                    if colmns[i]==colmns[j] and colmns[j]!=0 and colmns[i]!=0:
                        if not fill:
                            print 'col'
                        return False
                    
        # 3. 3x3 Cubes >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>.3
        """ 1.frst for 'first' cube number in X attitiude and sec second cube number in y ,for example centeral cube is (3,3)
        or first cube from bottom is (0,6) 2.then in 'cube' list i gather the cube numbers and 3.then simply check if there is a
        repeated numbers"""
        # 1.
        frst=-1
        sec=-1
        if row<3:frst=0
        elif row<6:frst=3
        elif row<9:frst=6
        if col<3:sec=0
        elif col<6:sec=3
        elif col<9:sec=6
        # 2.
        cube=[Platform[frst][sec+i]for i in range(3)] # creating cube
        cube.extend([Platform[frst+1][sec+i]for i in range(3)])
        cube.extend([Platform[frst+2][sec+i]for i in range(3)])
        # 3.
        for i in range(9):
            for j in range(9):
                if j!=i:
                    if cube[i]==cube[j] and cube[i]!=0 and cube[j]!=0:
                        if not fill:
                            print 'cube'
                        return False
        return True

    
        

# *********************************************************************
# *********************************************************************
if __name__=="__main__":
    o=main()                     # RUN
    o.gameloop()
# *********************************************************************
# *********************************************************************

some explanations is in code. if you have any improvement or better code, delight to see it

4 comments

amir naghavi (author) 10 years, 6 months ago  # | flag

I changed it first because it has a little bug in line 96 to 101 in assigning cube values then i put a Fill function to better initialize game.

amir naghavi (author) 10 years, 6 months ago  # | flag

now i am working on a backtracking algorithm,so in future i'll change the fill function with a backtracking algorithm to solve puzzle automatically.

Dafeng Jin 10 years, 6 months ago  # | flag

Why it appear "10"?Isn't sudoku from "0-9"?

amir naghavi (author) 10 years, 6 months ago  # | flag

sorry ,yes i it must be 9x9 array . i had some mistake in this code and i renew it by a newer version.

Created by amir naghavi on Mon, 23 May 2011 (MIT)
Python recipes (4591)
amir naghavi's recipes (5)

Required Modules

  • (none specified)

Other Information and Tasks