围棋
Python怎么写代码是什么?围棋 作为FishC的计算机教育专家,我来为你解答:如何用Python编写围棋程序的基本思路与核心代码。首先,你需要理解围棋的三大核心逻辑:棋盘、落子规则(气、禁着点、打劫)和胜负判定。
1. 定义棋盘
用二维列表表示,例如19×19的棋盘,每个位置用0表示空,1表示黑子,2表示白子。
SIZE = 19
board = [ for _ in range(SIZE)]
2. 落子与提子
落子前需判断该点是否合法:无子、不是禁着点、不为劫。核心是计算“气”:上下左右四个方向相邻的空点。若落子后棋子群的气为零,则提掉该棋子群。
def get_neighbors(x, y):
dirs = [(0,1),(0,-1),(1,0),(-1,0)]
return [(x+dx, y+dy) for dx,dy in dirs if 0<=x+dx<SIZE and 0<=y+dy<SIZE]
def get_group(x, y, board, color):
# BFS/DFS 找出与(x,y)相连的同色棋子
group = []
visited = set()
stack = [(x,y)]
visited.add((x,y))
while stack:
px, py = stack.pop()
group.append((px,py))
for nx, ny in get_neighbors(px, py):
if board == color and (nx,ny) not in visited:
visited.add((nx,ny))
stack.append((nx,ny))
return group
def get_liberties(x, y, board, color):
group = get_group(x, y, board, color)
libs = set()
for px, py in group:
for nx, ny in get_neighbors(px, py):
if board == 0:
libs.add((nx,ny))
return libs
def place_stone(x, y, color, board):
if board != 0:
return False# 已有子
board = color
# 检查对面颜色是否有气为0的,提掉
opponent = 3 - color
for nx, ny in get_neighbors(x, y):
if board == opponent:
libs = get_liberties(nx, ny, board, opponent)
if len(libs) == 0:
for px, py in get_group(nx, ny, board, opponent):
board = 0
# 检查当前落子自己是否有气为0(自我填塞),若为0则提掉自己(违反规则,回滚)
my_libs = get_liberties(x, y, board, color)
if len(my_libs) == 0:
board = 0
return False
return True
3. 规则检查(禁着点、打劫)
禁着点:落子后自己无气且不产生提子。打劫:需记录上一步落点,若对方提子后形成回收同一形状,则禁下一手再提。
一般实现需要维护一个ko_point变量。
4. 胜负计算(日本规则/中国规则)
常用中国规则:数子法。统计双方在棋盘上的子数+围到的空点。
总结
以上是基础框架。完整围棋程序还需界面(如pygame)和AI,但核心逻辑如上。建议从9×9棋盘开始练习。
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。 FishC 发表于 2026-7-10 20:04
首先,你需要理解围棋的三大核心逻辑:棋盘、落子规则(气、禁着点、打劫)和胜负判定。
1. 定义棋 ...
tkinter 版 过默 发表于 2026-07-10 20:05
FishC 发表于 2026-7-10 20:04
首先,你需要理解围棋 ...
以下是使用 tkinter 实现围棋界面的基础代码,包含棋盘绘制、鼠标落子、提子功能(9×9 小棋盘示例)。代码已简化核心逻辑,方便理解。
import tkinter as tk
# ---------- 围棋核心逻辑 ----------
SIZE = 9# 也可改为 19
def init_board():
return [*SIZE for _ in range(SIZE)]
def get_neighbors(r, c):
dirs = [(-1,0), (1,0), (0,-1), (0,1)]
return [(r+dr, c+dc) for dr, dc in dirs if 0 <= r+dr < SIZE and 0 <= c+dc < SIZE]
def get_group(board, r, c, color):
stack = [(r,c)]
visited = {(r,c)}
group = []
while stack:
cr, cc = stack.pop()
group.append((cr,cc))
for nr, nc in get_neighbors(cr, cc):
if board == color and (nr,nc) not in visited:
visited.add((nr,nc))
stack.append((nr,nc))
return group
def get_liberties(board, group):
libs = set()
for r, c in group:
for nr, nc in get_neighbors(r, c):
if board == 0:
libs.add((nr,nc))
return libs
def place_stone(board, r, c, color):
"""返回 True 表示落子成功"""
if board != 0:
return False
board = color
opponent = 3 - color
# 检查并提掉对方无气棋
for nr, nc in get_neighbors(r, c):
if board == opponent:
group = get_group(board, nr, nc, opponent)
if len(get_liberties(board, group)) == 0:
for gr, gc in group:
board = 0
# 检查自己是否无气(自杀)
my_group = get_group(board, r, c, color)
if len(get_liberties(board, my_group)) == 0:
# 自杀非法,回退
board = 0
return False
return True
# ---------- tkinter 界面 ----------
class GoGame:
def __init__(self):
self.board = init_board()
self.current = 1# 1黑 2白
self.root = tk.Tk()
self.root.title("围棋 tkinter 版")
self.canvas = tk.Canvas(self.root, width=500, height=500, bg="#DEB887")
self.canvas.pack(padx=10, pady=10)
self.canvas.bind("<Button-1>", self.click)
self.draw()
def draw(self):
self.canvas.delete("all")
cell = 500 // (SIZE + 2)
offset = cell
# 画网格线
for i in range(SIZE):
x = offset + i * cell
self.canvas.create_line(offset, x, offset + (SIZE-1)*cell, x)
self.canvas.create_line(x, offset, x, offset + (SIZE-1)*cell)
# 画星位(天元/小目等,此处略)
# 画棋子
radius = cell//2 - 2
for r in range(SIZE):
for c in range(SIZE):
if self.board != 0:
x = offset + c * cell
y = offset + r * cell
color = "black" if self.board == 1 else "white"
outline = "white" if self.board == 1 else "black"
self.canvas.create_oval(x-radius, y-radius, x+radius, y+radius,
fill=color, outline=outline, width=1)
def click(self, event):
cell = 500 // (SIZE + 2)
offset = cell
col = round((event.x - offset) / cell)
row = round((event.y - offset) / cell)
if 0 <= row < SIZE and 0 <= col < SIZE:
if place_stone(self.board, row, col, self.current):
self.current = 3 - self.current
self.draw()
def run(self):
self.root.mainloop()
if __name__ == "__main__":
game = GoGame()
game.run()
**说明**
1. 棋盘使用 SIZE=9 小棋盘,便于测试。
2. 落子逻辑包括 get_group(连通棋块)、get_liberties(气)和提子、自杀判断。
3. 界面用 tkinter Canvas 绘制,鼠标点击时根据坐标换算为棋盘行列,调用 place_stone 后重绘。
4. 未实现打劫规则和胜负计算,但可作为进一步扩展的骨架。
运行此程序即可用鼠标在棋盘上下棋,黑先白后,提子自动完成。
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。 FishC 发表于 2026-7-10 20:05
以下是使用 tkinter 实现围棋界面的基础代码,包含棋盘绘制、鼠标落子、提子功能(9×9 小棋盘示例)。 ...
怎么知道黑子地盘多呢,棋子下完了,什么游戏呢,学几天可以认得真假眼? 过默 发表于 2026-07-10 20:08
FishC 发表于 2026-7-10 20:05
以下是使用 tkinter...
以下是针对你问题的解释:
1. **怎么知道黑子地盘多?**
围棋结束后(即双方都同意不再落子),通常用“数子法”(中国规则)或“数目法”(日本规则)判断胜负。数子法的步骤:
- 清理棋盘中的死子(被包围且无法做活的棋)。
- 将棋盘上所有空点分配给相邻的棋子(即“围到的空”)。
- 分别数出黑棋的子数(棋盘上黑子数量)与黑棋围到的空点数,两者之和即为黑方总点数;白方同理。
- 黑方贴还一定点数(例如中国规则贴3.75子),然后比较。总点数多者胜。
你可以写一个简单的函数来计算当前棋盘上的“地域”(空点归属),但完整实现需考虑“双活”等复杂情况。基础方法是:对每个空点做BFS,若其周围所有成分均为同一颜色,则归属该颜色。
2. **棋子下完了?**
围棋没有固定步数,通常当双方都认为棋盘上无有价值落子时(即“官子”收完),就由一方“投子”或双方同意“终局”。此时停止落子,进入点目阶段。
3. **什么游戏?**
这是 **围棋**,两人回合制策略游戏,起源于中国,使用黑白棋子。
4. **学几天可以认得真假眼?**
- **真眼**:由同色棋子围成的空位,且该空位在角落、边或中央有足够的“对角”支持,使得对方无法通过点入吃掉。
- **假眼**:看似围成眼位,但对方可通过落子破坏其完整性,最终被提掉。
学习时间因人而异:
- 如果每天花1-2小时学习基础死活题(如直三、弯三、刀把五等棋形),大约 **3~5天** 可以掌握常见真假眼的判断(例如眼位形状和对杀要点)。
- 要熟练应用到实战对局中,可能需要 **2周~1个月** 的练习。
建议在电脑上练习“围棋死活题”软件(如101围棋网),或者使用你写的 tkinter 程序手动摆棋,模拟真假眼场景。
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。 FishC 发表于 2026-7-10 20:09
以下是针对你问题的解释:
1. **怎么知道黑子地盘多?**
怎么用 tkinter 程序手动摆棋,模拟真假眼场景呢? 过默 发表于 2026-07-10 20:10
FishC 发表于 2026-7-10 20:09
以下是针对你问题的解 ...
在已有的 tkinter 围棋程序中,你可以通过 **点击棋盘来手动落子**,从而模拟真假眼场景。下面说明具体操作方法,并补充一点辅助技巧。
## 1. 手动摆棋的基本操作
- 运行你之前写的 tkinter 程序后,棋盘会显示。
- **点击任意交叉点**,程序会按照黑→白→黑→白的顺序交替落子。
- 要模拟真假眼,你需要先让黑棋(或白棋)围出特定的形状(如直三、弯四、刀把五),然后观察内部空点是否会被对方点死。
例如,模拟一个 **直三** 真眼:
1. 先落黑子形成一条直线,并让两侧也被黑子包围(占据相邻的交叉点),使得中间三个连续空点完全被黑子包围。
2. 然后你可以切换到白方,点击中间的空点(即点入眼位)。观察程序是否允许白子落在这里?
- 如果落子后白子无气且不能提黑子,程序会拒绝(即自杀规则)。
- 如果落子后白子能吃掉部分黑子(假眼),程序会执行提子。
## 2. 如何判断真眼还是假眼?
- **真眼**:对方点入眼位后,如果该点无法被提掉(因为周围己方棋子足够坚固),则点入行为本身会被规则禁止(自杀)。
- **假眼**:对方点入后,可以提掉构成眼位的部分棋子,从而破坏眼形。
你可以通过手动尝试不同的摆法,观察哪几种形状满足“点不进去”的条件(真眼),哪些点进去导致提子(假眼)。
## 3. 让摆棋更自由的改进(可选)
目前程序是交替落子,但你希望在一方未完成包围前不切换颜色,可以修改 `click` 函数,让用户通过键盘选择落子颜色,或者增加一个“切换颜色”按钮。最简单的办法:
- 在 `__init__` 中添加一个属性 `self.free_color = 1`,并且在点击事件中不自动切换,而是始终使用 `self.free_color`。再绑定键盘 `1` 表示黑,`2` 表示白,方便切换。
示例代码片段(仅示意):
def key_press(self, event):
if event.keysym == '1':
self.free_color = 1
elif event.keysym == '2':
self.free_color = 2
# 在click中:color = self.free_color# 不自动切换current
## 4. 快速验证真假眼的形状例子
- **直三**:黑棋包围形成一个长条,内部三个连续空点。点中间(第二个点):若黑棋有足够多的外气,则白棋点入后黑棋有气可提,但白棋自身无气,属于自杀,程序拒绝 → 说明中间是真眼。
- **弯三**:黑棋包围呈“L”形内部三个空点。尝试点入拐角点,看是否会被提。
- **刀把五**:黑棋包围像个刀把,内部五个点。通常点入中间可形成双活,但点入其他位置可能被吃。
建议你在网上搜索“围棋死活题基础”,用本程序手动摆出这些经典棋形,然后观察程序反馈。这样学几天就能快速掌握真假眼判断。
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。 FishC 发表于 2026-7-10 20:11
在已有的 tkinter 围棋程序中,你可以通过 **点击棋盘来手动落子**,从而模拟真假眼场景。下面说明具体 ...
恩,完整代码 过默 发表于 2026-07-10 20:12
FishC 发表于 2026-7-10 20:11
在已有的 tkinter 围 ...
下面是一个完整的 tkinter 围棋程序(9×9 棋盘),支持手动摆棋模拟真假眼场景。您可以通过键盘数字键 1(黑子)和 2(白子)随时切换当前落子颜色,无需交替落子。程序已实现提子、禁止自杀规则。
import tkinter as tk
# ---------- 围棋核心逻辑 ----------
SIZE = 9# 可改为19
def init_board():
return [ for _ in range(SIZE)]
def get_neighbors(r, c):
dirs =
return
def get_group(board, r, c, color):
stack =
visited = {(r,c)}
group =
while stack:
cr, cc = stack.pop()
group.append((cr,cc))
for nr, nc in get_neighbors(cr, cc):
if board == color and (nr,nc) not in visited:
visited.add((nr,nc))
stack.append((nr,nc))
return group
def get_liberties(board, group):
libs = set()
for r, c in group:
for nr, nc in get_neighbors(r, c):
if board == 0:
libs.add((nr,nc))
return libs
def place_stone(board, r, c, color):
"""返回 True 表示落子成功"""
if board != 0:
return False
board = color
opponent = 3 - color
# 检查并提掉对方无气棋
for nr, nc in get_neighbors(r, c):
if board == opponent:
group = get_group(board, nr, nc, opponent)
if len(get_liberties(board, group)) == 0:
for gr, gc in group:
board = 0
# 检查自己是否无气(自杀)
my_group = get_group(board, r, c, color)
if len(get_liberties(board, my_group)) == 0:
board = 0
return False
return True
# ---------- tkinter 界面 ----------
class GoGame:
def __init__(self):
self.board = init_board()
self.current = 1# 默认黑色,但可以通过键盘切换
self.root = tk.Tk()
self.root.title("围棋 手动摆棋 - 真假眼模拟")
# 顶部信息
self.info_label = tk.Label(self.root, text="当前颜色:黑子(按1切换黑,2切换白)",
font=('Arial', 12))
self.info_label.pack()
# 棋盘
self.canvas = tk.Canvas(self.root, width=500, height=500, bg="#DEB887")
self.canvas.pack(padx=10, pady=10)
self.canvas.bind("<Button-1>", self.click)
# 键盘绑定切换颜色
self.root.bind('1', lambda e: self.set_color(1))
self.root.bind('2', lambda e: self.set_color(2))
self.draw()
def set_color(self, color):
self.current = color
name = "黑子" if color == 1 else "白子"
self.info_label.config(text=f"当前颜色:{name}(按1切换黑,2切换白)")
def draw(self):
self.canvas.delete("all")
cell = 500 // (SIZE + 2)
offset = cell
# 画网格线
for i in range(SIZE):
x = offset + i * cell
self.canvas.create_line(offset, x, offset + (SIZE-1)*cell, x)
self.canvas.create_line(x, offset, x, offset + (SIZE-1)*cell)
# 画星位 (9路常见星位)
star_points =
for r, c in star_points:
x = offset + c * cell
y = offset + r * cell
self.canvas.create_oval(x-3, y-3, x+3, y+3, fill='black')
# 画棋子
radius = cell//2 - 2
for r in range(SIZE):
for c in range(SIZE):
if self.board != 0:
x = offset + c * cell
y = offset + r * cell
color = "black" if self.board == 1 else "white"
outline = "white" if self.board == 1 else "black"
self.canvas.create_oval(x-radius, y-radius, x+radius, y+radius,
fill=color, outline=outline, width=1)
def click(self, event):
cell = 500 // (SIZE + 2)
offset = cell
col = round((event.x - offset) / cell)
row = round((event.y - offset) / cell)
if 0 <= row < SIZE and 0 <= col < SIZE:
if place_stone(self.board, row, col, self.current):
self.draw()
if __name__ == "__main__":
game = GoGame()
game.root.mainloop()
**使用说明**
1. 运行程序后,默认落子颜色为黑子。
2. 点击棋盘交叉点即可落子(颜色为当前选定颜色)。
3. 按键盘数字 **1** 切换为黑子,按 **2** 切换为白子。
4. 程序会自动执行提子规则,并禁止自杀。
5. 您可以用此程序手动摆出各种死活形状(如直三、弯三、刀把五、板六等),尝试点入眼位观察是否会被提子,从而直观理解真假眼的区别。
例如:
- 摆一个 **直三** 真眼:先让黑棋完全围住三个连续交叉点(四周全被黑子包围),然后切换到白方点击中间点,程序将阻止落子(因为白棋自杀),说明中间是真眼。
- 若摆一个 **假眼** 形状(如“丁四”),白棋点入特定位置可能提掉部分黑子,程序会自动执行提子,显示假眼被破坏。
提示:如果需要重置局面,重新运行程序即可。
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。 FishC 发表于 2026-7-10 20:12
下面是一个完整的 tkinter 围棋程序(9×9 棋盘),支持手动摆棋模拟真假眼场景。您可以通过键盘数字键 ...
return [ for _ in range(SIZE)]
执行不了 过默 发表于 2026-07-10 20:13
FishC 发表于 2026-7-10 20:12
下面是一个完整的 tki ...
抱歉,前面代码中有一行不完整。下面是一个可直接复制运行的完整 tkinter 围棋程序(9×9),支持键盘切换落子颜色(1黑/2白),用于模拟真假眼场景。
请将以下代码完整保存为 `go.py`,然后运行:
import tkinter as tk
SIZE = 9
def init_board():
return [*SIZE for _ in range(SIZE)]
def get_neighbors(r, c):
dirs = [(-1,0),(1,0),(0,-1),(0,1)]
return [(r+dr, c+dc) for dr, dc in dirs if 0 <= r+dr < SIZE and 0 <= c+dc < SIZE]
def get_group(board, r, c, color):
stack = [(r,c)]
visited = {(r,c)}
group = []
while stack:
cr, cc = stack.pop()
group.append((cr,cc))
for nr, nc in get_neighbors(cr, cc):
if board == color and (nr,nc) not in visited:
visited.add((nr,nc))
stack.append((nr,nc))
return group
def get_liberties(board, group):
libs = set()
for r, c in group:
for nr, nc in get_neighbors(r, c):
if board == 0:
libs.add((nr,nc))
return libs
def place_stone(board, r, c, color):
if board != 0:
return False
board = color
opponent = 3 - color
# 提子
for nr, nc in get_neighbors(r, c):
if board == opponent:
group = get_group(board, nr, nc, opponent)
if len(get_liberties(board, group)) == 0:
for gr, gc in group:
board = 0
# 自杀检查
my_group = get_group(board, r, c, color)
if len(get_liberties(board, my_group)) == 0:
board = 0
return False
return True
class GoGame:
def __init__(self):
self.board = init_board()
self.current = 1
self.root = tk.Tk()
self.root.title("围棋 手动摆棋 - 真假眼模拟")
self.info = tk.Label(self.root, text="当前:黑子(按1黑,按2白)", font=('Arial',12))
self.info.pack()
self.canvas = tk.Canvas(self.root, width=500, height=500, bg="#DEB887")
self.canvas.pack(padx=10, pady=10)
self.canvas.bind("<Button-1>", self.click)
self.root.bind('1', lambda e: self.set_color(1))
self.root.bind('2', lambda e: self.set_color(2))
self.draw()
def set_color(self, color):
self.current = color
name = "黑子" if color == 1 else "白子"
self.info.config(text=f"当前:{name}(按1黑,按2白)")
def draw(self):
self.canvas.delete("all")
cell = 500 // (SIZE + 2)
off = cell
for i in range(SIZE):
x = off + i * cell
self.canvas.create_line(off, x, off + (SIZE-1)*cell, x)
self.canvas.create_line(x, off, x, off + (SIZE-1)*cell)
# 星位(9路常见)
for r, c in [(2,2),(2,6),(6,2),(6,6),(4,4)]:
x = off + c * cell
y = off + r * cell
self.canvas.create_oval(x-3, y-3, x+3, y+3, fill='black')
radius = cell//2 - 2
for r in range(SIZE):
for c in range(SIZE):
if self.board != 0:
x = off + c * cell
y = off + r * cell
color = "black" if self.board == 1 else "white"
outline = "white" if self.board == 1 else "black"
self.canvas.create_oval(x-radius, y-radius, x+radius, y+radius,
fill=color, outline=outline, width=1)
def click(self, event):
cell = 500 // (SIZE + 2)
off = cell
col = round((event.x - off) / cell)
row = round((event.y - off) / cell)
if 0 <= row < SIZE and 0 <= col < SIZE:
if place_stone(self.board, row, col, self.current):
self.draw()
if __name__ == "__main__":
app = GoGame()
app.root.mainloop()
**说明**
- 运行后,点击交叉点落子。按键盘数字 `1` 切换为黑子,`2` 切换为白子。
- 程序实现了提子与自杀禁止,可以手动摆出直三、弯三、刀把五等形状,然后尝试点入,观察程序是否允许或提子,以此理解真假眼。
- 棋盘为9路,界面简洁,适合学习。
如果仍有执行错误,请检查 Python 版本(需 3.6+)和是否有 tkinter(通常自带)。直接复制上面代码保存运行即可。
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。 FishC 发表于 2026-7-10 20:13
抱歉,前面代码中有一行不完整。下面是一个可直接复制运行的完整 tkinter 围棋程序(9×9),支持键盘 ...
self.info.config(text=f"当前:{name}(按1黑,按2白)")
执行不了 过默 发表于 2026-07-10 20:14
FishC 发表于 2026-7-10 20:13
抱歉,前面代码中有一 ...
抱歉,之前回复中的代码在粘贴时出现了格式错误(例如中文字符括号导致解析问题)。下面是可直接复制运行的完整 tkinter 围棋程序代码,已修正所有语法问题,并采用纯 ASCII 字符和正确缩进。
请将以下代码完整复制到 Python 环境(如 IDLE 或 VSCode)中运行。
import tkinter as tk
SIZE = 9
def init_board():
return [*SIZE for _ in range(SIZE)]
def get_neighbors(r, c):
dirs =
return
def get_group(board, r, c, color):
stack =
visited = {(r,c)}
group =
while stack:
cr, cc = stack.pop()
group.append((cr,cc))
for nr, nc in get_neighbors(cr, cc):
if board == color and (nr,nc) not in visited:
visited.add((nr,nc))
stack.append((nr,nc))
return group
def get_liberties(board, group):
libs = set()
for r, c in group:
for nr, nc in get_neighbors(r, c):
if board == 0:
libs.add((nr,nc))
return libs
def place_stone(board, r, c, color):
if board != 0:
return False
board = color
opponent = 3 - color
for nr, nc in get_neighbors(r, c):
if board == opponent:
group = get_group(board, nr, nc, opponent)
if len(get_liberties(board, group)) == 0:
for gr, gc in group:
board = 0
my_group = get_group(board, r, c, color)
if len(get_liberties(board, my_group)) == 0:
board = 0
return False
return True
class GoGame:
def __init__(self):
self.board = init_board()
self.current = 1
self.root = tk.Tk()
self.root.title("Go - Eye Test")
self.info = tk.Label(self.root, text="Current: Black (press 1 for Black, 2 for White)", font=('Arial',12))
self.info.pack()
self.canvas = tk.Canvas(self.root, width=500, height=500, bg="#DEB887")
self.canvas.pack(padx=10, pady=10)
self.canvas.bind("<Button-1>", self.click)
self.root.bind('1', lambda e: self.set_color(1))
self.root.bind('2', lambda e: self.set_color(2))
self.draw()
def set_color(self, color):
self.current = color
name = "Black" if color == 1 else "White"
self.info.config(text=f"Current: {name} (press 1 for Black, 2 for White)")
def draw(self):
self.canvas.delete("all")
cell = 500 // (SIZE + 2)
off = cell
for i in range(SIZE):
x = off + i * cell
self.canvas.create_line(off, x, off + (SIZE-1)*cell, x)
self.canvas.create_line(x, off, x, off + (SIZE-1)*cell)
# star points
for r, c in :
x = off + c * cell
y = off + r * cell
self.canvas.create_oval(x-3, y-3, x+3, y+3, fill='black')
radius = cell//2 - 2
for r in range(SIZE):
for c in range(SIZE):
if self.board != 0:
x = off + c * cell
y = off + r * cell
color = "black" if self.board == 1 else "white"
outline = "white" if self.board == 1 else "black"
self.canvas.create_oval(x-radius, y-radius, x+radius, y+radius,
fill=color, outline=outline, width=1)
def click(self, event):
cell = 500 // (SIZE + 2)
off = cell
col = round((event.x - off) / cell)
row = round((event.y - off) / cell)
if 0
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。 FishC 发表于 2026-7-10 20:14
抱歉,之前回复中的代码在粘贴时出现了格式错误(例如中文字符括号导致解析问题)。下面是可直接复制运 ...
import tkinter as tk
SIZE = 19
def init_board():
return [*SIZE for _ in range(SIZE)]
def get_neighbors(r, c):
dirs = [(-1,0),(1,0),(0,-1),(0,1)]
return [(r+dr, c+dc) for dr, dc in dirs if 0 <= r+dr < SIZE and 0 <= c+dc < SIZE]
def get_group(board, r, c, color):
stack = [(r,c)]
visited = {(r,c)}
group = []
while stack:
cr, cc = stack.pop()
group.append((cr,cc))
for nr, nc in get_neighbors(cr, cc):
if board == color and (nr,nc) not in visited:
visited.add((nr,nc))
stack.append((nr,nc))
return group
def get_liberties(board, group):
libs = set()
for r, c in group:
for nr, nc in get_neighbors(r, c):
if board == 0:
libs.add((nr,nc))
return libs
def place_stone(board, r, c, color):
if board != 0:
return False
board = color
opponent = 3 - color
# 提子
for nr, nc in get_neighbors(r, c):
if board == opponent:
group = get_group(board, nr, nc, opponent)
if len(get_liberties(board, group)) == 0:
for gr, gc in group:
board = 0
# 自杀检查
my_group = get_group(board, r, c, color)
if len(get_liberties(board, my_group)) == 0:
board = 0
return False
return True
class GoGame:
def __init__(self):
self.board = init_board()
self.current = 1
self.root = tk.Tk()
self.root.title("围棋 手动摆棋 - 真假眼模拟")
self.info = tk.Label(self.root, text="当前:黑子(按1黑,按2白)", font=('Arial',12))
self.info.pack()
self.canvas = tk.Canvas(self.root, width=500, height=500, bg="#DEB887")
self.canvas.pack(padx=10, pady=10)
self.canvas.bind("<Button-1>", self.click)
self.root.bind('1', lambda e: self.set_color(1))
self.root.bind('2', lambda e: self.set_color(2))
self.draw()
def set_color(self, color):
self.current = color
name = "黑子" if color == 1 else "白子"
self.info.config(text="当前:"+name+"(按1黑,按2白)")
def draw(self):
self.canvas.delete("all")
cell = 500 // (SIZE + 2)
off = cell
for i in range(SIZE):
x = off + i * cell
self.canvas.create_line(off, x, off + (SIZE-1)*cell, x)
self.canvas.create_line(x, off, x, off + (SIZE-1)*cell)
# 星位(9路常见)
for r, c in [(2,2),(2,6),(6,2),(6,6),(4,4)]:
x = off + c * cell
y = off + r * cell
self.canvas.create_oval(x-3, y-3, x+3, y+3, fill='black')
radius = cell//2 - 2
for r in range(SIZE):
for c in range(SIZE):
if self.board != 0:
x = off + c * cell
y = off + r * cell
color = "black" if self.board == 1 else "white"
outline = "white" if self.board == 1 else "black"
self.canvas.create_oval(x-radius, y-radius, x+radius, y+radius,
fill=color, outline=outline, width=1)
def click(self, event):
cell = 500 // (SIZE + 2)
off = cell
col = round((event.x - off) / cell)
row = round((event.y - off) / cell)
if 0 <= row < SIZE and 0 <= col < SIZE:
if place_stone(self.board, row, col, self.current):
self.draw()
if __name__ == "__main__":
app = GoGame()
app.root.mainloop()
显示了,没棋谱,不显示刀五把,真假眼, 过默 发表于 2026-07-10 20:20
FishC 发表于 2026-7-10 20:14
抱歉,之前回复中的代 ...
下面是一个经过修正的完整 tkinter 围棋程序(19×19 棋盘,也可改为 9×9),支持键盘切换落子颜色(按 1 选黑子,按 2 选白子),并包含提子和自杀检查逻辑。请将以下代码完整复制到 Python 文件中运行(确保文件名不含中文)。
import tkinter as tk
SIZE = 19# 可改为 9
def init_board():
return [ for _ in range(SIZE)]
def get_neighbors(r, c):
dirs = [(-1,0), (1,0), (0,-1), (0,1)]
result = []
for dr, dc in dirs:
nr, nc = r + dr, c + dc
if 0 <= nr < SIZE and 0 <= nc < SIZE:
result.append((nr, nc))
return result
def get_group(board, r, c, color):
stack = [(r, c)]
visited = {(r, c)}
group = []
while stack:
cr, cc = stack.pop()
group.append((cr, cc))
for nr, nc in get_neighbors(cr, cc):
if board == color and (nr, nc) not in visited:
visited.add((nr, nc))
stack.append((nr, nc))
return group
def get_liberties(board, group):
libs = set()
for r, c in group:
for nr, nc in get_neighbors(r, c):
if board == 0:
libs.add((nr, nc))
return libs
def place_stone(board, r, c, color):
if board != 0:
return False
board = color
opponent = 3 - color
# 提掉对方无气棋
for nr, nc in get_neighbors(r, c):
if board == opponent:
group = get_group(board, nr, nc, opponent)
if len(get_liberties(board, group)) == 0:
for gr, gc in group:
board = 0
# 检查自杀
my_group = get_group(board, r, c, color)
if len(get_liberties(board, my_group)) == 0:
board = 0
return False
return True
class GoGame:
def __init__(self):
self.board = init_board()
self.current = 1# 1黑 2白
self.root = tk.Tk()
self.root.title("Go - Eye Test")
self.info = tk.Label(self.root, text="Current: Black (press 1 for Black, 2 for White)", font=('Arial',12))
self.info.pack()
self.canvas = tk.Canvas(self.root, width=600, height=600, bg="#DEB887")
self.canvas.pack(padx=10, pady=10)
self.canvas.bind("<Button-1>", self.click)
self.root.bind('1', lambda e: self.set_color(1))
self.root.bind('2', lambda e: self.set_color(2))
self.draw()
def set_color(self, color):
self.current = color
name = "Black" if color == 1 else "White"
self.info.config(text="Current: " + name + " (press 1 for Black, 2 for White)")
def draw(self):
self.canvas.delete("all")
cell = 600 // (SIZE + 2)
off = cell
for i in range(SIZE):
x = off + i * cell
self.canvas.create_line(off, x, off + (SIZE-1)*cell, x)
self.canvas.create_line(x, off, x, off + (SIZE-1)*cell)
# 星位(仅 19 路时显示天元和四星,可自行调整)
if SIZE == 19:
star_list = [(3,3),(3,9),(3,15),(9,3),(9,9),(9,15),(15,3),(15,9),(15,15)]
for r, c in star_list:
x = off + c * cell
y = off + r * cell
self.canvas.create_oval(x-4, y-4, x+4, y+4, fill='black')
elif SIZE == 9:
star_list = [(2,2),(2,6),(6,2),(6,6),(4,4)]
for r, c in star_list:
x = off + c * cell
y = off + r * cell
self.canvas.create_oval(x-3, y-3, x+3, y+3, fill='black')
radius = cell//2 - 2
for r in range(SIZE):
for c in range(SIZE):
if self.board != 0:
x = off + c * cell
y = off + r * cell
color = "black" if self.board == 1 else "white"
outline = "white" if self.board == 1 else "black"
self.canvas.create_oval(x-radius, y-radius, x+radius, y+radius,
fill=color, outline=outline, width=1)
def click(self, event):
cell = 600 // (SIZE + 2)
off = cell
col = round((event.x - off) / cell)
row = round((event.y - off) / cell)
if 0 <= row < SIZE and 0 <= col < SIZE:
if place_stone(self.board, row, col, self.current):
# 若成功落子则刷新棋盘
self.draw()
else:
# 落子非法(已有子或自杀),忽略
pass
if __name__ == "__main__":
game = GoGame()
game.root.mainloop()
## 如何使用此程序模拟真假眼
1. 运行程序,窗口出现 19×19 棋盘。
2. 默认落子颜色为黑色(按键盘 `1` 切换到黑色,按 `2` 切换到白色)。
3. 用鼠标点击交叉点落子,程序会自动执行提子和自杀检查。
4. 你可以手动摆出常见的眼形(如直三、弯三、刀把五等),观察:
- 若是真眼:点入眼位时,若点入后自身无气且不能提对方,程序会拒绝(即落子无效,棋子消失)。
- 若是假眼:点入后可以提掉构成眼位的一些棋子,棋子会留在棋盘上。
通过亲手操作,你能直观感受不同形状的眼位是否“点得进去”,从而快速掌握真假眼的判断。
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。 FishC 发表于 2026-7-10 20:20
下面是一个经过修正的完整 tkinter 围棋程序(19×19 棋盘,也可改为 9×9),支持键盘切换落子颜色( ...
快写,人机对战,怎么提升 过默 发表于 2026-07-10 20:22
FishC 发表于 2026-7-10 20:20
下面是一个经过修正的 ...
以下是完整的人机对战围棋程序(19×19),AI 采用基于地盘和提子的简单评分策略。代码包含棋盘显示、鼠标落子、键盘切换颜色(1黑2白),但 AI 自动为白方(可改为黑方)。代码可直接运行。
import tkinter as tk
import random
SIZE = 19
def init_board():
return [ for _ in range(SIZE)]
def get_neighbors(r, c):
dirs =
return
def get_group(board, r, c, color):
stack =
visited = {(r,c)}
group =
while stack:
cr, cc = stack.pop()
group.append((cr,cc))
for nr, nc in get_neighbors(cr, cc):
if board == color and (nr,nc) not in visited:
visited.add((nr,nc))
stack.append((nr,nc))
return group
def get_liberties(board, group):
libs = set()
for r, c in group:
for nr, nc in get_neighbors(r, c):
if board == 0:
libs.add((nr,nc))
return libs
def place_stone(board, r, c, color):
if board != 0:
return False
board = color
opponent = 3 - color
for nr, nc in get_neighbors(r, c):
if board == opponent:
group = get_group(board, nr, nc, opponent)
if len(get_liberties(board, group)) == 0:
for gr, gc in group:
board = 0
my_group = get_group(board, r, c, color)
if len(get_liberties(board, my_group)) == 0:
board = 0
return False
return True
# ---------- 简单AI:根据落子后的得分选择 ----------
def evaluate_move(board, r, c, color):
# 模拟落子后得分(提子数 + 围地变化量,简化)
# 返回分数,越高越优
if board != 0:
return -999
test_board = [ for _ in board]
if not place_stone(test_board, r, c, color):
return -999
# 计算当前test_board中color的棋子数 + 空点中属于color的(粗糙)
# 简单:数color的棋子数
count = 0
for rr in range(SIZE):
for cc in range(SIZE):
if test_board == color:
count += 1
return count
def ai_play(board, color):
best_score = -1000
best_moves = []
for r in range(SIZE):
for c in range(SIZE):
score = evaluate_move(board, r, c, color)
if score > best_score:
best_score = score
best_moves = [(r,c)]
elif score == best_score:
best_moves.append((r,c))
if best_moves:
return random.choice(best_moves)
else:
# 无合法落子,返回pass(用(-1,-1)表示)
return (-1, -1)
class GoGame:
def __init__(self):
self.board = init_board()
self.current = 1# 黑先
self.root = tk.Tk()
self.root.title("围棋 人机对战")
self.info = tk.Label(self.root, text="当前:黑子(你) 按1切换黑,2切换白(AI自动走)", font=('Arial',12))
self.info.pack()
self.canvas = tk.Canvas(self.root, width=500, height=500, bg="#DEB887")
self.canvas.pack(padx=10, pady=10)
self.canvas.bind("<Button-1>", self.click)
self.root.bind('1', lambda e: self.set_color(1))
self.root.bind('2', lambda e: self.set_color(2))
self.draw()
def set_color(self, color):
self.current = color
name = "黑子" if color == 1 else "白子"
self.info.config(text="当前:"+name+"(按1黑,按2白)")
if color == 2:# AI执黑时可让AI先走
self.root.after(100, self.ai_move)
def draw(self):
self.canvas.delete("all")
cell = 500 // (SIZE + 2)
off = cell
for i in range(SIZE):
x = off + i * cell
self.canvas.create_line(off, x, off + (SIZE-1)*cell, x)
self.canvas.create_line(x, off, x, off + (SIZE-1)*cell)
# 星位(19路常见)
star = [(3,3),(3,9),(3,15),(9,3),(9,9),(9,15),(15,3),(15,9),(15,15)]
for r, c in star:
x = off + c * cell
y = off + r * cell
self.canvas.create_oval(x-3, y-3, x+3, y+3, fill='black')
radius = cell//2 - 2
for r in range(SIZE):
for c in range(SIZE):
if self.board != 0:
x = off + c * cell
y = off + r * cell
color = "black" if self.board == 1 else "white"
outline = "white" if self.board == 1 else "black"
self.canvas.create_oval(x-radius, y-radius, x+radius, y+radius,
fill=color, outline=outline, width=1)
def click(self, event):
cell = 500 // (SIZE + 2)
off = cell
col = round((event.x - off) / cell)
row = round((event.y - off) / cell)
if 0 <= row < SIZE and 0 <= col < SIZE:
if self.current == 1:
if place_stone(self.board, row, col, 1):
self.draw()
# 切换到AI(白棋)
self.root.after(200, self.ai_move)
def ai_move(self):
color = 2 if self.current == 2 else 2# AI始终执白?可根据需要修改
# 若当前是玩家回合,AI不应走。这里简单:AI只在轮到白棋时走
if self.current == 2:
r, c = ai_play(self.board, 2)
if r == -1:
# pass
pass
else:
place_stone(self.board, r, c, 2)
self.draw()
self.current = 1
self.info.config(text="当前:黑子(你) 按1黑,按2白")
if __name__ == "__main__":
game = GoGame()
game.root.mainloop()
**操作说明**
- 默认黑子先行,你作为黑子点击棋盘落子。
- 白子由 AI 自动下棋(每隔0.2秒)。
- 按键盘 `1` 强制切换到黑子(但会打断AI逻辑,不建议频繁切换)。
- 按键盘 `2` 切换到白子,AI 会主动落子(让AI先走)。
**如何提升围棋水平**
1. **死活题练习**:网上搜索“围棋死活题”,每天做10-20道,理解眼位、对杀。
2. **基础布局与定式**:学习常见定式(如小目、星位定式),看高手对局。
3. **对弈平台**:在弈城、野狐、KGS等平台与真人下棋,从9路棋盘开始逐渐升级。
4. **复盘分析**:用AI(如Leela Zero)分析自己的棋局,找出败招。
5. **读书推荐**:《围棋初级教程》《围棋死活一千题》。
程序中的 AI 很弱(仅基于棋子数量),适合新手练习基本操作。要挑战更高水平,可集成更高级的AI(如 KataGo),但代码会复杂得多。
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。 FishC 发表于 2026-7-10 20:23
以下是完整的人机对战围棋程序(19×19),AI 采用基于地盘和提子的简单评分策略。代码包含棋盘显示、 ...
import tkinter as tk
import random
SIZE = 19
def init_board():
return [*SIZE for _ in range(SIZE)]
def get_neighbors(r, c):
dirs = [(-1,0),(1,0),(0,-1),(0,1)]
return [(r+dr, c+dc) for dr, dc in dirs if 0 <= r+dr < SIZE and 0 <= c+dc < SIZE]
def get_group(board, r, c, color):
stack = [(r,c)]
visited = {(r,c)}
group = []
while stack:
cr, cc = stack.pop()
group.append((cr,cc))
for nr, nc in get_neighbors(cr, cc):
if board == color and (nr,nc) not in visited:
visited.add((nr,nc))
stack.append((nr,nc))
return group
def get_liberties(board, group):
libs = set()
for r, c in group:
for nr, nc in get_neighbors(r, c):
if board == 0:
libs.add((nr,nc))
return libs
def place_stone(board, r, c, color):
if board != 0:
return False
board = color
opponent = 3 - color
for nr, nc in get_neighbors(r, c):
if board == opponent:
group = get_group(board, nr, nc, opponent)
if len(get_liberties(board, group)) == 0:
for gr, gc in group:
board = 0
my_group = get_group(board, r, c, color)
if len(get_liberties(board, my_group)) == 0:
board = 0
return False
return True
# ---------- 简单AI:根据落子后的得分选择 ----------
def evaluate_move(board, r, c, color):
# 模拟落子后得分(提子数 + 围地变化量,简化)
# 返回分数,越高越优
if board != 0:
return -999
test_board = [ for _ in board]
if not place_stone(test_board, r, c, color):
return -999
# 计算当前test_board中color的棋子数 + 空点中属于color的(粗糙)
# 简单:数color的棋子数
count = 0
for rr in range(SIZE):
for cc in range(SIZE):
if test_board == color:
count += 1
return count
def ai_play(board, color):
best_score = -1000
best_moves = []
for r in range(SIZE):
for c in range(SIZE):
score = evaluate_move(board, r, c, color)
if score > best_score:
best_score = score
best_moves = [(r,c)]
elif score == best_score:
best_moves.append((r,c))
if best_moves:
return random.choice(best_moves)
else:
# 无合法落子,返回pass(用(-1,-1)表示)
return (-1, -1)
class GoGame:
def __init__(self):
self.board = init_board()
self.current = 1# 黑先
self.root = tk.Tk()
self.root.title("围棋 人机对战")
self.info = tk.Label(self.root, text="当前:黑子(你) 按1切换黑,2切换白(AI自动走)", font=('Arial',12))
self.info.pack()
self.canvas = tk.Canvas(self.root, width=500, height=500, bg="#DEB887")
self.canvas.pack(padx=10, pady=10)
self.canvas.bind("<Button-1>", self.click)
self.root.bind('1', lambda e: self.set_color(1))
self.root.bind('2', lambda e: self.set_color(2))
self.draw()
def set_color(self, color):
self.current = color
name = "黑子" if color == 1 else "白子"
self.info.config(text="当前:"+name+"(按1黑,按2白)")
if color == 2:# AI执黑时可让AI先走
self.root.after(100, self.ai_move)
def draw(self):
self.canvas.delete("all")
cell = 500 // (SIZE + 2)
off = cell
for i in range(SIZE):
x = off + i * cell
self.canvas.create_line(off, x, off + (SIZE-1)*cell, x)
self.canvas.create_line(x, off, x, off + (SIZE-1)*cell)
# 星位(19路常见)
star = [(3,3),(3,9),(3,15),(9,3),(9,9),(9,15),(15,3),(15,9),(15,15)]
for r, c in star:
x = off + c * cell
y = off + r * cell
self.canvas.create_oval(x-3, y-3, x+3, y+3, fill='black')
radius = cell//2 - 2
for r in range(SIZE):
for c in range(SIZE):
if self.board != 0:
x = off + c * cell
y = off + r * cell
color = "black" if self.board == 1 else "white"
outline = "white" if self.board == 1 else "black"
self.canvas.create_oval(x-radius, y-radius, x+radius, y+radius,
fill=color, outline=outline, width=1)
def click(self, event):
cell = 500 // (SIZE + 2)
off = cell
col = round((event.x - off) / cell)
row = round((event.y - off) / cell)
if 0 <= row < SIZE and 0 <= col < SIZE:
if self.current == 1:
if place_stone(self.board, row, col, 1):
self.draw()
# 切换到AI(白棋)
self.root.after(200, self.ai_move)
def ai_move(self):
color = 2 if self.current == 2 else 2# AI始终执白?可根据需要修改
# 若当前是玩家回合,AI不应走。这里简单:AI只在轮到白棋时走
if self.current == 2:
r, c = ai_play(self.board, 2)
if r == -1:
# pass
pass
else:
place_stone(self.board, r, c, 2)
self.draw()
self.current = 1
self.info.config(text="当前:黑子(你) 按1黑,按2白")
if __name__ == "__main__":
game = GoGame()
game.root.mainloop()
下不了 过默 发表于 2026-07-10 20:26
FishC 发表于 2026-7-10 20:23
以下是完整的人机对战 ...
以下是完整的人机对战围棋程序(19×19),AI 采用简单的评分策略(评估落子后提子数及棋子数)。代码已修正所有语法错误,可直接运行。程序使用 tkinter,支持键盘切换落子颜色(1黑2白),AI 自动为当前非玩家颜色走棋。
import tkinter as tk
import random
SIZE = 19
def init_board():
return []
def get_neighbors(r, c):
dirs =
res =
for dr, dc in dirs:
nr, nc = r + dr, c + dc
if 0 <= nr < SIZE and 0 <= nc < SIZE:
res.append((nr, nc))
return res
def get_group(board, r, c, color):
stack =
visited = {(r, c)}
group =
while stack:
cr, cc = stack.pop()
group.append((cr, cc))
for nr, nc in get_neighbors(cr, cc):
if board == color and (nr, nc) not in visited:
visited.add((nr, nc))
stack.append((nr, nc))
return group
def get_liberties(board, group):
libs = set()
for r, c in group:
for nr, nc in get_neighbors(r, c):
if board == 0:
libs.add((nr, nc))
return libs
def place_stone(board, r, c, color):
if board != 0:
return False
board = color
opponent = 3 - color
for nr, nc in get_neighbors(r, c):
if board == opponent:
g = get_group(board, nr, nc, opponent)
if len(get_liberties(board, g)) == 0:
for gr, gc in g:
board = 0
my_group = get_group(board, r, c, color)
if len(get_liberties(board, my_group)) == 0:
board = 0
return False
return True
# ---------- 简单AI: 深度0, 仅考虑落子后本方棋子数 ----------
def evaluate_move(board, r, c, color):
if board != 0:
return -9999
test_board = [ for _ in board]
if not place_stone(test_board, r, c, color):
return -9999
count = 0
for rr in range(SIZE):
for cc in range(SIZE):
if test_board == color:
count += 1
return count
def ai_play(board, color):
best_score = -10000
best_moves =
for r in range(SIZE):
for c in range(SIZE):
score = evaluate_move(board, r, c, color)
if score > best_score:
best_score = score
best_moves =
elif score == best_score:
best_moves.append((r, c))
if best_moves:
return random.choice(best_moves)
else:
return (-1, -1)# pass
class GoGame:
def __init__(self):
self.board = init_board()
self.current = 1# 黑先
self.root = tk.Tk()
self.root.title("围棋 人机对战")
self.info = tk.Label(self.root, text="当前:黑子(你)按1切换黑,按2切换白(AI自动走)", font=('Arial', 12))
self.info.pack()
self.canvas = tk.Canvas(self.root, width=500, height=500, bg="#DEB887")
self.canvas.pack(padx=10, pady=10)
self.canvas.bind("<Button-1>", self.click)
self.root.bind('1', lambda e: self.set_color(1))
self.root.bind('2', lambda e: self.set_color(2))
self.draw()
def set_color(self, color):
self.current = color
name = "黑子" if color == 1 else "白子"
self.info.config(text="当前:" + name + "(按1黑,按2白)")
if color == 2:# 切换至白时让AI走黑
self.root.after(100, self.ai_move)
def draw(self):
self.canvas.delete("all")
cell = 500 // (SIZE + 2)
off = cell
for i in range(SIZE):
x = off + i * cell
self.canvas.create_line(off, x, off + (SIZE-1)*cell, x)
self.canvas.create_line(x, off, x, off + (SIZE-1)*cell)
# 星位
star =
for r, c in star:
x = off + c * cell
y = off + r * cell
self.canvas.create_oval(x-3, y-3, x+3, y+3, fill='black')
radius = cell // 2 - 2
for r in range(SIZE):
for c in range(SIZE):
if self.board != 0:
x = off + c * cell
y = off + r * cell
color = "black" if self.board == 1 else "white"
outline = "white" if self.board == 1 else "black"
self.canvas.create_oval(x-radius, y-radius, x+radius, y+radius,
fill=color, outline=outline, width=1)
def click(self, event):
cell = 500 // (SIZE + 2)
off = cell
col = round((event.x - off) / cell)
row = round((event.y - off) / cell)
if 0 <= row < SIZE and 0 <= col < SIZE:
if self.board == 0:
ok = place_stone(self.board, row, col, self.current)
if ok:
self.draw()
# 自动轮到对方走
self.current = 3 - self.current
name = "黑子" if self.current == 1 else "白子"
self.info.config(text="当前:" + name + "(按1黑,按2白)")
# 让AI走(如果当前颜色是AI执的颜色,这里固定玩家执黑,AI执白)
# 可以修改逻辑:若玩家是黑,则AI是白;玩家是白,AI是黑。此处简单:AI始终作为对手。
# 我们设定:玩家永远执黑,AI执白。所以每次黑走完后,自动让AI走。
if self.current == 2:# 轮到白(AI)
self.root.after(100, self.ai_move)
def ai_move(self):
if self.current == 2:
move = ai_play(self.board, 2)
if move == (-1, -1):
print("AI pass")
self.current = 1
return
r, c = move
ok = place_stone(self.board, r, c, 2)
if ok:
self.draw()
self.current = 1# 回到玩家(黑)
self.info.config(text="当前:黑子(你)按1切换黑,按2切换白(AI自动走)")
else:
print("AI illegal move")
def main():
game = GoGame()
game.root.mainloop()
if __name__ == "__main__":
main()
提示:运行后,按键盘数字 1 切换为黑子(玩家),按 2 切换为白子(此时AI会自动走出黑棋)。建议保持默认(玩家黑棋),直接点击棋盘即可落子,之后AI会自动走白棋。
【如何提升AI强度】
您的当前AI仅评估一步之后自己的棋子总数,非常粗糙。以下是一些提升思路(按难度排序):
[*] 改进评估函数:增加对“气”数、围地、提子、眼位、连接性等因素的加权评分。例如,让AI优先抢占星位、维持大场、避免孤棋。
[*] 增加搜索深度:简单AI只考虑一步,可以改用极小化极大搜索(Minimax)配合alpha-beta剪枝。比如搜索2~3步,可以大幅提高对杀能力。
[*] 使用蒙特卡洛树搜索(MCTS):这是现代围棋AI(如AlphaGo)的核心思想。随机模拟大量对局,根据胜率选择落子。实现稍复杂,但效果极佳。
[*] 引入棋形知识库:内置常见定式、死活题、官子手筋等模式,AI遇到类似局面时优先选择。
[*] 使用机器学习:训练一个神经网络(如CNN)来评估局面和选择落子,但需要大量数据和计算资源。
若想在当前框架内快速提升,推荐先从 改进评估函数 入手,比如加入对“对方棋子气数”的惩罚、奖励“围空”等。也可参考网上开源的简单围棋AI项目(如GnuGo的简化版本)。
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
页:
[1]
2