ege图形库C语言五子棋,课内资源 – 基于ege图形库实现的五子棋小游戏

  • Post author:
  • Post category:其他


1、问题要求及任务描述

1.1 问题要求

利用ege库实现一个五子棋游戏。

1.2 任务描述能实现人人对战

能实现人机对战

2、解决问题的主要思路和方法

2.1 函数实现// 主菜单的绘制

CreateMenus();

// 人机棋盘的绘制

CreatePCBoard();

// 人人对战棋盘的绘制

CreatePVPboard();

// 更新当前人人棋盘

PVPshow();

// 更新当前人机棋盘

PVEshow();

// 人人对战算法

pvp();

// 人机对战随机算法

pcposition();

// 人机对战智能算法

AIprotect();

// 连棋计算函数

caculate();

// 棋局评估函数

naiveline();

// 人工智障

pveeasy();

// 初级人工智能

pve();

// 副菜单

createPC2();

// 游戏选择

choose();

// 退回主菜单

exitt();

2.2 实现思路

在ege图形库中有各种功能齐全的绘图函数以及与电脑外设(鼠标和键盘等)有关联的函数,利用这些函数可以实现五子棋基本的操作。

主菜单的制作:利用了setfillbkcolor设置背景颜色,利用各种图形绘制函数绘制边框,bar()函数可以用来绘制矩形,再利用setfillcolor来填充背景颜色。在主菜单有两个椭圆形状的按钮,一个是人人对战,一个是人机对战。

棋盘的绘制:在棋盘的绘制过程中,我考虑了一些合理化操作,每下一颗棋就显示当前双方的棋数以及总的棋数,一方获胜则无法再进行下棋,一局结束后则可以退回到主菜单。棋盘的具体绘制是利用ege库中的line()函数,该函数能够在两个坐标点之间连接一条线段,利用两个for循环,将棋盘两个连续点的距离设置为30,即可画出棋盘。在界面中添加文字以及输出数字使用xprintf函数,在确定的坐标用setfront()函数设置的字号输出即可。

更新当前棋盘:实现下棋是通过鼠标点击来实现的,玩家点击棋盘格某点所在的区域,每点击一次,棋盘上面的计数器就会记录当前玩家所走的步数以及总共的棋数,同时棋盘所点击区域就会出现棋子。在这个过程中为了使玩家的棋子能够准确的下载交点处,我利用了一个取余运算,假设鼠标点击的点的坐标为(mx,my);那么程序会将其转化为(mx-mx%30,my-my%30)(因为两个交点之间的距离为30),这样就能够让棋子下到准确的位置,不过为了更好的体验,出于公式的局限性,玩家最好通过点击落子点的右下方区域进行下棋。在棋子的构思上,我第一次使用的circle(画圆函数),然后发现这个函数只画了一个圆边,后来想了想通过画椭圆就行了,椭圆画的是圆面,只需要把长短轴改成一样的就成为圆了。如何做到每点击一次下一颗棋子呢?由于在处理人机对战和人人对战的时候我用的算法不同,这里先介绍人人对战,使用两个二维数组visb和visw来记录坐标点(x,y)下的是黑棋还是白棋,初始化step=1;先下白棋,每下一次,step++,判断step是奇数还是偶数,奇数就让visw[x-x%30][y-y%30]=1,反之就用visb,没点击一次,用cleardevice()清除屏幕一次。然后重新画图。在每下完一颗棋之后,都会进行胜负判断,若胜负已分,则break,无法再进行下棋。

胜负判定算法:这个算法较为简单,直接暴力搜索,针对某点的八个方向判断有没有连续5颗的同色棋子。

人工智障算法:人人对战的算法只需要更新棋盘以及判断胜负即可,接下来我们考虑人机对战,最开始的人机对战,机器毫无思考能力,完全是通过srand函数生成的时间种子产生的随机数来确定坐标的。即x和y=rand()%421+60(棋盘的范围为60=

初步人工智能算法:针对于电脑要自己学会下棋,则需要一套评估标准,即分析该位置的价值,针对于不同的棋形,都有各自的评估得分。对于每个点的评估,从八个方向进行遍历,利用一个四维数组qiju[i][j][k][p],i,j代表坐标,k代表方向,p代表玩家,0是黑棋,1是白棋。对于八个方向,其实在统计的时候,应当按照4个方向,因为两个对立的方向其实是在一条直线上,因此我们应该通过qiju[i][j][p][0]+qiju[i][j][k+4][p]的棋子个数来计分。每次计完分之后,进行全局评估,电脑会选择评分最高的点来下棋,这就实现了电脑的下棋算法,经过测试,虽然电脑的胜率不太高(<50%),但基本上懂得了获胜原理。

3、测试或调试

3.1 主菜单

dfee5601e0cce346a440768ccc0dd32d.png

3.2 副菜单

874462fb19b8dd6ba4493f41632e053a.png

3.3 人人对战

ecfb414e456c49083ec44fd80a182ff0.png

3.4 人工智障

5b36f91dbfa26b6655730819fb8bbe7f.png

3.5 初级人工智能

23626bf5cf6839259b75741e764c035e.png