【アプリ開発】オセロ作ってみた【ど素人】

アプリ開発

オセロゲームできました

今回もChatGPTに頼んで5分で作って貰いました(笑)

Pythonがまったくわからないのでこのまま続けても進歩できなさそうですが…

とにかく、コードを公開します!

コード公開

# オセロ(リバーシ)二人用・ターミナル版

BOARD_SIZE = 8
EMPTY, BLACK, WHITE = '.', '●', '○'

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

def create_board():
    board = [[EMPTY for _ in range(BOARD_SIZE)] for _ in range(BOARD_SIZE)]
    mid = BOARD_SIZE // 2
    board[mid - 1][mid - 1], board[mid][mid] = WHITE, WHITE
    board[mid - 1][mid], board[mid][mid - 1] = BLACK, BLACK
    return board

def print_board(board):
    print("  " + " ".join(map(str, range(BOARD_SIZE))))
    for i, row in enumerate(board):
        print(i, " ".join(row))

def on_board(x, y):
    return 0 <= x < BOARD_SIZE and 0 <= y < BOARD_SIZE

def valid_moves(board, player):
    opponent = WHITE if player == BLACK else BLACK
    moves = []
    for x in range(BOARD_SIZE):
        for y in range(BOARD_SIZE):
            if board[x][y] != EMPTY:
                continue
            for dx, dy in DIRECTIONS:
                nx, ny = x + dx, y + dy
                flipped = False
                while on_board(nx, ny) and board[nx][ny] == opponent:
                    nx += dx
                    ny += dy
                    flipped = True
                if flipped and on_board(nx, ny) and board[nx][ny] == player:
                    moves.append((x, y))
                    break
    return moves

def make_move(board, x, y, player):
    opponent = WHITE if player == BLACK else BLACK
    board[x][y] = player
    for dx, dy in DIRECTIONS:
        nx, ny = x + dx, y + dy
        line = []
        while on_board(nx, ny) and board[nx][ny] == opponent:
            line.append((nx, ny))
            nx += dx
            ny += dy
        if on_board(nx, ny) and board[nx][ny] == player:
            for px, py in line:
                board[px][py] = player

def count_discs(board):
    black = sum(row.count(BLACK) for row in board)
    white = sum(row.count(WHITE) for row in board)
    return black, white

def main():
    board = create_board()
    player = BLACK

    while True:
        print_board(board)
        moves = valid_moves(board, player)
        if not moves:
            print(f"{player} は打てる場所がありません。パスします。")
            player = WHITE if player == BLACK else BLACK
            if not valid_moves(board, player):
                print("どちらも打てる手がありません。ゲーム終了。")
                break
            continue

        print(f"{player} の番です。")
        print("可能な手:", moves)

        try:
            x, y = map(int, input("行 列 を入力(例: 2 3): ").split())
            if (x, y) not in moves:
                print("その位置には打てません。")
                continue
        except:
            print("入力エラー。例: 2 3 のように入力してください。")
            continue

        make_move(board, x, y, player)
        player = WHITE if player == BLACK else BLACK

    b, w = count_discs(board)
    print_board(board)
    print(f"●: {b}, ○: {w}")
    if b > w:
        print("●(黒)の勝ち!")
    elif w > b:
        print("○(白)の勝ち!")
    else:
        print("引き分け!")

if __name__ == "__main__":
    main()

今後の展開

さすがにPythonのプログラミングを勉強します!!

コメント

タイトルとURLをコピーしました