私は割り当てのために三目並べゲームを書いています。オブジェクト指向プログラミングを使用する必要があります。パイソン - OOPチックタックトー
私の問題は、ボードがいっぱいであるかどうかをチェックして、同じプレーヤーでゲームを再開する方法を実装することです。 私はすでに、すべてのフィールドがいっぱいしかし、誰成功しているかどうかをチェックする、活躍の場を反復処理しようとしています。
私はまた、勝利した選手を宣伝し、占拠した選手を選んだ場合、前の選手を昇進させることにいくつか問題があります。私は、プレイヤーやターンを追跡するために私の主な機能のforループを変更する必要があると思うが、私はどのように手掛かりがありません。
class Player(object):
def __init__(self, name, symbol, initial_score=0):
self.name= name
self.symbol= symbol
self.score= initial_score
def won_match(self):
self.score+= 100
def lost_match(self):
self.score-= 50
def show_score(self):
print('Player {}: {} points'.format(self.name, self.score))
class PlayingField(object):
def __init__(self):
self.field= [
[None, None, None],
[None, None, None],
[None, None, None]
]
def show_field(self):
for row in self.field:
for player in row:
print('_' if player is None else player.symbol,end=' ')
print()
def set_player(self, x, y, player):
if self.field[y][x] is not None:
return False
self.field[y][x]= player
return True
def full_board(self):
for row in self.field:
for col in row:
if col is None:
return False
return True
def check_won(self, x, y, player):
if self.field[0][x] == player and self.field[1][x] == player and self.field[2][x] == player:
return True
elif self.field[y][0] == player and self.field[y][1] == player and self.field[y][2] == player:
return True
elif self.field[0][0] == player and self.field[1][1] == player and self.field[2][2] == player:
return True
elif self.field[0][2] == player and self.field[1][1] == player and self.field[2][0] == player:
return True
else:
return False
def main():
name_1= input('Name of Player 1: ')
name_2= input('Name of Player 2: ')
players= [
Player(name_1, 'X'),
Player(name_2, 'O')
]
field= PlayingField()
while True:
for player in players:
field.show_field()
x= int(input('Player {} choose your column: '.format(player.name))) - 1
y= int(input('Player {} choose your row: '.format(player.name))) - 1
if not field.set_player(x, y, player):
print('That field is already occupied.')
elif field.full_board():
field.show_field()
print('full board')
for player in players:
print('{}: {}'.format(player.name, player.score))
field= PlayingField()
elif field.check_won(player):
field.show_field()
print('Player {} won the game.'.format(player.name))
print('Score')
for player in players:
if field.check_won(player) == True:
player.won_match()
elif field.check_won(player) == False:
player.lost_match()
print('{}: {}'.format(player.name, player.score))
field= PlayingField()
if __name__ == '__main__':
main()
「私はすでに、すべてのフィールドがいっぱいしかし、誰成功しているかどうかをチェックする、活躍の場を反復処理しようとしています。」これは有効なアプローチです*どのように動作しませんでしたか? – timgeb
有効な「完全なボード」をハードコーディングするのではなく、 'check_won'のための再帰的な解決策を考えるべきです[tic-tac-toeのリファレンス](https://inventwithpython.com/chapter10.html) – GiantsLoveDeathMetal
です。あなたのソリューションは、サイズN X Nのボードは、nクイーン問題をチェックするためにスケールしません、それは三目並べボードを解決するための同様のロジックを持っています。 – chukkwagon