ChatGPT与我们玩游戏_五子棋
作者:顾翔import tkinter as tk
from tkinter import messagebox
class Gomoku:
def __init__(self, master):
self.master = master
self.master.title("五子棋")
self.size = 15
self.board = [['' for _ in range(self.size)] for _ in range(self.size)]
self.current_player = 'X'
self.buttons = [[None for _ in range(self.size)] for _ in range(self.size)]
self.create_board()
def create_board(self):
for row in range(self.size):
for col in range(self.size):
button = tk.Button(self.master, text='', width=4, height=2,
command=lambda r=row, c=col: self.make_move(r, c))
button.grid(row=row, column=col)
self.buttons[row][col] = button
def make_move(self, row, col):
if self.board[row][col] == '':
self.board[row][col] = self.current_player
self.buttons[row][col].config(text=self.current_player)
if self.check_winner(row, col):
messagebox.showinfo("游戏结束", f"玩家 {self.current_player} 胜利!")
self.reset_game()
else:
self.current_player = 'O' if self.current_player == 'X' else 'X'
def check_winner(self, row, col):
# 检查是否有五子连珠
return (self.check_direction(row, col, 1, 0) or # 水平
self.check_direction(row, col, 0, 1) or # 垂直
self.check_direction(row, col, 1, 1) or # 右下对角线
self.check_direction(row, col, 1, -1)) # 左下对角线
def check_direction(self, row, col, delta_row, delta_col):
count = 1
count += self.count_in_direction(row, col, delta_row, delta_col)
count += self.count_in_direction(row, col, -delta_row, -delta_col)
print(count)
return count >= 5 # 检查是否有五个相同的棋子连成一线
def count_in_direction(self, row, col, delta_row, delta_col):
count = 0
while 0 <= row < self.size and 0 <= col < self.size and self.board[row][col] == self.current_player:
count += 1
row += delta_row
col += delta_col
return count
def reset_game(self):
self.board = [['' for _ in range(self.size)] for _ in range(self.size)]
self.current_player = 'X'
for row in range(self.size):
for col in range(self.size):
self.buttons[row][col].config(text='')
if __name__ == "__main__":
root = tk.Tk()
game = Gomoku(root)
root.mainloop()
return count >= 5
return count >= 7
import tkinter as tk
from tkinter import messagebox
import random
class Gomoku:
def __init__(self, master):
self.master = master
self.master.title("五子棋")
self.size = 15
self.board = [['' for _ in range(self.size)] for _ in range(self.size)]
self.current_player = 'X' # 玩家为 X,AI 为 O
self.buttons = [[None for _ in range(self.size)] for _ in range(self.size)]
self.create_board()
def create_board(self):
for row in range(self.size):
for col in range(self.size):
button = tk.Button(self.master, text='', width=4, height=2,
command=lambda r=row, c=col: self.make_move(r, c))
button.grid(row=row, column=col)
self.buttons[row][col] = button
def make_move(self, row, col):
if self.board[row][col] == '' and self.current_player == 'X': # 只有玩家能下棋
self.board[row][col] = self.current_player
self.buttons[row][col].config(text=self.current_player)
if self.check_winner(row, col):
messagebox.showinfo("游戏结束", f"玩家 {self.current_player} 胜利!")
self.reset_game()
else:
self.current_player = 'O'
self.ai_move() # AI轮到下棋
def ai_move(self):
row, col = self.random_move() # AI随机选择一个空位
self.board[row][col] = self.current_player
self.buttons[row][col].config(text=self.current_player)
if self.check_winner(row, col):
messagebox.showinfo("游戏结束", "AI 胜利!")
self.reset_game()
else:
self.current_player = 'X' # 玩家轮到下棋
def random_move(self):
while True:
row = random.randint(0, self.size - 1)
col = random.randint(0, self.size - 1)
if self.board[row][col] == '':
return row, col
def check_winner(self, row, col):
# 检查是否有五子连珠
return (self.check_direction(row, col, 1, 0) or # 水平
self.check_direction(row, col, 0, 1) or # 垂直
self.check_direction(row, col, 1, 1) or # 右下对角线
self.check_direction(row, col, 1, -1)) # 左下对角线
def check_direction(self, row, col, delta_row, delta_col):
count = 1
count += self.count_in_direction(row, col, delta_row, delta_col)
count += self.count_in_direction(row, col, -delta_row, -delta_col)
return count >= 5 # 检查是否有五个相同的棋子连成一线
def count_in_direction(self, row, col, delta_row, delta_col):
count = 0
while 0 <= row < self.size and 0 <= col < self.size and self.board[row][col] == self.current_player:
count += 1
row += delta_row
col += delta_col
return count
def reset_game(self):
self.board = [['' for _ in range(self.size)] for _ in range(self.size)]
self.current_player = 'X'
for row in range(self.size):
for col in range(self.size):
self.buttons[row][col].config(text='')
if __name__ == "__main__":
root = tk.Tk()
game = Gomoku(root)
root.mainloop()
return count >= 5
return count >= 7
import tkinter as tk
from tkinter import messagebox
import random
class Gomoku:
def __init__(self, master):
self.master = master
self.master.title("五子棋")
self.size = 15
self.board = [['' for _ in range(self.size)] for _ in range(self.size)]
self.current_player = 'X' # 玩家为 X,AI 为 O
self.buttons = [[None for _ in range(self.size)] for _ in range(self.size)]
self.create_board()
def create_board(self):
for row in range(self.size):
for col in range(self.size):
button = tk.Button(self.master, text='', width=4, height=2,
command=lambda r=row, c=col: self.make_move(r, c))
button.grid(row=row, column=col)
self.buttons[row][col] = button
def make_move(self, row, col):
if self.board[row][col] == '' and self.current_player == 'X': # 只有玩家能下棋
self.board[row][col] = self.current_player
self.buttons[row][col].config(text=self.current_player)
if self.check_winner(row, col):
messagebox.showinfo("游戏结束", f"玩家 {self.current_player} 胜利!")
self.reset_game()
else:
self.current_player = 'O'
self.ai_move() # AI轮到下棋
def ai_move(self):
# AI使用Alpha-Beta剪枝来选择最优棋步
best_score = float('-inf')
best_move = None
for row in range(self.size):
for col in range(self.size):
if self.board[row][col] == '':
self.board[row][col] = 'O'
score = self.alpha_beta(3, float('-inf'), float('inf'), False) # 深度3
self.board[row][col] = ''
if score > best_score:
best_score = score
best_move = (row, col)
if best_move:
row, col = best_move
self.board[row][col] = 'O'
self.buttons[row][col].config(text='O')
if self.check_winner(row, col):
messagebox.showinfo("游戏结束", "AI 胜利!")
self.reset_game()
else:
self.current_player = 'X' # 玩家轮到下棋
def alpha_beta(self, depth, alpha, beta, is_maximizing):
if depth == 0 or self.is_game_over():
return self.evaluate_board()
if is_maximizing:
max_score = float('-inf')
for row in range(self.size):
for col in range(self.size):
if self.board[row][col] == '':
self.board[row][col] = 'O'
score = self.alpha_beta(depth-1, alpha, beta, False)
self.board[row][col] = ''
max_score = max(max_score, score)
alpha = max(alpha, score)
if beta <= alpha:
break
return max_score
else:
min_score = float('inf')
for row in range(self.size):
for col in range(self.size):
if self.board[row][col] == '':
self.board[row][col] = 'X'
score = self.alpha_beta(depth-1, alpha, beta, True)
self.board[row][col] = ''
min_score = min(min_score, score)
beta = min(beta, score)
if beta <= alpha:
break
return min_score
def evaluate_board(self):
# 简单的评估函数,评估当前棋盘的状态
# 返回一个分数,越大代表对AI越有利,越小代表对玩家越有利
score = 0
for row in range(self.size):
for col in range(self.size):
if self.board[row][col] == 'O':
score += self.evaluate_position(row, col)
elif self.board[row][col] == 'X':
score -= self.evaluate_position(row, col)
return score
def evaluate_position(self, row, col):
# 评估某一位置的得分,可以基于棋盘的周围状态进行设计
score = 0
# 这里是一个简单的评分策略,实际中可以根据连子数等进行改进
for delta_row, delta_col in [(1, 0), (0, 1), (1, 1), (1, -1)]:
count = 1
for i in range(1, 5):
new_row, new_col = row + delta_row * i, col + delta_col * i
if 0 <= new_row < self.size and 0 <= new_col < self.size:
if self.board[new_row][new_col] == 'O':
count += 1
elif self.board[new_row][new_col] == 'X':
break
else:
break
score += count
return score
def is_game_over(self):
# 检查游戏是否结束
for row in range(self.size):
for col in range(self.size):
if self.board[row][col] == '' and (self.check_winner(row, col)):
return True
return False
def check_winner(self, row, col):
# 检查是否有五子连珠
return (self.check_direction(row, col, 1, 0) or # 水平
self.check_direction(row, col, 0, 1) or # 垂直
self.check_direction(row, col, 1, 1) or # 右下对角线
self.check_direction(row, col, 1, -1)) # 左下对角线
def check_direction(self, row, col, delta_row, delta_col):
count = 1
count += self.count_in_direction(row, col, delta_row, delta_col)
count += self.count_in_direction(row, col, -delta_row, -delta_col)
return count >= 5 # 检查是否有五个相同的棋子连成一线
def count_in_direction(self, row, col, delta_row, delta_col):
count = 0
while 0 <= row < self.size and 0 <= col < self.size and self.board[row][col] == self.current_player:
count += 1
row += delta_row
col += delta_col
return count
def reset_game(self):
self.board = [['' for _ in range(self.size)] for _ in range(self.size)]
self.current_player = 'X'
for row in range(self.size):
for col in range(self.size):
self.buttons[row][col].config(text='')
if __name__ == "__main__":
root = tk.Tk()
game = Gomoku(root)
root.mainloop()
return count >= 5
return count >= 7
import tkinter as tk
from tkinter import messagebox
import random
class Gomoku:
def __init__(self, master):
self.master = master
self.master.title("五子棋")
self.size = 15
self.board = [['' for _ in range(self.size)] for _ in range(self.size)]
self.current_player = 'X' # 玩家为 X,AI 为 O
self.buttons = [[None for _ in range(self.size)] for _ in range(self.size)]
self.create_board()
def create_board(self):
for row in range(self.size):
for col in range(self.size):
button = tk.Button(self.master, text='', width=4, height=2,
command=lambda r=row, c=col: self.make_move(r, c))
button.grid(row=row, column=col)
self.buttons[row][col] = button
def make_move(self, row, col):
if self.board[row][col] == '' and self.current_player == 'X': # 只有玩家能下棋
self.board[row][col] = self.current_player
self.buttons[row][col].config(text=self.current_player)
if self.check_winner(row, col):
messagebox.showinfo("游戏结束", f"玩家 {self.current_player} 胜利!")
self.reset_game()
else:
self.current_player = 'O'
self.master.after(100, self.ai_move) # 使用after方法异步调用AI
def ai_move(self):
# AI使用Alpha-Beta剪枝来选择最优棋步
best_score = float('-inf')
best_move = None
for row, col in self.get_possible_moves():
self.board[row][col] = 'O'
score = self.alpha_beta(2, float('-inf'), float('inf'), False) # 深度2
self.board[row][col] = ''
if score > best_score:
best_score = score
best_move = (row, col)
if best_move:
row, col = best_move
self.board[row][col] = 'O'
self.buttons[row][col].config(text='O')
if self.check_winner(row, col):
messagebox.showinfo("游戏结束", "AI 胜利!")
self.reset_game()
else:
self.current_player = 'X' # 玩家轮到下棋
def get_possible_moves(self):
# 只考虑靠近已有棋子的空位
possible_moves = []
for row in range(self.size):
for col in range(self.size):
if self.board[row][col] == '':
if any(self.board[r][c] != '' for r in range(max(0, row-1), min(self.size, row+2))
for c in range(max(0, col-1), min(self.size, col+2))):
possible_moves.append((row, col))
return possible_moves
def alpha_beta(self, depth, alpha, beta, is_maximizing):
if depth == 0 or self.is_game_over():
return self.evaluate_board()
if is_maximizing:
max_score = float('-inf')
for row, col in self.get_possible_moves():
self.board[row][col] = 'O'
score = self.alpha_beta(depth-1, alpha, beta, False)
self.board[row][col] = ''
max_score = max(max_score, score)
alpha = max(alpha, score)
if beta <= alpha:
break
return max_score
else:
min_score = float('inf')
for row, col in self.get_possible_moves():
self.board[row][col] = 'X'
score = self.alpha_beta(depth-1, alpha, beta, True)
self.board[row][col] = ''
min_score = min(min_score, score)
beta = min(beta, score)
if beta <= alpha:
break
return min_score
def evaluate_board(self):
# 简单的评估函数,评估当前棋盘的状态
score = 0
for row in range(self.size):
for col in range(self.size):
if self.board[row][col] == 'O':
score += self.evaluate_position(row, col)
elif self.board[row][col] == 'X':
score -= self.evaluate_position(row, col)
return score
def evaluate_position(self, row, col):
# 评估某一位置的得分,可以基于棋盘的周围状态进行设计
score = 0
for delta_row, delta_col in [(1, 0), (0, 1), (1, 1), (1, -1)]:
count = 1
for i in range(1, 5):
new_row, new_col = row + delta_row * i, col + delta_col * i
if 0 <= new_row < self.size and 0 <= new_col < self.size:
if self.board[new_row][new_col] == 'O':
count += 1
elif self.board[new_row][new_col] == 'X':
break
else:
break
score += count
return score
def is_game_over(self):
# 检查游戏是否结束
for row in range(self.size):
for col in range(self.size):
if self.board[row][col] == '' and (self.check_winner(row, col)):
return True
return False
def check_winner(self, row, col):
# 检查是否有五子连珠
return (self.check_direction(row, col, 1, 0) or # 水平
self.check_direction(row, col, 0, 1) or # 垂直
self.check_direction(row, col, 1, 1) or # 右下对角线
self.check_direction(row, col, 1, -1)) # 左下对角线
def check_direction(self, row, col, delta_row, delta_col):
count = 1
count += self.count_in_direction(row, col, delta_row, delta_col)
count += self.count_in_direction(row, col, -delta_row, -delta_col)
return count >= 7 # 检查是否有五个相同的棋子连成一线
def count_in_direction(self, row, col, delta_row, delta_col):
count = 0
while 0 <= row < self.size and 0 <= col < self.size and self.board[row][col] == self.current_player:
count += 1
row += delta_row
col += delta_col
return count
def reset_game(self):
self.board = [['' for _ in range(self.size)] for _ in range(self.size)]
self.current_player = 'X'
for row in range(self.size):
for col in range(self.size):
self.buttons[row][col].config(text='')
if __name__ == "__main__":
root = tk.Tk()
game = Gomoku(root)
root.mainloop()