BoardTestCase.py ¶
~cpp
import unittest
from Board import *
class BoardTestCase (unittest.TestCase):
def setUp (self):
self.bd = QueenBoard ()
def tearDown (self):
self.bd = None
def testBoardEmpty (self):
self.assertEquals (self.bd.GetData (2,2), 0)
def testSetQueen (self):
self.bd.SetQueen (2,2)
self.assertEquals (self.bd.GetData (2,2) ,1)
def testPrintBoard (self):
self.bd.SetQueen (1,1)
self.bd.SetQueen (2,2)
self.bd.SetQueen (7,7)
self.assertEquals (self.bd.PrintBoard (), '''00000000\n01000000\n00100000\n00000000\n00000000\n00000000\n00000000\n00000001\n''')
def testIsSelftyZone (self):
self.bd.SetQueen (2,2)
self.assertEquals (self.bd.IsSelftyZone (3,3), 0)
self.assertEquals (self.bd.IsSelftyZone (1,5), 1)
def testFindQueenInSameVertical (self):
self.bd.SetQueen (2,2)
self.assertEquals (self.bd.FindQueenInSameVertical (2), 1)
self.assertEquals (self.bd.FindQueenInSameVertical (3), 0)
def testFindQueenInSameHorizonal (self):
self.bd.SetQueen (2,2)
self.assertEquals (self.bd.FindQueenInSameHorizonal (2), 1)
self.assertEquals (self.bd.FindQueenInSameHorizonal (3), 0)
def testFindQueenInSameCrossLeftTopToRightBottom (self):
self.bd.SetQueen (2,2)
self.assertEquals (self.bd.FindQueenInSameCrossLeftTopToRightBottom (3,3), 1)
self.assertEquals (self.bd.FindQueenInSameCrossLeftTopToRightBottom (1,1), 1)
self.assertEquals (self.bd.FindQueenInSameCrossLeftTopToRightBottom (4,1), 0)
def testFindQueenInSameCrossLeftBottomToRightTop (self):
self.bd.SetQueen (2,2)
self.assertEquals (self.bd.FindQueenInSameCrossLeftBottomToRightTop (3,3), 0)
self.assertEquals (self.bd.FindQueenInSameCrossLeftBottomToRightTop (3,1), 1)
self.assertEquals (self.bd.FindQueenInSameCrossLeftBottomToRightTop (1,3), 1)
def testGetFirstCornerInCrossLeftTopToRightBottom (self):
self.assertEquals (self.bd.GetFirstCornerInCrossLeftTopToRightBottom (3,3), (0,0))
self.assertEquals (self.bd.GetFirstCornerInCrossLeftTopToRightBottom (4,3), (1,0))
self.assertEquals (self.bd.GetFirstCornerInCrossLeftTopToRightBottom (1,5), (0,4))
self.assertEquals (self.bd.GetFirstCornerInCrossLeftTopToRightBottom (0,0), (0,0))
def testGetFirstCornerInCrossLeftBottomToRightTop (self):
self.assertEquals (self.bd.GetFirstCornerInCrossLeftBottomToRightTop (2,2), (0,4))
self.assertEquals (self.bd.GetFirstCornerInCrossLeftBottomToRightTop (3,5), (1,7))
self.assertEquals (self.bd.GetFirstCornerInCrossLeftBottomToRightTop (7,7), (7,7))
def testIsAttackableOthers (self):
self.bd.SetQueen (2,2)
self.assertEquals (self.bd.IsAttackableOthers (3,3),1)
self.bd.SetQueen (7,1)
self.assertEquals (self.bd.IsAttackableOthers (7,1),0)
self.assertEquals (self.bd.IsAttackableOthers (4,4),1)
def testEightQueen (self):
## self.bd.EightQueen ()
## if all queen pass the function 'IsAttackableOthers'
self.bd.EightQueen ()
def testGetUnAttackablePositon (self):
self.bd.SetQueen (0,0)
self.assertEquals (self.bd.GetUnAttackablePosition (1), ((2,1),(3,1),(4,1),(5,1),(6,1),(7,1)))
self.assertEquals (self.bd.GetUnAttackablePosition (2), ((1,2),(3,2),(4,2),(5,2),(6,2),(7,2)))
suite = unittest.makeSuite (BoardTestCase, "test")
runner = unittest.TextTestRunner ()
runner.run (suite)
Board.py ¶
~cpp
class QueenBoard:
def __init__(self):
self.boardArray = {}
self.Empty ()
self.Flag = 0
self.Count = 0
def Empty (self):
for i in range (0,8):
for j in range (0,8):
self.boardArray[(i,j)] = 0
def GetData (self, x, y):
return self.boardArray[(y,x)]
def SetData (self, x, y, data):
self.boardArray[(y,x)] = data
def SetQueen (self, x, y):
self.boardArray[(y,x)] = 1
def IsSelftyZone (self, x, y):
# x, y position. check vertical, horizonal, two cross check.
if self.FindQueenInSameVertical (x):
return 0
elif self.FindQueenInSameHorizonal (y):
return 0
elif self.FindQueenInSameCrossLeftTopToRightBottom (x,y):
return 0
elif self.FindQueenInSameCrossLeftBottomToRightTop (x,y):
return 0
else:
return 1
def FindQueenInSameVertical (self, x):
for i in range (0,8):
if self.GetData (x,i) == 1:
return 1
return 0
def FindQueenInSameHorizonal (self, y):
for i in range (0,8):
if self.GetData (i,y) == 1:
return 1
return 0
def FindQueenInSameCrossLeftTopToRightBottom (self, x,y):
FirstCornerX, FirstCornerY = self.GetFirstCornerInCrossLeftTopToRightBottom (x,y)
FindRange = 8 - max (FirstCornerX, FirstCornerY)
for i in range (0,FindRange):
if self.GetData (FirstCornerX + i, FirstCornerY + i) == 1:
return 1
return 0
def FindQueenInSameCrossLeftBottomToRightTop (self, x,y):
FirstCornerX, FirstCornerY = self.GetFirstCornerInCrossLeftBottomToRightTop (x,y)
FindRange = FirstCornerY + 1 - FirstCornerX;
for i in range (0,FindRange):
if self.GetData (FirstCornerX + i, FirstCornerY - i) == 1:
return 1
return 0
def GetFirstCornerInCrossLeftTopToRightBottom (self, x,y):
CornerX = x - min (x,y)
CornerY = y - min (x,y)
return (CornerX, CornerY)
def GetFirstCornerInCrossLeftBottomToRightTop (self, x,y):
CornerX = x - min (x,abs(y-7))
CornerY = y + min (x,abs(y-7))
return (CornerX, CornerY)
def PrintBoard (self):
lines = ''
for i in range (0,8):
line = ''
for j in range (0,8):
line += "%d" % self.GetData (j,i)
lines += "%s\n" % line
return lines
def IsAttackableOthers (self, x,y):
TempData = self.GetData (x,y)
self.SetData (x,y,0)
if self.IsSelftyZone (x,y):
Ret = 0
else:
Ret = 1
self.SetData (x,y,TempData)
return Ret
def EightQueen (self):
self.Flag = 0
self.DefineQueen (0)
def DefineQueen (self, Level):
if Level == 8:
self.Count = self.Count + 1
print "%d. level : %d \n" % (self.Count, Level)
print self.PrintBoard ()
return 0
PositionList = self.GetUnAttackablePosition (Level)
for position in PositionList:
self.SetQueen (position[0], position[1])
Ret = self.DefineQueen (Level + 1)
if not Ret:
self.SetData (position[0],position[1], 0)
def GetUnAttackablePosition (self, Level):
UnAttackablePositionList = []
for i in range (0,8):
if not self.IsAttackableOthers (i, Level):
UnAttackablePositionList.append ((i,Level))
return tuple(UnAttackablePositionList)
def main (self):
self.EightQueen ()
if __name__ == '__main__':
bd = QueenBoard ()
bd.main ()










