检查玩家X或玩家Y是否赢得了功能/模块。 Tic Tac Toe

时间:2018-03-11 23:18:55

标签: python python-3.x

您好!我有一个问题人。

我正在编写我的第一个严肃的python培训项目,因为我是初学者,但我遇到了一个问题,阻止我进一步开发我的程序。

我不知道如何在我的班级中编写 function / module 来检查玩家X或玩家Y是否赢了。我尝试了很多不同的方法,但它似乎不起作用。 我知道我的代码看起来很糟糕。感谢您花费的时间。

import sys

class Tic_tac_toe():

    def __init__(self):
        self.board = {'top-L': ' ', 'top-M': ' ', 'top-R': ' ',
                      'mid-L': ' ', 'mid-M': ' ', 'mid-R': ' ',
                      'low-L': ' ', 'low-M': ' ', 'low-R': ' '}
        self.move_X = None
        self.move_0 = None
        self.WINNING_MOVE = None
        self.loop = None
        self.nameX = None
        self.nameO = None
        self.choice = None

    def welcome(self):
        try:
            print("Welcome ! :)\n\nWho is PLAYER X ? :")
            self.nameX = input()
            print("\nWho is PLAYER O ? :")
            self.nameO = input()
            print("\nHello {} and {}, ready to play? (Y/N) :".format(self.nameX.title(), self.nameO.title()))
            self.choice = input()
            if self.choice.title() == 'N' or '\n':
                sys.exit()
            print('\n{} is PLAYER X.\n{} is PLAYER Y.'.format(self.nameX.title(),self.nameO.title()))
        except ValueError:
            print('\nTry again:\n')


    def printBoard(self):
        print()
        print(self.board['top-L'] + '|' + self.board['top-M'] + '|' + self.board['top-R'])
        print('-+-+-')
        print(self.board['mid-L'] + '|' + self.board['mid-M'] + '|' + self.board['mid-R'])
        print('-+-+-')
        print(self.board['low-L'] + '|' + self.board['low-M'] + '|' + self.board['low-R'])
        print()

    def moves_X(self):
        try:
            self.move_X = int(input("Player X :\nChoose field (1,9) : "))
            self.write_on_boardX()
            self.printBoard()
        except ValueError:
            print("\nYOU DIDN'T ENTER NUMBER !\n")

    def moves_O(self):
        try:
            self.move_O = int(input("Player O :\nChoose field (1,9) : "))
            self.write_on_boardO()
            self.printBoard()
        except ValueError:
            print("\nYOU DIDN'T ENTER NUMBER!\n")

    def mix_XO(self):
        self.loop = 0
        for x in range(1,10):
            if self.loop % 2 == 0:
                self.moves_X()
                self.loop += 1
            elif self.loop % 2 == 1:
                self.moves_O()
                self.loop += 1

    def write_on_boardX(self):
        if self.move_X == 1:
            self.board['top-L'] = 'X'
        elif self.move_X == 2:
            self.board['top-M'] = 'X'
        elif self.move_X == 3:
            self.board['top-R'] = 'X'
        elif self.move_X == 4:
            self.board['mid-L'] = 'X'
        elif self.move_X == 5:
            self.board['mid-M'] = 'X'
        elif self.move_X == 6:
            self.board['mid-R'] = 'X'
        elif self.move_X == 7:
            self.board['low-L'] = 'X'
        elif self.move_X == 8:
            self.board['low-M'] = 'X'
        elif self.move_X == 9:
            self.board['low-R'] = 'X'

    def write_on_boardO(self):
        if self.move_O == 1:
            self.board['top-L'] = 'O'
        elif self.move_O == 2:
            self.board['top-M'] = 'O'
        elif self.move_O == 3:
            self.board['top-R'] = 'O'
        elif self.move_O == 4:
            self.board['mid-L'] = 'O'
        elif self.move_O == 5:
            self.board['mid-M'] = 'O'
        elif self.move_O == 6:
            self.board['mid-R'] = 'O'
        elif self.move_O == 7:
            self.board['low-L'] = 'O'
        elif self.move_O == 8:
            self.board['low-M'] = 'O'
        elif self.move_O == 9:
            self.board['low-R'] = '0'

    def winning_movesX(self):
        pass

def main():
    app = Tic_tac_toe()
    app.welcome()
    app.printBoard()
    app.mix_XO()

main()

2 个答案:

答案 0 :(得分:-1)

实现这一目标的一种方法是首先创建一个包含所有可能获胜'行'的地图,然后通过创建一个集合并检查它是否只包含1个项目来查看该行上的元素是否完全相同({{ 1}}或X)。例如:

O

答案 1 :(得分:-1)

不同的方法可能更容易......

  

更简单的方法是使用3x3矩阵,例如用:

     
      
  • 0作为默认值
  •   播放器1的
  • -1
  •   
  • +1 for player 2
  •   
     

然后,您可以计算行/列/对角线的总和。随着-3作为一名球员获胜,+ 3作为一名球员2获胜。例如,使用numpy:

>>> import numpy as np
>>> np.zeros((3, 3), dtype=int)
array([[0, 0, 0],
       [0, 0, 0],
       [0, 0, 0]])

=> self.board = np.zeros((3,3), dtype=int)

并且胜利检查大致如下:

d1,d2 = 0,0 #used to calculate sum of diagonal 

for i in range(3):
    #check row
    if sum(self.board[i, :]) in (3,-3):
        self.win = True
    #check column
    elif sum(self.board[:, i]) in (3,-3):
        self.win = True
    #check diagonal
    d1 += self.board[i, i]   #diagonal from top left corner to bottom right corner
    d2 += self.board[i, 2-i] #diagonal from top right corner to bottom left corner
    elif d1 in (3,-3) or d2 in (-3,3):
        self.win = True

注意:你知道哪个玩家赢了,因为你知道谁是最后一个。

好吧,既然你在这里看起来对python很新,那就快速概述如何访问数组的元素:

>>> board = np.zeros((3,3), dtype=int)
>>> board[0][1] = 3
>>> board
array([[0, 3, 0],
       [0, 0, 0],
       [0, 0, 0]])

如果你保留这个委员会:

"""
 [1] | [2] | [3]
-----------------
 [4] | [5] | [6]
-----------------
 [7] | [8] | [9]
"""

您可以使用整数除法//和模数函数%而不是所有elif语句来确定用户意味着电路板上的字段/位置:

position = int(input("Choose position:"))

   row = (position-1)//3
column = (position-1)%3

self.board[row][column] = 1 #or -1

<强> P.S:
如果你想实现一个&#34;播放器与电脑&#34;稍后,您可以将值-1更改为-3以获取唯一的总和值。 (-1 +1 +0 = 0 +0 +0)