基于FPGA(basys3)的双人对战人机对战五子棋(vivado)课程设计项目

这篇具有很好参考价值的文章主要介绍了基于FPGA(basys3)的双人对战人机对战五子棋(vivado)课程设计项目。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

主界面显示与选择模式

双人对战

人机对战

胜利界面显示

部分源码


主界面显示与选择模式

VGA显示器显示图片,显示图片利用Block Memory Generator将图片像素点储存在RAM里面。

效果图:(防止侵权打了马赛克)

开发板五子棋,fpga开发

 通过开发板上的按键进行模式选择,模式确定

双人对战

双人对战就是采用简单的存数组的办法,这里五子棋的棋盘是采用13*13的大小,为了方便输赢判断也为了方便后续人机模式得分判断,这里数组采用了21*21大小的数组。

效果图:

开发板五子棋,fpga开发

 在数组中黑子数值为1,白子为2,空白为0,简单的原理就是黑子下完白子下,两个玩家共用一个键盘,每当一个玩家落子后就会进行输赢判断,对数组21*21中13*13的区域每一个点进行判断

如下图:(判断以这个点为中心的横竖斜方向是否都为1或者都为2)

开发板五子棋,fpga开发

人机对战

该程序采用了局部区域计算得分的方法来实现人机下棋操作

效果图:(采用了和双人对战一样的页面)

开发板五子棋,fpga开发

 当玩家(黑子)下完后人机根据当前棋局进行下棋(没有加延时所以是秒下),并且在最后一次下的白子中心还有一个黑点方便玩家知道人机下哪了。

我原本想用剪枝算法来制作人机的,但是我发现我写完程序后发现我的basys3开发板的LUT不能支持我的算法,还有会超出循环上限的问题(当然还有我自身算法能力不够),最后我重写了一个简单的算法,经过不断优化,最终实现了一个简单的人机对战。

具体算法:

我创建了一个新变量(二进制8位,因为开发板资源有限,所以越简单越好)用来存储得分信息,对每一个空白点进行分数计算,对以每一个空白点为中心的9*9区域进行了条件判断(这是我之前为什么存21*21的数组的原因,因为边界上的空白的话左边本来是没有数组的,进行判断就会出现错误,所以我直接省略了边界条件的判断,让它在一定意义上没有边界,但是这也会造成一定的问题,例如情况:边界,0,2,2,2,1,在这种情况下已经不可能连成五个子了,但是它还是会判断这是一个得分比较高的解)

得分计算:

开发板五子棋,fpga开发开发板五子棋,fpga开发

                                  图1                                                              图2

先对中间空白点赋值,先赋为2(白色),然后对其进行是否连成五子判断(如上图1所示),如果能连成五子就将其得分的最高位(位7)赋为1,对其进行是否连成四子判断(如上图2所示),如果能连成四子就将其得分(位5)赋为1,对其进行是否连成三子判断(如下图3所示),如果能连成三子就将其得分(位3)赋为1,对其进行是否连成二子判断(如下图4所示),如果能连成二子就将其得分(位1)赋为1,其他竖和斜方向也是一样的道理。

 开发板五子棋,fpga开发开发板五子棋,fpga开发

                               图3                                                             图4

 然后将这个空白点赋为1(黑色),然后对其进行是否连成五子判断,如果能连成五子就将其得分(位6)赋为1,对其进行是否连成四子判断,如果能连成四子就将其得分(位4)赋为1,对其进行是否连成三子判断,如果能连成三子就将其得分(位2)赋为1,对其进行是否连成二子判断,如果能连成二子就将其得分(位0)赋为1,其他竖和斜方向也是一样的道理。

还有一些特殊情况的判断赋值为了提高人机的博弈力,这里不说明了。

 最后找到那个得分最高的空白点就行了。

胜利界面显示

开发板五子棋,fpga开发

 最后也有选择按钮用来控制是当前模式的直接下一局还是返回主页面进行重新选择。

在VGA显示中还采用了取字模延时的方法显示字和一些有趣的动图

比如抽象的坤坤打球动图,豌豆射手和向日葵。

开发板五子棋,fpga开发开发板五子棋,fpga开发开发板五子棋,fpga开发文章来源地址https://www.toymoban.com/news/detail-801088.html

部分源码

score=0;
maxa=0;maxb=0;
for(a=0;a<13;a=a+1)
	begin
      for(b=0;b<13;b=b+1)
        begin
          if(if_have_2[a+4][b+4]==0)
             begin
                score1=0;
                if_have_2[a+4][b+4]=2;
                for(q=0;q<5;q=q+1)
                   begin
                     if(if_have_2[a+q][b+4]==2
                        &&if_have_2[a+1+q][b+4]==2
                        &&if_have_2[a+2+q][b+4]==2
                        &&if_have_2[a+3+q][b+4]==2
                        &&if_have_2[a+4+q][b+4]==2)
                          begin
                           score1[7]=1;
                          end
                     else
                         begin
                         end
                     if(if_have_2[a+4][b+q]==2
                        &&if_have_2[a+4][b+1+q]==2
                        &&if_have_2[a+4][b+2+q]==2
                        &&if_have_2[a+4][b+3+q]==2
                        &&if_have_2[a+4][b+4+q]==2)
                      begin
                        score1[7]=1;
                      end
                     else
                      begin
                      end
                     if(if_have_2[a+q][b+q]==2
                        &&if_have_2[a+1+q][b+1+q]==2
                        &&if_have_2[a+2+q][b+2+q]==2
                        &&if_have_2[a+3+q][b+3+q]==2
                        &&if_have_2[a+4+q][b+4+q]==2)
                      begin
                        score1[7]=1;
                      end
                     else
                      begin
                      end
                     if(if_have_2[a+4-q][b+4+q]==2
                        &&if_have_2[a+5-q][b+3+q]==2
                        &&if_have_2[a+6-q][b+2+q]==2
                        &&if_have_2[a+7-q][b+1+q]==2
                        &&if_have_2[a+8-q][b+q]==2)
                      begin
                        score1[7]=1;
                      end
                      else
                      begin
                      end
                      end
                    for(q=0;q<4;q=q+1)
                       begin
                        if(if_have_2[a+1+q][b+4]==2
                          &&if_have_2[a+2+q][b+4]==2
                          &&if_have_2[a+3+q][b+4]==2
                          &&if_have_2[a+4+q][b+4]==2)
                       begin
                          score1[5]=1;
                       end
                       else
                          begin
                          end
                       if(if_have_2[a+4][b+1+q]==2
                          &&if_have_2[a+4][b+2+q]==2
                          &&if_have_2[a+4][b+3+q]==2
                          &&if_have_2[a+4][b+4+q]==2)
                           begin
                          score1[5]=1;
                            end
                        else
                           begin
                           end
                         if(if_have_2[a+1+q][b+1+q]==2
                            &&if_have_2[a+2+q][b+2+q]==2
                            &&if_have_2[a+3+q][b+3+q]==2
                            &&if_have_2[a+4+q][b+4+q]==2)
                           begin
                            score1[5]=1;
                           end
                          else
                           begin
                           end
                         if(if_have_2[a+4-q][b+4+q]==2
                            &&if_have_2[a+5-q][b+3+q]==2
                            &&if_have_2[a+6-q][b+2+q]==2
                            &&if_have_2[a+7-q][b+1+q]==2)
                           begin
                           score1[5]=1;
                           end
                         else
                           begin
                           end
                         end
                      for(q=0;q<3;q=q+1)
                         begin
                           if(if_have_2[a+2+q][b+4]==2
                              &&if_have_2[a+3+q][b+4]==2
                              &&if_have_2[a+4+q][b+4]==2)
                           begin
                              score1[3]=1;
                           end
                          else
                              begin
                              end
                         if(if_have_2[a+4][b+2+q]==2
                            &&if_have_2[a+4][b+3+q]==2
                            &&if_have_2[a+4][b+4+q]==2)
                            begin
                             score1[3]=1;
                            end
                          else
                            begin
                            end
...

到了这里,关于基于FPGA(basys3)的双人对战人机对战五子棋(vivado)课程设计项目的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 微信小程序项目实例——双人五子棋

    项目代码见文字底部,点赞关注有惊喜 微信小程序项目实例——双人五子棋 双人五子棋是一款游戏小程序 两位选手可以在15x15的棋盘上 进行五子棋竞技 同时小程序设置了悔棋功能 点击落子 判断胜负 胜利效果 重新开始 悔棋 具体的介绍就到这里了 有兴趣的同学可以继续研

    2024年02月12日
    浏览(46)
  • 在线五子棋对战

    目录   数据管理模块(数据库设计) 前端界面模块 业务处理模块 会话管理模块网络通信模块(session,cookie) 在线管理模块 房间管理模块 用户匹配模块 项目扩展 数据库中有可能存在很多张表,每张表中管理的数据⼜有不同,要进⾏的数据操作也各不相同,因此我们可以为每⼀

    2024年02月14日
    浏览(46)
  • Unity 简单联网游戏(双人五子棋)开发(二)

    前言:之前我们尝试开发了一个两个比拼分数的不像游戏的超简单的弱数据联网游戏,主要是想让一些没开发过联网游戏的人了解一下最基础的流程;不过有人仍然有人私信我表示看不懂,所以这次我们再开发一个类似的游戏,为了这个项目更像是一个游戏,而不是不像游戏

    2024年02月08日
    浏览(42)
  • C++ 实现对战AI五子棋

     个人主页: 日刷百题 系列专栏 : 〖C/C++小游戏〗 〖Linux〗 〖数据结构〗   〖 C语言 〗 🌎 欢迎各位 → 点赞 👍+ 收藏 ⭐️+ 留言 📝  ​ ​      为了能够快速上手一门语言,我们往往在学习了基本语法后,采用写一个小项目的方式来加深理解语言的语法及运用,本文采

    2024年02月03日
    浏览(55)
  • 【项目设计】网络对战五子棋(上)

    想回家过年… 1.1 http1.0/1.1和websocket协议 1. a. http协议在Linux的学习部分我们就已经学习过了,当时http和https是一块学的,我们当时其实已经了解了http的大部分知识内容,比如http请求和响应的格式,各自的报头字段都有哪些,cookie和session机制,http1.1的长连接策略keep-alive,还有

    2024年02月07日
    浏览(50)
  • C++项目:在线五子棋对战网页版--匹配对战模块开发

    玩家匹配是根据自己的天梯分数进行匹配的,而服务器中将玩家天梯分数分为三个档次: 1. 普通:天梯分数小于2000分 2. 高手:天梯分数介于2000~3000分之间 3. 大神:天梯分数大于3000分 当玩家进行对战匹配时,服务器会根据档次,将玩家送到不同档次的匹配队列当中。共有

    2024年02月13日
    浏览(37)
  • C++项目:网络版本在线五子棋对战

    目录 1.项目介绍 2.开发环境 3.核心技术 4. 环境搭建 5.websocketpp 5.1原理解析 5.2报文格式  5.3websocketpp常用接口介绍 5.4websocket服务器 6.JsonCpp使用 6.1Json数据格式 6.2JsonCpp介绍 7.MySQL API 7.1MySQL API介绍 7.2MySQL API使用 7.3实现增删改查操作 8.项目结构设计 8.1项目模块划分说明 8.2业务处

    2024年02月10日
    浏览(51)
  • Linux项目实战——五子棋(单机人人对战版)

    Linux操作系统项目实战——五子棋 GIF: 目录            Linux操作系统项目——五子棋 一、问题导引: 二、实现要求: 三、五子棋原理: 1.落子数据信息保存载体: 2.落子思路: 3.判断“五子连珠” 四、项目实现步骤: Ⅰ.创建目录及文件: 1.在Linux环境下创建名为Gobang的文

    2024年02月03日
    浏览(53)
  • C++在线五子棋对战(网页版)项目:websocket协议

    目标:认识理解websocket协议、websocket切换过程和websocket协议格式。认识和学会使用websocketpp库常用接口。了解websocketpp库搭建服务器流程,认识和学会使用websocketpp库bin接口,最后使用websocketpp库搭建服务器。 平时我们在逛某宝,点击商品查看商品信息,从HTTP角度来看,就是客

    2024年02月13日
    浏览(52)
  • C++项目:在线五子棋对战网页版--数据模块开发

    数据管理模块,基于mysql数据库进行数据管理以及封装数据管理模块实现数据库访问。因此,在数据库中,我需要为每一张表创建出对应类,通过类实例化的对象来访问这张数据库表中的数 据,这样的话当我们要访问哪张表的时候,使⽤哪个类实例化的对象即可。 那么在五子

    2024年02月13日
    浏览(35)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包