人机对战
在之前的博文基于tkinter的五子棋游戏中使用tkinter做了一个简单的五子棋游戏,只能实现人人对战,后来想着加上人机对战的功能。
不过,最初想想还是挺麻烦的,计算机怎么评估当前的棋局,找到最佳或者较佳的落子点呢,脑子真是越来越不灵光了。站在巨人的肩膀上,科学技术才在这几百年发展的如此迅速,先看看别人怎么做的吧,果然别人实现起来也就那么几行代码,真是惭愧啊,也感谢这个开源的时代,让我们可以站得更高,看得更远。
计算机算法
计算机根据黑白双方现有落子情况进行棋局评估,给出各空白落子点处的分数。五子棋的几种基本棋形包括连五,活四,冲四,活三,眠三,活二,眠二等,不同的棋形打不同的分数。这个分数不但要考虑到了己方的棋子,还要考虑对方的局势,即要分别给双方打分,并求和,这样就兼具了攻击和防守的能力。不过,这里算法上与原算法相比略去一部分,这大概也导致了这个计算机有点傻😂
对于空位的遍历也是很费资源的,所以这里参考了引用博文中做法,仅遍历了已有棋子周边的空位。
源码
保留了原程序的架构,有些地方又偷懒,所以代码有点乱
from tkinter import *
import random
offset = [(1, 0), (0, 1), (1, 1), (1, -1)]
class GoBang():
def __int__(self):
self.window = Tk()
self.window.title("五子棋")
self.window.iconbitmap('./gobang.ico')
self.window.geometry("500x560")
self.window.canvas = Canvas(self.window, width=480, height=480, bg='peachpuff')
self.window.canvas.pack()
for num in range(1, 16):
if num == 1 or num == 15:
self.window.canvas.create_line(num * 30, 30,
num * 30, 450,
width=2)
else:
self.window.canvas.create_line(num * 30, 30,
num * 30, 450,
width=1)
for num in range(1, 16):
if num == 1 or num == 15:
self.window.canvas.create_line(30, num * 30,
450, num * 30,
width=2)
else:
self.window.canvas.create_line(30, num * 30,
450, num * 30,
width=1)
self.window.canvas.create_oval(8 * 30 - 2, 8 * 30 - 2, 8 * 30 + 2,
8 * 30 + 2, fill='black')
self.window.canvas.create_oval(5 * 30 - 2, 5 * 30 - 2, 5 * 30 + 2,
5 * 30 + 2, fill='black')
self.window.canvas.create_oval(5 * 30 - 2, 11 * 30 - 2, 5 * 30 + 2,
11 * 30 + 2, fill='black')
self.window.canvas.create_oval(11 * 30 - 2, 5 * 30 - 2, 11 * 30 + 2,
5 * 30 + 2, fill='black')
self.window.canvas.create_oval(11 * 30 - 2, 11 * 30 - 2, 11 * 30 + 2,
11 * 30 + 2, fill='black')
self.startBtn = Button(self.window, text='Start', bg="DeepSkyBlue", width=8, height=1, command=self.chessGo)
self.quitBtn = Button(self.window, text='Quit', bg="OrangeRed", width=8, height=1, command=self.window.quit)
self.withDrawBtn = Button(self.window, text='Withdraw', bg="cyan", width=8, height=1, command=self.withDraw)
self.startBtn.place(relx=0.2, rely=0.89)
self.quitBtn.place(relx=0.6, rely=0.89)
self.withDrawBtn.place(relx=0.4, rely=0.89)
self.game_print = StringVar()
self.labelInfo = Label(self.window, width=12, textvariable=self.game_print, font=("Arial", 10, "bold"),
justify="center")
self.labelInfo.place(relx=0.36, rely=0.95)

本文介绍了如何使用Python构建一个五子棋游戏,实现了人机对战功能。游戏允许玩家与计算机对弈,计算机通过评估棋局得分选择最佳落子点。算法基于棋形如连五、活四等打分,但简化了部分细节。此外,游戏还支持悔棋操作。代码中存在优化,仅遍历已有棋子周围空位以减少计算量。文章末尾提供了参考资料。
最低0.47元/天 解锁文章
2422

被折叠的 条评论
为什么被折叠?



