выполнение метода, проверяющего, являются ли значения в кадре данных определенным значением - PullRequest
0 голосов
/ 24 апреля 2020

Я делаю игру ti c ta c toe, используя фрейм данных. Как я могу сделать функцию, чтобы проверить, есть ли три в строке типа «о» или «х» и заставить его изменить статус игры на ГОТОВО. До сих пор я сделал так, чтобы пользователь мог добавлять слоты, вводя координаты и символ, который они выбрали для заполнения.

import pandas as pd

tic_tac_toe = { 'col1' : ('-','-','-'), 'col2': ('-','-','-'),'col3': ('-','-','-')}
dataframetictac = pd.DataFrame(data = tic_tac_toe)
dftt= dataframetictac.rename(index={0: 'row1', 1: 'row2', 2 : 'row3'})
game_status = "NOT OVER"

while game_status != "DONE":

    user_move = input("Enter row number,column number, either x or an o :\n for example %%!(1,1,x)")
    if user_move == '(1,1,x)':
        dftt.at['row1','col1'] = 'X'
    if user_move == '(1,1,o)':
        dftt.at['row1','col1'] = 'O'
    if user_move == '(2,1,x)':
        dftt.at['row2','col1'] = 'X'
    if user_move == '(2,1,o)':
        dftt.at['row2','col1'] = 'O'
    if user_move == '(3,1,x)':
        dftt.at['row3','col1'] = 'X'
    if user_move == '(3,1,o)':
        dftt.at['row3','col1'] = 'O'
    #
    if user_move == '(1,2,x)':
        dftt.at['row1','col2'] = 'X'
    if user_move == '(1,2,o)':
        dftt.at['row1','col2'] = 'O'
    if user_move == '(2,2,x)':
        dftt.at['row2','col2'] = 'X'
    if user_move == '(2,2,o)':
        dftt.at['row2','col2'] = 'O'
    if user_move == '(3,2,x)':
        dftt.at['row3','col2'] = 'X'
    if user_move == '(3,2,o)':
        dftt.at['row3','col2'] = 'O'
    #
    if user_move == '(1,3,x)':
        dftt.at['row1','col3'] = 'X'
    if user_move == '(1,3,o)':
        dftt.at['row1','col3'] = 'O'
    if user_move == '(2,3,x)':
        dftt.at['row2','col3'] = 'X'
    if user_move == '(2,3,o)':
        dftt.at['row2','col3'] = 'O'
    if user_move == '(3,3,x)':
        dftt.at['row3','col3'] = 'X'
    if user_move == '(3,3,o)':
        dftt.at['row3','col3'] = 'O'
    print (dftt)

1 Ответ

0 голосов
/ 24 апреля 2020

Я думаю, что вы можете использовать следующий код для функции "игра окончена":

def columns_check(df):
    for col in df.columns:
        if df.loc[df[col]=='x'].shape[0]==3 or df.loc[df[col]=='o'].shape[0]==3:
            return 'DONE'
    return 'The game is still on'
def rows_check(df):
    for index, row in df.iterrows():
        if row[row=='x'].shape[0]==3 or row[row=='o'].shape[0]==3:
            return 'DONE'
    return 'The game is still on'
def diagonal_check ():
    df_tmp=pd.DataFrame()
    for i, data in enumerate(dftt.iterrows()):
        index, row = data[0], data[1]
        df_tmp = df_tmp.append(row.shift(-i))
    check_tmp = columns_check(df_tmp)
    if check_tmp == 'DONE':
        return 'DONE'
    df_tmp=pd.DataFrame()
    for i, data in enumerate(dftt.iterrows()):
        index, row = data[0], data[1]
        df_tmp = df_tmp.append(row.shift(i))
    columns_check(df_tmp)
    check_tmp = columns_check(df_tmp)
    if check_tmp == 'DONE':
        return 'DONE'
    return 'The game is still on'
check = diagonal_check ()
print(check)

Я создал код с функциями, где проверяются разные сценарии игры ios.

Вы можете вызвать обе функции следующим образом:

check = columns_check(dftt)

или

ckeck = rows_check(dftt)

РЕДАКТИРОВАТЬ Я отредактировал код выше, поэтому он возвращает строку «ВЫПОЛНЕНО» когда игра окончена Я думаю, что это то, что вы хотите в своем комментарии

** Edit ** Я создал еще одно решение (смотрите код ниже) для вашей проблемы, которое является более элегантным и намного быстрее.

X = 'x'
O = 'o'
def check_win (dftt):
    b = dftt.values
    diagonal1 = b.diagonal()
    diagonal2 = np.fliplr(b).diagonal()
    if 3 in (b==X).sum(axis=0) or 3 in (b==X).sum(axis=1) or (diagonal1==X).sum() == 3 or (diagonal2==X).sum() == 3:
            return(f"Game over, {X} wins")
    if 3 in (b==O).sum(axis=0) or 3 in (b==O).sum(axis=1) or (diagonal1==O).sum() == 3 or (diagonal2==O).sum() == 3:
            return(f"Game over, {O} wins")
    return 'The game is still on'




check_win (dftt)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...