>source

이것은 8 x 8 배열입니다. 문제는 player_2_move 변수를 사용자가 입력 한 행과 열로 설정할 때 해당 변수의 값이 우리가 얻은 두 입력으로 이동하려고 할 때 0으로 유지된다는 것입니다. 그리고 거기에서 나는 선수 2가 움직이는 값을 변경하는 방법을 모릅니다. 이것은 승리하는 움직임을 확인하는 기능이 체크되었을 때만 발생합니다. 두 입력은 가장 혼란스러운 드롭 피스 함수를 호출 할 때 작동합니다. 또한 나는 여전히 숫자가 1과 2 인 배열로 초안을 작성하고 있습니다. 제가 만들고있는 게임은 오델로입니다.

import pygame, sys
import math
pygame.init()
ROW_COUNT = 8
COLUMN_COUNT = 8
PLAYER_COUNT = 2
RED = (255, 0, 0)
BEIGE = (255, 200, 0)
BLACK = (0, 0, 0)
WHITE = (255, 255, 255)
SQUARESIZE = 100
width = COLUMN_COUNT * SQUARESIZE
height = ROW_COUNT * SQUARESIZE
size = (width, height)
screen = pygame.display.set_mode(size)
screen.fill(RED)
# Vertical
one_x_1 = 100
one_y_1 = 0
one_end_x = 100
one_end_y = 800
# Horizontal
two_x_1 = 0
two_y_1 = 100
two_end_x = 800
two_end_y = 100
RADIUS = int(SQUARESIZE/2 - 5)
def draw_board(board):
    global one_x_1, one_y_1, one_end_x, one_end_y, two_x_1, two_y_1, two_end_x, two_end_y
    for c in range(COLUMN_COUNT):
        for r in range(ROW_COUNT):
            pygame.draw.line(screen, BLACK, (one_x_1, one_y_1), (one_end_x, one_end_y), 3)
            one_x_1 += 100
            one_end_x += 100
        pygame.draw.line(screen, BLACK, (two_x_1, two_y_1), (two_end_x, two_end_y), 3)
        two_y_1 += 100
        two_end_y += 100
    for c in range(COLUMN_COUNT):
        for r in range(ROW_COUNT):
            if board[r][c] == 1:
                pygame.draw.circle(screen, WHITE, (int(c*SQUARESIZE+SQUARESIZE/2), height - int(r*SQUARESIZE + SQUARESIZE/2)), RADIUS)
            elif board[r][c] == 2:
                pygame.draw.circle(screen, BLACK, (int(c*SQUARESIZE+SQUARESIZE/2), height - int(r*SQUARESIZE + SQUARESIZE/2)), RADIUS)
    pygame.display.update()
class Player(object):
    def __init__(self, number):
        self.remaining_pieces = 32
        self.number = number
board = np.zeros((ROW_COUNT, COLUMN_COUNT), dtype=np.uint8)
board[3][3] = 1
board[4][4] = 1
board[3][4] = 2
board[4][3] = 2
print(board)
draw_board(board)
pygame.display.update()
players = [Player(i) for i in range(1, PLAYER_COUNT + 1)]
print(len(players))
game_over = False
while not game_over:
    # Event loop
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            sys.exit()
        for p in players:
            if event.type == pygame.MOUSEBUTTONDOWN:
                posx = event.pos[0]
                posy = event.pos[1]
                column = int(math.floor(posx/SQUARESIZE))
                row = int(math.floor(posy/SQUARESIZE))
                if board[row][column] == 0:
                    board[row][column] = p.number
                    p.remaining_pieces = p.remaining_pieces - 1
                    # The eight directions in which we will go
                    directions = [(-1, -1), (-1, 0), (-1, 1), (1, 1), (1, 0), (1, -1), (0, 1), (0, -1)]
                    for d in directions:
                        x = row
                        y = column
                        while True:
                            x = x + d[0]  # Assign x to the first value in the tuple
                            y = y + d[1]  # Assign y to the second value in the tuple
                            # check if we are still on the board
                            if (x in range(8)) and (y in range(8)):
                                print(f'checking y = {x + 1}, x = {y + 1}')
                                # if the file is empty there are no pieces to capture
                                if board[x][y] == 0:
                                        break
                                """
                                If we find a number around our move we run the same procedure for it and change it 
                                if we have to
                                """
                                if p.number == board[x][y]:  # Here p.number is the players move we find it on the board
                                    print(f'found {p.number}: y = {x + 1}, x = {y + 1}')
                                    i = row
                                    j = column
                                    while i != x or j != y:
                                        i = i + d[0]
                                        j = j + d[1]
                                        print(f'changed : y = {i + 1}, x = {j + 1} to {p.number}')
                                        board[i][j] = p.number
                            else:
                                # We are outside the board
                                break
                draw_board(board)
                print(board)```

  • 답변 # 1

    귀하의 프로그램을 단계별로 진행하여 개선하겠습니다. 먼저 다음과 같은 배열을 만듭니다.

    player1 = [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
    player2 = [2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2]
    
    

    항상 나쁜 습관입니다. 프로젝트에서 이미 numpy를 사용하고 있으므로 다음과 같이 쉽게 만들 수 있습니다.

    player1 = np.ones(32, dtype=np.uint8)
    player2 = np.full(32, 2, dtype=np.uint8)
    
    

    그러나 어쨌든 그러한 배열이 실제로 필요하지는 않습니다. 나머지 조각을 추적하는 정수만 가질 수 있습니다. reamining_pieces = 32 전체적으로 더 쉽게 생각할 수 있도록 플레이어 번호와 나머지 조각을 포함하는 Player 클래스를 만들었습니다.

    class Player(object):
        def __init__(self, number):
            self.remaining_pieces = 32
            self.number = number
    
    

    이제 그 후에는 실제로 필요하지 않은 많은 기능이 있습니다. 함수를 작성하는 이점이 없을 정도로 간단합니다. 예를 들어 쓰는 대신

    def create_board():
        board = np.zeros((ROW_COUNT, COLUMN_COUNT))
        return board
    board = create_board()
    
    

    쓰기 만하면 훨씬 더 간단하고 읽기 쉽습니다.

    board = np.zeros((ROW_COUNT, COLUMN_COUNT))
    
    

    같은 경우 def drop_piece(board, row, col, piece)def is_valid_location(board, row, col) 둘 다 불필요한 복잡성을 추가합니다.

    단계별 설명

    먼저 모든 방향의 튜플로 시작합니다.

    directions = [(-1, -1), (-1, 0), (-1, 1), (1, 1), (1, 0), (1, -1), (0, 1), (0, -1)]
    
    

    이제 우리는 모든 방향으로 가고 싶습니다. row, column 새로 배치 된 조각이있는 곳입니다.

    for d in directions:
        x = row
        y = column
    
    

    그리고 우리가 얼마나 멀리 가야하는지 모르기 때문에 우리는 while 루프를 사용하고 방향으로 첫 걸음을 내딛습니다. 우리는 이사회 밖으로 나가고 싶지 않기 때문에 우리가 아직 이사회에 있는지 즉시 확인합니다. 그렇다면 계속할 수 있습니다.

    while True:
        x = x + d[0]
        y = y + d[1]
        # check if we are still on the board
        if (x in range(8)) and (y in range(8)):
    
    

    다음 단계에서는 이것을 예로 사용하겠습니다.

    [[0 0 0 0 0 0 0 0]
     [0 0 0 0 0 0 0 0]
     [0 0 0 0 0 0 0 0]
     [0 0 0 1 2 0 0 0]
     [0 0 * 2 1 0 0 0]
     [0 0 0 0 0 0 0 0]
     [0 0 0 0 0 0 0 0]
     [0 0 0 0 0 0 0 0]]
    
    

    별은 방금 하나 놓인 곳입니다. 왼쪽으로 한 걸음 더 가면 0을 만나고 더 이상 갈 필요가 없다는 것을 알 수 있습니다. 그게 뭐야

    if board[x][y] == 0:
        break
    
    

    그렇습니다.
    이제 오른쪽으로 가면. 우리는 먼저 두 가지를 만나고 무시되고 오른쪽으로 한 단계 더 나아갑니다. 여기서 우리는 마침내 하나를 찾습니다. 그래서 우리는 row, columnx, y 모든 숫자는 1로 변환 될 수 있습니다. 이를 위해 우리는 row, column 그리고 우리가 도달 할 때까지 다시 한 번 움직입니다 x, y . 도중에 모든 숫자를 1로 변환합니다.

    if p.number == board[x][y]:
        print(f'found {p.number}: x = {x + 1}, y = {y + 1}')
        i = row
        j = column
        while i != x or j != y:
            i = i + d[0]
            j = j + d[1]
            print(f'changed : x = {i + 1}, y = {j + 1} to {p.number}')
            board[i][j] = p.number
    
    

    전체 코드

    import numpy as np
    ROW_COUNT = 8
    COLUMN_COUNT = 8
    PLAYER_COUNT = 2
    
    class Player(object):
        def __init__(self, number):
            self.remaining_pieces = 32
            self.number = number
    
    board = np.zeros((ROW_COUNT, COLUMN_COUNT), dtype=np.uint8)
    board[3][3] = 1
    board[4][4] = 1
    board[3][4] = 2
    board[4][3] = 2
    print(board)
    players = [Player(i) for i in range(1, PLAYER_COUNT + 1)]
    game_over = False
    while not game_over:
        for p in players:
            if p.remaining_pieces == 0:
                print("No more Pieces!")
                break
            column = -1
            row = -1
            while column not in range(8):
                column = int(input(f"Player {p.number} please enter a x coordinate from 1 - 8: ")) - 1
            while row not in range(8):
                row = int(input(f"Player {p.number} please enter a y coordinate from 1 - 8: ")) - 1
            if board[row][column] == 0:
                board[row][column] = p.number
                p.remaining_pieces = p.remaining_pieces - 1
                # The eight directions in which we will go
                directions = [(-1, -1), (-1, 0), (-1, 1), (1, 1), (1, 0), (1, -1), (0, 1), (0, -1)]
                
                for d in directions:
                    x = row
                    y = column
                    while True:
                        x = x + d[0]
                        y = y + d[1]
                        
                        # check if we are still on the board
                        if (x in range(8)) and (y in range(8)):
                            print(f'checking x = {x + 1}, y = {y + 1}')
                            # if the file is empty there are no pieces to capture
                            if board[x][y] == 0:
                                break
                            """
                            If it's the stone of the active player we can convert every stone
                            between x, y and  column, row
                            To do that we start once again at column, row and 
                            on our way to x, y we convert every stone to p.number
                            """
                            if p.number == board[x][y]:
                                print(f'found {p.number}: x = {x + 1}, y = {y + 1}')
                                i = row
                                j = column
                                while i != x or j != y:
                                    i = i + d[0]
                                    j = j + d[1]
                                    print(f'changed : x = {i + 1}, y = {j + 1} to {p.number}')
                                    board[i][j] = p.number
                        else:
                            # We are outside the board        
                            break
            print(board)
    
    

관련 자료

  • 이전 c4 - maingo 패키지를 찾을 수 없습니다
  • 다음 python - 'options'예외라는 모듈이 없습니다