用python3写一个带界面的围棋游戏然后优化简化代码并写出优化简化前后的代码和改动了哪些地方
下面是一个用Python3编写的简单围棋游戏的示例代码:
import tkinter as tk
class GoGame:
def __init__(self, size):
self.size = size
self.board = [['.' for _ in range(size)] for _ in range(size)]
self.current_player = 'B'
self.root = tk.Tk()
self.canvas = tk.Canvas(self.root, width=500, height=500)
self.canvas.pack()
self.canvas.bind("<Button-1>", self.place_stone)
self.draw_board()
self.root.mainloop()
def draw_board(self):
self.canvas.delete("all")
for i in range(self.size):
self.canvas.create_line(50, 50+i*40, 450, 50+i*40)
self.canvas.create_line(50+i*40, 50, 50+i*40, 450)
for i in range(self.size):
for j in range(self.size):
if self.board[i][j] == 'B':
self.canvas.create_oval(30+j*40, 30+i*40, 70+j*40, 70+i*40, fill="black")
elif self.board[i][j] == 'W':
self.canvas.create_oval(30+j*40, 30+i*40, 70+j*40, 70+i*40, fill="white")
def place_stone(self, event):
x = (event.x - 50) // 40
y = (event.y - 50) // 40
if x >= 0 and x < self.size and y >= 0 and y < self.size and self.board[y][x] == '.':
self.board[y][x] = self.current_player
self.current_player = 'W' if self.current_player == 'B' else 'B'
self.draw_board()
if __name__ == '__main__':
game = GoGame(9)
这是一个使用Tkinter库创建GUI界面的围棋游戏。游戏界面大小为500x500,棋盘大小为9x9。通过点击鼠标左键来落子,黑子表示为'B',白子表示为'W'。
为了优化和简化代码,我们可以将创建棋盘和绘制棋盘的功能提取为一个单独的函数,并使用grid布局管理器来代替pack布局管理器。同时,我们可以使用一个字典来存储棋盘状态,并使用元组(x, y)作为键,而不是使用二维列表。
改进后的代码如下所示:
import tkinter as tk
class GoGame:
def __init__(self, size):
self.size = size
self.board = {}
self.current_player = 'B'
self.root = tk.Tk()
self.canvas = tk.Canvas(self.root, width=500, height=500)
self.canvas.grid(row=0, column=0, padx=10, pady=10)
self.canvas.bind("<Button-1>", self.place_stone)
self.draw_board()
self.root.mainloop()
def draw_board(self):
self.canvas.delete("all")
for i in range(self.size):
self.canvas.create_line(50, 50+i*40, 450, 50+i*40)
self.canvas.create_line(50+i*40, 50, 50+i*40, 450)
for pos, stone in self.board.items():
x, y = pos
fill = "black" if stone == 'B' else "white"
self.canvas.create_oval(30+x*40, 30+y*40, 70+x*40, 70+y*40, fill=fill)
def place_stone(self, event):
x = (event.x - 50) // 40
y = (event.y - 50) // 40
if x >= 0 and x < self.size and y >= 0 and y < self.size and (x, y) not in self.board:
self.board[(x, y)] = self.current_player
self.current_player = 'W' if self.current_player == 'B' else 'B'
self.draw_board()
if __name__ == '__main__':
game = GoGame(9)
在改进的代码中,我们使用字典self.board来存储棋盘状态,键为元组(x, y)表示棋盘上的位置,而值表示当前位置的棋子。在绘制棋盘时,我们遍历字典self.board并根据棋子类型绘制相应的椭圆。
此外,我们使用grid布局管理器将画布放置在网格的第0行、第0列,并设置了一些内边距。这样可以更好地控制界面的布局。
这些改动使代码的可读性更好,同时也提高了代码的扩展性和维护性
原文地址: https://www.cveoy.top/t/topic/h3Xy 著作权归作者所有。请勿转载和采集!