首页 游戏 软件 资讯 排行榜 专题
首页
AI
Tic-Tac-Toe:井字游戏(井字棋)

Tic-Tac-Toe:井字游戏(井字棋)

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

tic-tac-toe:井字游戏(井字棋) - 游乐网

Tic-Tac-Toe:井字游戏(井字棋)

是一种在3x3格子上进行的连珠游戏,和五子棋比较类似,由于棋盘一般不画边框,格线排成井字故得名。游戏需要的工具仅为纸和笔,然后由分别代表O和X的两个游戏者轮流在格子里留下标记(一般来说先手者为X)。由最先在任意一条直线上成功连接三个标记的一方获胜。

免费影视、动漫、音乐、游戏、小说资源长期稳定更新! 👉 点此立即查看 👈

Tic-Tac-Toe:井字游戏(井字棋) - 游乐网    

方案介绍

该方案为井字游戏的变种,可以通过设置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]]
登录后复制    
来源:https://www.php.cn/faq/1425626.html
免责声明: 游乐网为非赢利性网站,所展示的游戏/软件/文章内容均来自于互联网或第三方用户上传分享,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系youleyoucom@outlook.com。

相关攻略

荣耀MagicBook全新AI UI实机再曝,Dock栏外观支持自定义
礼仪与书信
荣耀MagicBook全新AI UI实机再曝,Dock栏外观支持自定义

IT之家 4 月 6 日消息,荣耀全场景软件主理人 @荣耀席迎军 今日再度分享了 MagicBook 全新 AI UI。他透露,他的电脑在升级最新版本后,性能大幅度提升,而且可玩性更高。有网友询问了

热心网友
04.07
微信朋友圈怎么发纯文字 不带图片的文字动态发布技巧
手机教程
微信朋友圈怎么发纯文字 不带图片的文字动态发布技巧

微信朋友圈纯文字发布攻略:四种方法,总有一款适合你 有时候,就想在朋友圈发一段纯粹的文字,不配图,不挂链接,只是安静地说点心里话。但微信偏偏把发朋友圈的入口设计成那个相机图标,一点进去默认就是选照片,这让很多朋友犯了难:到底怎么才能发一条“干干净净”的纯文字动态呢? 别急,这事儿其实有好几种解法。我

热心网友
04.02
内存价格暴跌!游戏主机顺势涨价,部分机型单月涨超5000元
礼仪与书信
内存价格暴跌!游戏主机顺势涨价,部分机型单月涨超5000元

快科技3月31日消息,据报道,持续走高数月的内存条价格,近期终于迎来回落,自上周起市场价更是出现断崖式下跌。但电脑整机、DIY硬件及游戏主机并未同步降价,反而延续涨价态势。有游戏本2月24日售价约8

热心网友
03.31
当AI需要独立运算:自备电脑引爆万亿市场
科技数码
当AI需要独立运算:自备电脑引爆万亿市场

作者 | 周一笑邮箱 | zhouyixiao@pingwest com联想发布了两款不太一样的电脑。它们没有屏幕,没有键盘,不是给人用的。YOGA AI Mini面向个人用户,Think AI

热心网友
03.31
微软承认Win11推送问题,承诺半年后将改进更新机制
科技数码
微软承认Win11推送问题,承诺半年后将改进更新机制

快科技3月31日消息,据Windows Latest报道,微软近日承认Windows 11的 "控制功能推出 "(CFR)机制确实让用户感到困扰,并承诺将赋予用户更多自主选择权,让他们能够自行决定是否启

热心网友
03.31

最新APP

宝宝过生日
宝宝过生日
应用辅助 04-07
台球世界
台球世界
体育竞技 04-07
解绳子
解绳子
休闲益智 04-07
骑兵冲突
骑兵冲突
棋牌策略 04-07
三国真龙传
三国真龙传
角色扮演 04-07

热门推荐

美国SEC主席Paul Atkins证实:加密货币安全港提案已送交白宫审查
web3.0
美国SEC主席Paul Atkins证实:加密货币安全港提案已送交白宫审查

加密货币行业翘首以盼的监管里程碑,终于有了实质性进展。美国证券交易委员会(SEC)主席保罗·阿特金斯(Paul Atkins)近日证实,那份允许加密项目在早期获得注册豁免权的“安全港”框架提案,已经正式送抵白宫,进入了最终审查阶段。 在范德堡大学与区块链协会联合举办的数字资产峰会上,阿特金斯透露了这

热心网友
04.08
微策略Strategy报告:第一季录得144.6亿美元浮亏 再斥资约3.3亿美元买进4871枚比特币
web3.0
微策略Strategy报告:第一季录得144.6亿美元浮亏 再斥资约3.3亿美元买进4871枚比特币

微策略Strategy报告:第一季录得144 6亿美元浮亏 再斥资约3 3亿美元买进4871枚比特币 市场震荡的威力有多大?看看Strategy的最新季报就明白了。根据其最新向美国证管会(SEC)提交的8-K报告,受市场剧烈波动影响,这家公司所持的比特币在第一季度录得了一笔惊人的数字——144 6亿

热心网友
04.08
稳定币发行商Tether再扩Web3版图!Paolo Ardoino:正开发去中心化搜索引擎Hypersearch
web3.0
稳定币发行商Tether再扩Web3版图!Paolo Ardoino:正开发去中心化搜索引擎Hypersearch

稳定币巨头Tether的动向,向来是加密世界的风向标。这不,它向Web3基础设施的版图扩张,又迈出了关键一步。公司执行长Paolo Ardoino在社交平台X上透露,其工程团队正在全力“烹制”一个新项目——去中心化搜索引擎 “Hypersearch”。这个消息一出,立刻引发了行业的广泛猜想。 采用D

热心网友
04.08
Base链首个原生DeFi借贷协议Seamless Protocol倒闭 将于2026年6月30日下线
web3.0
Base链首个原生DeFi借贷协议Seamless Protocol倒闭 将于2026年6月30日下线

基地位于Coinbase旗下以太坊Layer2网络Base的Seamless Protocol,日前正式宣告了服务的终结。这个曾经吸引了超过20万用户的原生DeFi借贷协议,在运营不到三年后,终究没能跑赢时间。它主打的核心产品是Integrated Leverage Markets(ILMs)——一

热心网友
04.08
PAAL代币如何参与治理?社区投票能决定哪些事项?
web3.0
PAAL代币如何参与治理?社区投票能决定哪些事项?

PAAL代币揭秘:深度解析Web3社区治理的核心钥匙 在去中心化自治组织的浪潮中,谁真正掌握了项目的话语权?PAAL代币提供了一套系统化的答案。它不仅是生态内流转的价值媒介,更是开启链上治理大门的核心凭证。通过持有并质押PAAL代币,用户能够对协议升级、资金分配乃至战略方向等关键事务投出决定性的一票

热心网友
04.08