Home > Software engineering >  Isuue with moves validation in the Go CLI game
Isuue with moves validation in the Go CLI game

Time:10-24

I decided to write a go board game in Python, just for fun, without UI, just CLI :) I want to check if current intersection on the board is empty or not to restrict player putting his stones there. The intersection is represented as ' * ', black is '0', white is '1'. If black is to move, and current intersection is empty ('*'), change it to '0'. Otherwise ask black to move again. The same for the white (Captures count, score etc will be implemented later). Here is the full code:

class GoGame:
board: list
_PLAYER_BLACK = " 0 "
_PLAYER_WHITE = " 1 "
_black_move_done = False
_white_move_done = False

def __init__(self, board):
    self.board = board

def display_board(self, board):
    for i in range(len(self.board)):
        for j in range(len(self.board)):
            print(board[i][j], end='')
        print()

def black_move(self):
    i, j = input("Black to move: ").split()
    self.board[int(i)][int(j)] = self._PLAYER_BLACK
    self.display_board(self.board)
    self._black_move_done = True

def white_move(self):
    i, j = input("White to move: ").split()
    self.board[int(i)][int(j)] = self._PLAYER_WHITE
    self.display_board(self.board)
    self._white_move_done = True

def play(self):
    while True:
        for i in range(len(self.board)):
            for j in range(len(self.board)):
                if not self._black_move_done and self.board == ' * ':
                    self.black_move()
                    self._black_move_done = False
                self.white_move()
                self._white_move_done = False


board = [
    [
        ' * ', ' * ', ' * ',
        ' * ', ' * ', ' * ',
        ' * ', ' * ', ' * ',
        ' * ', ' * ', ' * ',
        ' * ', ' * ', ' * ',
        ' * ', ' * ', ' * ',
        ' * '
    ],
    [
        ' * ', ' * ', ' * ',
        ' * ', ' * ', ' * ',
        ' * ', ' * ', ' * ',
        ' * ', ' * ', ' * ',
        ' * ', ' * ', ' * ',
        ' * ', ' * ', ' * ',
        ' * '
    ],
    [
        ' * ', ' * ', ' * ',
        ' * ', ' * ', ' * ',
        ' * ', ' * ', ' * ',
        ' * ', ' * ', ' * ',
        ' * ', ' * ', ' * ',
        ' * ', ' * ', ' * ',
        ' * '
    ],
    [
        ' * ', ' * ', ' * ',
        ' * ', ' * ', ' * ',
        ' * ', ' * ', ' * ',
        ' * ', ' * ', ' * ',
        ' * ', ' * ', ' * ',
        ' * ', ' * ', ' * ',
        ' * '
    ],
    [
        ' * ', ' * ', ' * ',
        ' * ', ' * ', ' * ',
        ' * ', ' * ', ' * ',
        ' * ', ' * ', ' * ',
        ' * ', ' * ', ' * ',
        ' * ', ' * ', ' * ',
        ' * '
    ],
    [
        ' * ', ' * ', ' * ',
        ' * ', ' * ', ' * ',
        ' * ', ' * ', ' * ',
        ' * ', ' * ', ' * ',
        ' * ', ' * ', ' * ',
        ' * ', ' * ', ' * ',
        ' * '
    ],
    [
        ' * ', ' * ', ' * ',
        ' * ', ' * ', ' * ',
        ' * ', ' * ', ' * ',
        ' * ', ' * ', ' * ',
        ' * ', ' * ', ' * ',
        ' * ', ' * ', ' * ',
        ' * '
    ],
    [
        ' * ', ' * ', ' * ',
        ' * ', ' * ', ' * ',
        ' * ', ' * ', ' * ',
        ' * ', ' * ', ' * ',
        ' * ', ' * ', ' * ',
        ' * ', ' * ', ' * ',
        ' * '
    ],
    [
        ' * ', ' * ', ' * ',
        ' * ', ' * ', ' * ',
        ' * ', ' * ', ' * ',
        ' * ', ' * ', ' * ',
        ' * ', ' * ', ' * ',
        ' * ', ' * ', ' * ',
        ' * '
    ],
[
    ' * ', ' * ', ' * ',
    ' * ', ' * ', ' * ',
    ' * ', ' * ', ' * ',
    ' * ', ' * ', ' * ',
    ' * ', ' * ', ' * ',
    ' * ', ' * ', ' * ',
    ' * '
],
[
    ' * ', ' * ', ' * ',
    ' * ', ' * ', ' * ',
    ' * ', ' * ', ' * ',
    ' * ', ' * ', ' * ',
    ' * ', ' * ', ' * ',
    ' * ', ' * ', ' * ',
    ' * '
],
[
    ' * ', ' * ', ' * ',
    ' * ', ' * ', ' * ',
    ' * ', ' * ', ' * ',
    ' * ', ' * ', ' * ',
    ' * ', ' * ', ' * ',
    ' * ', ' * ', ' * ',
    ' * '
],
[
    ' * ', ' * ', ' * ',
    ' * ', ' * ', ' * ',
    ' * ', ' * ', ' * ',
    ' * ', ' * ', ' * ',
    ' * ', ' * ', ' * ',
    ' * ', ' * ', ' * ',
    ' * '
],
[
    ' * ', ' * ', ' * ',
    ' * ', ' * ', ' * ',
    ' * ', ' * ', ' * ',
    ' * ', ' * ', ' * ',
    ' * ', ' * ', ' * ',
    ' * ', ' * ', ' * ',
    ' * '
],
[
    ' * ', ' * ', ' * ',
    ' * ', ' * ', ' * ',
    ' * ', ' * ', ' * ',
    ' * ', ' * ', ' * ',
    ' * ', ' * ', ' * ',
    ' * ', ' * ', ' * ',
    ' * '
],
[
    ' * ', ' * ', ' * ',
    ' * ', ' * ', ' * ',
    ' * ', ' * ', ' * ',
    ' * ', ' * ', ' * ',
    ' * ', ' * ', ' * ',
    ' * ', ' * ', ' * ',
    ' * '
],
[
    ' * ', ' * ', ' * ',
    ' * ', ' * ', ' * ',
    ' * ', ' * ', ' * ',
    ' * ', ' * ', ' * ',
    ' * ', ' * ', ' * ',
    ' * ', ' * ', ' * ',
    ' * '
],
[
    ' * ', ' * ', ' * ',
    ' * ', ' * ', ' * ',
    ' * ', ' * ', ' * ',
    ' * ', ' * ', ' * ',
    ' * ', ' * ', ' * ',
    ' * ', ' * ', ' * ',
    ' * '
],
[
    ' * ', ' * ', ' * ',
    ' * ', ' * ', ' * ',
    ' * ', ' * ', ' * ',
    ' * ', ' * ', ' * ',
    ' * ', ' * ', ' * ',
    ' * ', ' * ', ' * ',
    ' * '
]
]

go = GoGame(board)
go.display_board(sim.board)
go.play()

But what I get is the game infinitely asking white to move:

*  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  * 
*  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  * 
*  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  * 
*  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  * 
*  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  * 
*  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  * 
*  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  * 
*  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  * 
*  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  * 
*  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  * 
*  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  * 
*  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  * 
*  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  * 
*  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  * 
*  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  * 
*  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  * 
*  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  * 
*  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  * 
*  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  * 
White to move: 0 0

 1  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  * 
*  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  * 
*  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  * 
*  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  * 
*  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  * 
*  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  * 
*  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  * 
*  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  * 
*  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  * 
*  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  * 
*  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  * 
*  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  * 
*  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  * 
*  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  * 
*  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  * 
*  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  * 
*  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  * 
*  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  * 
*  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  * 
White to move:

What am I doing wrong?

CodePudding user response:

the problem is the board, which is a list, will never be equal to a 3-character string ' * '. hence the if statement never gets executed, and it's white's turn for each element in your board. perhaps you should check whether the entered intersection is legal in the white/black _move function like this:

print("white/black to move: ", end = '')
while True:
    i, j = [int(x) for x in input().split()]
    if board[i][j] != the empty character:
        print("intersection is occupied. please try again: ", end = '')
    else:
        board[i][j] = white/black character
        break
  • Related