Tic-Tac-Toe:井字游戏(井字棋)
本文介绍了井字游戏变种方案,可通过设置xsize、ysize指定棋盘大小,winnum指定连珠数。用两个深度学习模型分别扮演玩家和电脑自动对弈,借QLearning记录每步,依胜负判定方案好坏。代码展示了模型训练等过程,包括迭代、下棋、胜负判定及模型更新等。

Tic-Tac-Toe:井字游戏(井字棋)
是一种在3x3格子上进行的连珠游戏,和五子棋比较类似,由于棋盘一般不画边框,格线排成井字故得名。游戏需要的工具仅为纸和笔,然后由分别代表O和X的两个游戏者轮流在格子里留下标记(一般来说先手者为X)。由最先在任意一条直线上成功连接三个标记的一方获胜。
免费影视、动漫、音乐、游戏、小说资源长期稳定更新! 👉 点此立即查看 👈
方案介绍
该方案为井字游戏的变种,可以通过设置xsize、ysize来指定棋盘大小,通过设置winnum来指定连珠数,每局结束的判定在VictoryRule.py文件中写明,QLearning.py文件是Q表格,用于记录电脑和玩家的每一步。
方案设置了两个深度学习模型扮演玩家和电脑,双方自动下棋,根据最后获胜方来判别方案的好坏
代码实现
In [1]import numpy as npimport paddlefrom Model import Modelfrom VictoryRule import Rulefrom QLearning import QLearningfrom visualdl import LogWriterlog_writer = LogWriter(logdir="./log")Max_Epoch = 200 #最大迭代次数xsize = 3 #多少行ysize = 3 #多少列winnum = 3 #连珠数,多少个连珠则获胜learning_rate = 1e-3 #学习率decay_rate = 0.6 #每步衰减率player=1 #玩家是数字,非0,非负computer=2 #电脑的数字,非0,非负remain = [] #地图中剩余可下棋子位置rule = Rule(xsize,ysize,winnum) #规则Qchart = QLearning(xsize * ysize,decay_rate)#Q表格player_model = Model(xsize * ysize,xsize * ysize)player_model.train()computer_model = Model(xsize * ysize,xsize * ysize)computer_model.train()player_optimizer = paddle.optimizer.SGD(parameters=player_model.parameters(), learning_rate=learning_rate)computer_optimizer = paddle.optimizer.SGD(parameters=computer_model.parameters(), learning_rate=learning_rate)def restart(): "重启环境" Qchart.clear() remain.clear() rule.map = np.zeros(xsize * ysize,dtype=int) for i in range(xsize * ysize): remain.append(i)def modelupdate(player_loss,computer_loss): "模型更新" log_writer.add_scalar(tag="player/loss", step=epoch, value=player_loss.numpy()) log_writer.add_scalar(tag="computer/loss", step=epoch, value=computer_loss.numpy()) # 梯度更新 player_loss.backward() computer_loss.backward() player_optimizer.step() player_optimizer.clear_grad() computer_optimizer.step() computer_optimizer.clear_grad() paddle.save(player_model.state_dict(),'player_model') paddle.save(computer_model.state_dict(),'computer_model') for i in range(xsize * ysize): remain.append(i)for epoch in range(Max_Epoch): while True: player_predict = player_model(paddle.to_tensor(rule.map, dtype='float32',stop_gradient=False))#玩家方预测 for pred in np.argsort(-player_predict.numpy()): if pred in remain: remain.remove(pred) break rule.map[pred] = player Qchart.update(pred,'player') print('player down at {}'.format(pred)) overcode=rule.checkover(pred,player) if overcode == player: "获胜方为玩家" player_loss = paddle.nn.functional.mse_loss(player_predict, paddle.to_tensor(Qchart.playerstep, dtype='float32', stop_gradient=False)) computer_loss = paddle.nn.functional.mse_loss(computer_predict, paddle.to_tensor(-1 * Qchart.computerstep, dtype='float32', stop_gradient=False))#损失计算中,失败方的label为每步的负数 print("Player Victory!") print(rule.map.reshape(xsize,ysize)) #print("epoch:{}\tplayer loss:{}\tcomputer loss:{}".format(epoch,player_loss.numpy()[0],computer_loss.numpy()[0])) modelupdate(player_loss,computer_loss) restart() break elif overcode == 0: player_loss = paddle.nn.functional.mse_loss(player_predict, paddle.to_tensor(Qchart.playerstep, dtype='float32', stop_gradient=False)) computer_loss = paddle.nn.functional.mse_loss(computer_predict, paddle.to_tensor(Qchart.computerstep, dtype='float32', stop_gradient=False)) print("Draw!") print(rule.map.reshape(xsize,ysize)) #print("epoch:{}\tplayer loss:{}\tcomputer loss:{}".format(epoch,player_loss.numpy()[0],computer_loss.numpy()[0])) modelupdate(player_loss,computer_loss) restart() break computer_predict = computer_model(paddle.to_tensor(rule.map, dtype='float32',stop_gradient=False))#电脑方预测 for pred in np.argsort(-computer_predict.numpy()): if pred in remain: remain.remove(pred) break rule.map[pred] = computer Qchart.update(pred,'computer') print('computer down at {}'.format(pred)) overcode=rule.checkover(pred, computer) if overcode == computer: player_loss = paddle.nn.functional.mse_loss(player_predict, paddle.to_tensor(-1 * Qchart.playerstep, dtype='float32', stop_gradient=False)) computer_loss = paddle.nn.functional.mse_loss(computer_predict, paddle.to_tensor(Qchart.computerstep, dtype='float32', stop_gradient=False)) print("Computer Victory!") print(rule.map.reshape(xsize,ysize)) #print("epoch:{}\tplayer loss:{}\tcomputer loss:{}".format(epoch,player_loss.numpy()[0],computer_loss.numpy()[0])) modelupdate(player_loss,computer_loss) restart() break elif overcode == 0: player_loss = paddle.nn.functional.mse_loss(player_predict, paddle.to_tensor(Qchart.playerstep, dtype='float32', stop_gradient=False)) computer_loss = paddle.nn.functional.mse_loss(computer_predict, paddle.to_tensor(Qchart.computerstep, dtype='float32', stop_gradient=False)) print("Draw!") print(rule.map.reshape(xsize,ysize)) #print("epoch:{}\tplayer loss:{}\tcomputer loss:{}".format(epoch,player_loss.numpy()[0],computer_loss.numpy()[0])) modelupdate(player_loss,computer_loss) restart() break登录后复制 输出格式
player down at 7computer down at 3player down at 1computer down at 8player down at 6computer down at 2player down at 0computer down at 5Computer Victory![[1 1 2] [2 0 2] [1 1 2]]登录后复制
相关攻略
IT之家 4 月 6 日消息,荣耀全场景软件主理人 @荣耀席迎军 今日再度分享了 MagicBook 全新 AI UI。他透露,他的电脑在升级最新版本后,性能大幅度提升,而且可玩性更高。有网友询问了
微信朋友圈纯文字发布攻略:四种方法,总有一款适合你 有时候,就想在朋友圈发一段纯粹的文字,不配图,不挂链接,只是安静地说点心里话。但微信偏偏把发朋友圈的入口设计成那个相机图标,一点进去默认就是选照片,这让很多朋友犯了难:到底怎么才能发一条“干干净净”的纯文字动态呢? 别急,这事儿其实有好几种解法。我
快科技3月31日消息,据报道,持续走高数月的内存条价格,近期终于迎来回落,自上周起市场价更是出现断崖式下跌。但电脑整机、DIY硬件及游戏主机并未同步降价,反而延续涨价态势。有游戏本2月24日售价约8
作者 | 周一笑邮箱 | zhouyixiao@pingwest com联想发布了两款不太一样的电脑。它们没有屏幕,没有键盘,不是给人用的。YOGA AI Mini面向个人用户,Think AI
快科技3月31日消息,据Windows Latest报道,微软近日承认Windows 11的 "控制功能推出 "(CFR)机制确实让用户感到困扰,并承诺将赋予用户更多自主选择权,让他们能够自行决定是否启
热门专题
热门推荐
加密货币行业翘首以盼的监管里程碑,终于有了实质性进展。美国证券交易委员会(SEC)主席保罗·阿特金斯(Paul Atkins)近日证实,那份允许加密项目在早期获得注册豁免权的“安全港”框架提案,已经正式送抵白宫,进入了最终审查阶段。 在范德堡大学与区块链协会联合举办的数字资产峰会上,阿特金斯透露了这
微策略Strategy报告:第一季录得144 6亿美元浮亏 再斥资约3 3亿美元买进4871枚比特币 市场震荡的威力有多大?看看Strategy的最新季报就明白了。根据其最新向美国证管会(SEC)提交的8-K报告,受市场剧烈波动影响,这家公司所持的比特币在第一季度录得了一笔惊人的数字——144 6亿
稳定币巨头Tether的动向,向来是加密世界的风向标。这不,它向Web3基础设施的版图扩张,又迈出了关键一步。公司执行长Paolo Ardoino在社交平台X上透露,其工程团队正在全力“烹制”一个新项目——去中心化搜索引擎 “Hypersearch”。这个消息一出,立刻引发了行业的广泛猜想。 采用D
基地位于Coinbase旗下以太坊Layer2网络Base的Seamless Protocol,日前正式宣告了服务的终结。这个曾经吸引了超过20万用户的原生DeFi借贷协议,在运营不到三年后,终究没能跑赢时间。它主打的核心产品是Integrated Leverage Markets(ILMs)——一
PAAL代币揭秘:深度解析Web3社区治理的核心钥匙 在去中心化自治组织的浪潮中,谁真正掌握了项目的话语权?PAAL代币提供了一套系统化的答案。它不仅是生态内流转的价值媒介,更是开启链上治理大门的核心凭证。通过持有并质押PAAL代币,用户能够对协议升级、资金分配乃至战略方向等关键事务投出决定性的一票





