2013-11-24 91 views
0

这是一个使用一些OOP的井字游戏的开始。更新类的实例变量时遇到问题(如果我有我的术语)。当我经历while循环时,我不存储条目。OOP Python Tic Tac Toe更新班级板

我已经通读了文档,并且对OOP有一点经验,我尝试了其他一些方法,但是我不能分辨出我的前提是否错误,我需要朝另一个方向走,或者如果我离解决方案还有一段距离。 (我希望这种格式正确!)

class Board: 

    def __init__(self, square1=' ', square2=' ', square3=' ', square4=' ', square5=' ', square6=' ', square7=' ', square8=' ', square9=' '): 
     self.square1 = square1 
     self.square2 = square2 
     self.square3 = square3 
     self.square4 = square4 
     self.square5 = square5 
     self.square6 = square6 
     self.square7 = square7 
     self.square8 = square8 
     self.square9 = square9 
     self.grid = '\nSQUARES ARE 0-8, TOP LEFT TO BOTTOM RIGHT, TRAVEL HORIZONTALLY\n | | \n '+square1+' | '+square2+' | '+square3+' \n___|___|___\n | | \n '+square4+' | '+square5+' | '+square6+' \n___|___|___\n | | \n '+square7+' | '+square8+' | '+square9+' \n | | ' 


game=Board() 

print(game.grid) 

while True: 
    entry = input('Please enter a number\n') 
    if entry == '0': 
     update = Board(square1='X') 

    elif entry == '1': 
     update = Board(square2='X') 

    elif entry == '2': 
     update = Board(square3='X') 

    elif entry == '3': 
     update = Board(square4='X') 

    elif entry == '4': 
     update = Board(square5='X') 

    elif entry == '5': 
     update = Board(square6='X') 

    elif entry == '6': 
     update = Board(square7='X') 

    elif entry == '7': 
     update = Board(square8='X') 

    elif entry == '8': 
     update = Board(square9='X') 

    print(update.grid) 
+1

学习列表的概念。它会让你的问题更容易 –

+4

有一个称为DRY的编程规则,用于“不要重复自己”。无论何时你发现自己写了一遍又一遍的非常类似的代码,这是一个标志,你的工作水平太低,需要向上移动。在这种情况下,您是否熟悉Python'list'和/或'dict'数据类型? – DSM

回答

0

以下是我认为从当前代码到工作示例的最短路径。

这绝对不是我建议你从头开始编写这些代码 - 其他的答案告诉你如何使用Python列表和方法/函数干净地做到这一点。

但是,查看我已更改的内容并将其与原始版本进行比较可能会有所帮助。我认为你在如何使用课程方面遇到麻烦(在update = Board(square2='X')等地方)。

class Board: 

    def __init__(self, square1=' ', square2=' ', square3=' ', square4=' ', square5=' ', square6=' ', square7=' ', square8=' ', square9=' '): 
     self.square1 = square1 
     self.square2 = square2 
     self.square3 = square3 
     self.square4 = square4 
     self.square5 = square5 
     self.square6 = square6 
     self.square7 = square7 
     self.square8 = square8 
     self.square9 = square9 

    def grid(self): 
     message = '\nSQUARES ARE 0-8, TOP LEFT TO BOTTOM RIGHT, TRAVEL HORIZONTALLY\n | | \n ' + self.square1+' | '+self.square2+' | '+self.square3+' \n___|___|___\n | | \n '+self.square4+' | '+self.square5 + ' | ' + self.square6+' \n___|___|___\n | | \n ' + self.square7 + ' | ' + self.square8+' | ' + self.square9+' \n | | ' 
     print(message) 


game=Board() 

print(game.grid) 

while True: 
    entry = raw_input('Please enter a number\n') 
    if entry == '0': 
     game.square1='X' 

    elif entry == '1': 
     game.square2='X' 

    elif entry == '2': 
     game.square3='X' 

    elif entry == '3': 
     game.square4='X' 

    elif entry == '4': 
     game.square5='X' 

    elif entry == '5': 
     game.square6='X' 

    elif entry == '6': 
     game.square7='X' 

    elif entry == '7': 
     game.square8='X' 

    elif entry == '8': 
     game.square9='X' 

    print(game.grid()) 
+0

太棒了!我实际上尝试过game.square(n)='X',但缺少print(game.grid())以及其他一些东西。 我意识到我的代码并不理想,但在我发展的这个早期阶段,我应该努力改写它吗?到目前为止,我已经尽可能地写下了写作的轨迹,然后修改我的代码,除非这是绝对的灾难。 对此有何共识? 顺便说一句,谢谢。 –

3

OOP代表面向对象的编程。在这种情况下,您的对象是Board。该class就像你用它来创建其他板的模板,使用:

new_board = Board() 

从这一点上,你与你的new_board,这是一个Board实例工作。我的意思是,在你的while循环中,当你做update = Board...而不是修改以前的时候,你会创建新的板子。

为了做到这一点,你应该添加方法,你的董事会。这些功能将会修改电路板。另外,您应该使用其他类型的数据结构(如列表)将数据存储在您的类中。例如:

class Board: 

    def __init__(self): 
     self.squares = [0] * 9 

    def check_square(self, number): 
     self.squares[number] = 'X' 

    def print_grid(self): 
     # printing code here 

game=Board() 
game.print_grid() 

while True: 
    entry = input('Please enter a number\n') 

    game.check_square(int(entry)) 
    game.print_grid() 

我希望你有这种感觉。

+1

这是一个很好的答案,但我认为'square'的元素应该坚持一种数据类型,而不是有时是'int',有时是字符串。你需要一个空值,一个交叉值和一个圆圈值,所以字符串'' - ','X'和'O''可能是一个很好的开始。 – Marius

+0

是的,你说得对。我没有意识到我正在使用一个整数作为默认值('[0]'),然后在检查正方形时使用了一个字符串。像这样的事情不会发生在像C++这样严肃的编程语言中......只是在开玩笑:) –

2

你可以试试这个方法:

class Board: 
    def __init__(self): 
     self.fields = [[0, 0, 0], [0, 0, 0], [0, 0, 0]] 

    def update(self, n, seed): 
     self.fields[(n/3)][n % 3] = seed 

    def printBoard(self): 
     print 
     for l in self.fields: 
      for e in l: 
       print e, 
      print 

b = Board() 

b.printBoard() 

b.update(1, 'X') 
b.printBoard() 

>>> 0 0 0 
    0 0 0 
    0 0 0 

    0 X 0 
    0 0 0 
    0 0 0 
0

正如你应该使用列表,而不是申报的9级不同的变量
评论说还你所面临的问题是,你没有更新的游戏板,而您正在创建被初始化一些广场设置为“X'`

一个新的董事会对象可以在Board Class

使用setter函数3210
class Board(object): 
    def __init__(self): 
     self.block=[] 
     for i in range(0,9): 
      self.block.append(" ") 

    def print_Grid(self): 
     #print self.block 
     # print in a required manner using list self.block 

    def setBlock(self,index): 
     self.block[index]='X' 

obj=Board()#create board 

while True: 
    entry = input('Index of grid to be filled\n') 
    obj.setBlock(entry) 
    obj.print_Grid() 

这是通过它可以实现您的目标的基本方法... 也可以谷歌约settergetter功能。