2012-11-29 5 views
1

나는 Python 클래스를위한 프로그램을 작성하고있다. Tic Tac Toe 게임을 만들려면 반드시 OOP를 사용해야합니다. 내가 완료 한 몇 가지 요구 사항이 있습니다. 최종 요구 사항은 컴퓨터 플레이어가 차단하는 것과 같은 일을하는 '똑똑한'것이어야 할 때 연속적인 장소를 재생해야한다는 것입니다. 교수님은 실제로이 일을하는 방법에 대한 지침을 제공하지 않으므로 조금 당황 스럽습니다.객체 지향 Tic Tac Toe in Python

나는 지금 프로그램에서 플레이어가 수평 행을 통해 우승 한 것이 아닌가를 확인하려고 시도하고 있습니다. 여기에 내 코드가 있습니다 (매우 지저분하고 비효율적입니다.).

from random import randint 

class TTT: 
    board = [[' ' for row in range(3)] for col in range(3)] 
    currentgame = [] 

    def print(self): 
     print("\n-----\n".join(["|".join(row) for row in self.board])) 

    def mark(self,pos,mark): 
     x,y = pos 
     self.board[x][y] = mark 

    def win(self,mark): 
     if mark == self.board[0][0] == self.board[1][1] == self.board[2][2]: 
      return True 
     if mark == self.board[2][0] == self.board[1][1] == self.board[0][2]: 
      return True 
     elif mark == self.board[0][0] == self.board[1][0] == self.board[2][0]: 
      return True 
     elif mark == self.board[1][0] == self.board[1][1] == self.board[1][2]: 
      return True 
     elif mark == self.board[0][1] == self.board[1][1] == self.board[2][1]: 
      return True 
     elif mark == self.board[0][2] == self.board[1][2] == self.board[2][2]: 
      return True 
     elif mark == self.board[0][0] == self.board[0][1] == self.board[0][2]: 
      return True 
     elif mark == self.board[2][0] == self.board[2][1] == self.board[2][2]: 
      return True 
     else: 
      return False 

    def choose(self,mark): 
     if self.board == [[' ', ' ', ' '], [' ', ' ', ' '], [' ', ' ', ' ']]: 
      self.mark((randint(0,2),randint(0,2)),mark) 

    def choose(self,mark): 
     spotx = randint(0,2) 
     spoty = randint(0,2) 
     if self.board[spotx][spoty] == ' ': 
      self.mark((spotx,spoty),mark) 
     else: 
      self.choose(mark) 


    def choose(self,mark): 
     spotx = randint(0,2) 
     spoty = randint(0,2) 
     if self.rowabouttowin(mark) == (0,0) or (0,1) or (0,2) or (1,0) or (1,1) or (1,2) or (2,0) or (2,1) or (2,2): 
      self.mark((self.rowabouttowin(mark)),mark) 
     if self.legalspace(spotx,spoty): 
      self.mark((spotx,spoty),mark) 
     else: 
      self.choose(mark) 


    def legalspace(self,spotx,spoty): 
     if self.board[spotx][spoty] == ' ': 
      return True 
     else: 
      return False 


    def rowabouttowin(self,mark): 
     for row in range(3): 
      if self.board[row] == [mark,mark,'']: 
       return (row,2) 
      if self.board[row] == [mark,'',mark]: 
       return (row,1) 
      if self.board[row] == ['',mark,mark]: 
       return (row,0) 
      else: 
       return 4 

내 문제는 내가 오류 메시지가 얻을 수 있습니다 : 할당 크게 넘어로, 여기에 지식의 내 영역에서 솔직히

Traceback (most recent call last): 
    File "<pyshell#194>", line 1, in <module> 
    x.choose('x') 
    File "/Users/richiehoffman/Documents/Python Programs/Tic Tac Toe.py", line 64, in choose 
    self.mark((self.rowabouttowin(mark)),mark) 
    File "/Users/richiehoffman/Documents/Python Programs/Tic Tac Toe.py", line 23, in mark 
    x,y = pos 
TypeError: 'int' object is not iterable 

난 무엇 클래스의 일의 몇 우리 객체 지향 파이썬에 보냈다. 내가 선택 또는 반복 가능한 데이터 대신 정수를 출력하는 rowabouttowin 메서드의 일부 지점에서 오류가 발생했다고 확신합니다.

어떤 도움이 필요합니까? 이것은 그런데

self.mark()에 예상대로 int 대신 (int,int) 반환

+0

조금 벗어난 주제이지만, 실제로 똑똑한 IA를 구현하려면 [xkcd tic-tac-toe map] (http://xkcd.com/832/)을 확인하십시오. 당연히 당신은 가끔 IA가 부합되도록하기 위해 차선책을 수행하게합니다. – lucasg

답변

2
def rowabouttowin(self,mark): 
    [...] 
    return 4 

, 난 당신의 코드는 모두 (예 : mark으로) 같은 이름을 사용하지 않은 경우 훨씬 더 읽을 것 생각 변수, 메소드 및 매개 변수

+0

위와 같이 명명에 관해서는 choose라는 3 개의 함수가 있습니다. – timc

관련 문제