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

文章介绍了如何在VGA显示器上实现五子棋游戏,包括主界面、双人对战和人机对战模式。在人机对战中,由于资源限制,作者采用了一种简单的得分算法来决定电脑的走棋策略。此外,文章还提到了胜利界面的显示和源代码的部分片段。
摘要由CSDN通过智能技术生成

目录

主界面显示与选择模式

双人对战

人机对战

胜利界面显示

部分源码


主界面显示与选择模式

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

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

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

双人对战

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

效果图:

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

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

人机对战

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

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

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

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

具体算法:

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

得分计算:

                                  图1                                                              图2

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

 

                               图3                                                             图4

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

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

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

胜利界面显示

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

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

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

部分源码

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
...

### 回答1: Vivado和Matlab中的FFT(快速傅里叶变换)结果可以是相同的,也可以是不同的。这取决于输入数据的形式和FFT算法的实现方式。 在Vivado中,FFT通常以硬件电路的形式实现。它使用数字信号处理(DSP)模块来进行高速计算。Vivado中的FFT结果可能与Matlab中的FFT结果相同,这取决于输入信号的位宽、量化级别和有关的处理步骤。 在Matlab中,FFT通常以数值计算库的形式实现。它使用快速算法来执行离散傅里叶变换。Matlab中的FFT结果可能与Vivado中的FFT结果相同,但由于数值计算的误差累积,两者可能会略有不同。 为了获得相同的FFT结果,需要考虑以下几个方面: 1. 数据格式:确保Vivado和Matlab使用相同的数据格式,如整数或浮点数,以及位宽。 2. 块大小:FFT算法通常在输入数据块上操作。确保Vivado和Matlab使用相同的块大小。 3. 量化级别:如果信号是模拟信号并经过采样和量化,确保Vivado和Matlab使用相同的量化级别,以减小误差。 总之,要获得Vivado和Matlab中相同的FFT结果,需要确保两者在数据格式、块大小和量化级别等方面的一致性。此外,还应注意到由于不同算法和实现方式的差异,完全相同的结果可能是很难实现的。 ### 回答2: vivado和matlab fft都是用于进行快速傅里叶变换的工具,但它们的结果可能略有不同。 首先,vivado是一种用于硬件设计和开发的工具,其主要用途是通过FPGA实现数字信号处理功能。在vivado中,FFT通常通过使用专门设计的硬件模块来实现,并且可以高效地处理大量的数据。由于使用了专门的硬件,vivado的FFT结果可能会更加精确和稳定。此外,vivado还可以利用FPGA的并行处理能力,可以同时处理多个数据流,从而进一步提高性能。 另一方面,matlab fft是基于软件的FFT实现,主要用于进行信号处理和数据分析。由于采用了软件实现,matlab fft的运算速度可能会相对较慢。此外,matlab fft的结果可能会受到计算机性能、数据类型和算法等多种因素的影响,可能会存在一些舍入误差。 综上所述,vivado和matlab fft都可以进行快速傅里叶变换,但它们的实现方式、性能和结果可能会有所不同。具体选择哪种工具取决于应用场景和需求。如果需要进行高性能的信号处理,尤其是在FPGA上实现时,则vivado可能更适合;如果只是进行普通的数据分析和算法验证,则matlab fft足够满足需求。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值