私の能登半島大震災が発生する直前の今年の目標が「プログラミングを習得する」でした。
ガハハハハ。。。
やりました!
作りました!
オセロゲーム♪
もちろん市販されているようなものではなく
超初心者が作った初歩中の初歩のものです。
ちなみに、出来上がって、ゲームを動かしたのが下記のような感じです。
Invalid input. Please enter two numbers separated by a space.
0 1 2 3 4 5 6 7
0
1
2
3 W B
4 B W
5
6
7
Current player: Black
Enter row and column (e.g. '3 4'): 3 2
0 1 2 3 4 5 6 7
0
1
2
3 B B B
4 B W
5
6
7
Current player: White
Enter row and column (e.g. '3 4'):
0 1 2 3 4 5 6 7
0
1
2
3 W B
4 B W
5
6
7
Current player: Black
Enter row and column (e.g. '3 4'): 3 2
0 1 2 3 4 5 6 7
0
1
2
3 B B B
4 B W
5
6
7
Current player: White
Enter row and column (e.g. '3 4'):
上記のプログラムを動かすためのコードが下記のプログラムです。
class Othello:
def __init__(self):
self.board = [[' ' for _ in range(8)] for _ in range(8)]
self.board[3][3] = self.board[4][4] = 'W'
self.board[3][4] = self.board[4][3] = 'B'
self.current_player = 'B'
def print_board(self):
print(' 0 1 2 3 4 5 6 7')
for i, row in enumerate(self.board):
print(i, ' '.join(row))
def is_valid_move(self, row, col):
if self.board[row][col] != ' ':
return False
for dr in [-1, 0, 1]:
for dc in [-1, 0, 1]:
if dr == 0 and dc == 0:
continue
if self.would_flip(row, col, dr, dc):
return True
return False
def would_flip(self, row, col, dr, dc):
r, c = row + dr, col + dc
if not (0 <= r < 8 and 0 <= c < 8) or self.board[r][c] == self.current_player:
return False
while 0 <= r < 8 and 0 <= c < 8 and self.board[r][c] != ' ':
if self.board[r][c] == self.current_player:
return True
r, c = r + dr, c + dc
return False
def make_move(self, row, col):
if not self.is_valid_move(row, col):
return False
self.board[row][col] = self.current_player
for dr in [-1, 0, 1]:
for dc in [-1, 0, 1]:
if dr == 0 and dc == 0:
continue
self.flip(row, col, dr, dc)
self.current_player = 'W' if self.current_player == 'B' else 'B'
return True
def flip(self, row, col, dr, dc):
if not self.would_flip(row, col, dr, dc):
return
r, c = row + dr, col + dc
while self.board[r][c] != self.current_player:
self.board[r][c] = self.current_player
r, c = r + dr, c + dc
def has_valid_move(self):
for row in range(8):
for col in range(8):
if self.is_valid_move(row, col):
return True
return False
def play(self):
while True:
self.print_board()
if not self.has_valid_move():
self.current_player = 'W' if self.current_player == 'B' else 'B'
if not self.has_valid_move():
break
print(f"No valid moves for {('Black' if self.current_player == 'B' else 'White')}. Skipping turn.")
continue
print(f"Current player: {('Black' if self.current_player == 'B' else 'White')}")
try:
row, col = map(int, input("Enter row and column (e.g. '3 4'): ").split())
if self.make_move(row, col):
pass
else:
print("Invalid move. Try again.")
except ValueError:
print("Invalid input. Please enter two numbers separated by a space.")
self.print_board()
black_count = sum(row.count('B') for row in self.board)
white_count = sum(row.count('W') for row in self.board)
print(f"Game over! Black: {black_count}, White: {white_count}")
if black_count > white_count:
print("Black wins!")
elif white_count > black_count:
print("White wins!")
else:
print("It's a tie!")
if __name__ == "__main__":
game = Othello()
game.play()
やった!
def __init__(self):
self.board = [[' ' for _ in range(8)] for _ in range(8)]
self.board[3][3] = self.board[4][4] = 'W'
self.board[3][4] = self.board[4][3] = 'B'
self.current_player = 'B'
def print_board(self):
print(' 0 1 2 3 4 5 6 7')
for i, row in enumerate(self.board):
print(i, ' '.join(row))
def is_valid_move(self, row, col):
if self.board[row][col] != ' ':
return False
for dr in [-1, 0, 1]:
for dc in [-1, 0, 1]:
if dr == 0 and dc == 0:
continue
if self.would_flip(row, col, dr, dc):
return True
return False
def would_flip(self, row, col, dr, dc):
r, c = row + dr, col + dc
if not (0 <= r < 8 and 0 <= c < 8) or self.board[r][c] == self.current_player:
return False
while 0 <= r < 8 and 0 <= c < 8 and self.board[r][c] != ' ':
if self.board[r][c] == self.current_player:
return True
r, c = r + dr, c + dc
return False
def make_move(self, row, col):
if not self.is_valid_move(row, col):
return False
self.board[row][col] = self.current_player
for dr in [-1, 0, 1]:
for dc in [-1, 0, 1]:
if dr == 0 and dc == 0:
continue
self.flip(row, col, dr, dc)
self.current_player = 'W' if self.current_player == 'B' else 'B'
return True
def flip(self, row, col, dr, dc):
if not self.would_flip(row, col, dr, dc):
return
r, c = row + dr, col + dc
while self.board[r][c] != self.current_player:
self.board[r][c] = self.current_player
r, c = r + dr, c + dc
def has_valid_move(self):
for row in range(8):
for col in range(8):
if self.is_valid_move(row, col):
return True
return False
def play(self):
while True:
self.print_board()
if not self.has_valid_move():
self.current_player = 'W' if self.current_player == 'B' else 'B'
if not self.has_valid_move():
break
print(f"No valid moves for {('Black' if self.current_player == 'B' else 'White')}. Skipping turn.")
continue
print(f"Current player: {('Black' if self.current_player == 'B' else 'White')}")
try:
row, col = map(int, input("Enter row and column (e.g. '3 4'): ").split())
if self.make_move(row, col):
pass
else:
print("Invalid move. Try again.")
except ValueError:
print("Invalid input. Please enter two numbers separated by a space.")
self.print_board()
black_count = sum(row.count('B') for row in self.board)
white_count = sum(row.count('W') for row in self.board)
print(f"Game over! Black: {black_count}, White: {white_count}")
if black_count > white_count:
print("Black wins!")
elif white_count > black_count:
print("White wins!")
else:
print("It's a tie!")
if __name__ == "__main__":
game = Othello()
game.play()
やった!
プログラマーになれるかも♪←なれんなれん!
今回のオセロゲームは
プログラム言語にPython
製作支援(いや、メイン?)にChatGPT
プログラム作成は、Claudeです。
ちなみに、私が出したプロンプトは
Claudeに「オセロゲームを作って下さい」
ChatGPTに「Pythonの使い方を教えて」
「修正が有ったら直してください」
「ゲームが動かないので原因を探し、解決策を教えてください」
「遊び方を教えてください」とわがまま放題を言って
オセロゲームが無事動きました。
初歩中の初歩のプログラミングですが
まったくコードも何もわからないですが
自分で作った(正確にはClaudeに作って貰った)初のプログラミングということで
今年の抱負のひとつはクリアしたということにしましょうヽ(^。^)ノ