Сетка настольной игры Python [Проблема с массивом и списком] - PullRequest
0 голосов
/ 07 ноября 2018
grid = [[' --- --- --- '], ['| 1 | 2 | 3 |'],
        [' --- --- --- '], ['| 4 | 5 | 6 |'],
        [' --- --- --- '], ['| 7 | 8 | 9 |'],
        [' --- --- --- ']] 

def board():
    for i in grid:
        print(''.join(i) 

def player():
    x = 0
    y = 0
    player1 = input("Enter Player1 move : ")
    for i in grid:
        for j in i:
            if j == player1:
                grid[1][1] = 'X'
    board()

player()

Выход:

 --- --- --- 
| 1 | 2 | 3 |
 --- --- --- 
| 4 | 5 | 6 |
 --- --- --- 
| 7 | 8 | 9 |
 --- --- --- 

Хотя код еще не завершен, моя проблема в том, что числа в сетке не меняются, когда их следует менять в соответствии с пользовательским вводом. Что я делаю не так !? (

Ответы [ 2 ]

0 голосов
/ 07 ноября 2018

В вашем коде есть несколько ошибок - см. Встроенные комментарии:

grid = [[' --- --- --- '], ['| 1 | 2 | 3 |'],
        [' --- --- --- '], ['| 4 | 5 | 6 |'],
        [' --- --- --- '], ['| 7 | 8 | 9 |'],
        [' --- --- --- ']] 

def player():
    x = 0                          # not used
    y = 0                          # not used
    player1 = input("Enter Player1 move : ")
    for i in grid:                 # each i is a list containing 1 string
        for j in i:                # each j is one string
            if j == player1:       # only ever true if playerinput is ' --- --- --- '
                                   # or '| 1 | 2 | 3 |' or '| 4 | 5 | & |' or ....
                grid[1][1] = 'X'   # never hit.

Вы должны разбить свой код на более мелкие и понятные части:

def freeSpace(l,pos):
    """Returns True if l[pos] is inside the list and currently of type int - else False."""
    return (0 <= pos < len(l))  and isinstance(l[pos],int)

def setPlayer(l,player,pos):
    """Checks if l[pos] is valid to be set to a players 'X' or 'O' string. 
    If, set it and return True, else return False."""
    if freeSpace(l,pos):
        l[pos] = player
        return True

    return False

def printList(l):
    """Pretty prints a list of 9 items in a grid with some decor around it."""
    print("\n --- --- --- ")
    for row in (l[i:i + 3] for i in range(0,9,3)):
        print("|",end="")
        for e in row:
            print("{:^3}|".format(e),end="")
        print("\n --- --- --- ")

def no_win(l):
    # TODO - check for win, return False and a win message mayhap
    return True

Основная игра:

# prepare field with integers - its easier to hold your 9 fields in a 1dim list
# and do the "comlicated" stuff in printList
tic_tac_toe = list(range(1,10))

# no players turn
player = ""
ok = True

# until all fields
while any(i in range(1,10) for i in tic_tac_toe) and no_win(tic_tac_toe):
    printList(tic_tac_toe)

    # last turn was ok, switch players (X starts if player = "")
    if ok:
        player = "X" if player != "X" else "O"
        print("Your turn: ", player)
    else: 
        # how hard can it be ...
        print("Wrong move - try again: ", player)

    # you could move this also in a method .. see 
    # https://stackoverflow.com/questions/23294658/asking-the-user-for-input-until
    try:
        k = input("Which position? ")
        k = int(k)-1
        ok = setPlayer(tic_tac_toe, player, k)
    except ValueError:
        ok = False

Выход:

 --- --- ---
| 1 | 2 | 3 |
 --- --- ---
| 4 | 5 | 6 |
 --- --- ---
| 7 | 8 | 9 |
 --- --- ---
Your turn:  X
Which position? Applepie

 --- --- ---
| 1 | 2 | 3 |
 --- --- ---
| 4 | 5 | 6 |
 --- --- ---
| 7 | 8 | 9 |
 --- --- ---
Wrong move - try again:  X
Which position? 99

 --- --- ---
| 1 | 2 | 3 |
 --- --- ---
| 4 | 5 | 6 |
 --- --- ---
| 7 | 8 | 9 |
 --- --- ---
Wrong move - try again:  X
Which position? 1

 --- --- ---
| X | 2 | 3 |
 --- --- ---
| 4 | 5 | 6 |
 --- --- ---
| 7 | 8 | 9 |
 --- --- ---
Your turn:  O
Which position? 1

 --- --- ---
| X | 2 | 3 |
 --- --- ---
| 4 | 5 | 6 |
 --- --- ---
| 7 | 8 | 9 |
 --- --- ---
Wrong move - try again:  O
Which position? 5

 --- --- ---
| X | 2 | 3 |
 --- --- ---
| 4 | O | 6 |
 --- --- ---
| 7 | 8 | 9 |
 --- --- ---
Your turn:  X
Which position?  # etc.
0 голосов
/ 07 ноября 2018

В следующий раз я увидел, что вы все равно сравниваете строку со строками, поэтому проблема в том, что ваша переменная j никогда не принимала все числовые значения в вашей сетке (то есть 1, 2, 3 и т. Д.) ). Лучшим подходом было бы определить свою сетку по-другому и изменить способ ее печати. ​​

Сначала вы определяете шаблон, который хотите напечатать, в начале и в конце вашей сетки. Затем вы перебираете строки своей сетки и создаете строку для печати:

startEnd = ' --- --- --- '
grid2 = [['1', '2', '3'],['4', '5', '6'],['7', '8', '9']]

def board():
    print (startEnd)
    for row in grid2:
        s = '| {0} | {1} | {2} |'.format(row[0], row[1], row[2])
        print(s)        
    print (startEnd)

def player():
    x = 0
    y = 0
    player1 = raw_input("Enter Player1 move : ")
    for i in grid2:
        for j in i:
            if j == player1:
                grid2[1][1] = 'X'
    board()

player()

Вывод:

 --- --- ---
| 1 | 2 | 3 |
| 4 | X | 6 |
| 7 | 8 | 9 |
 --- --- ---
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...