C语言图形五子棋课程设计报告docx文档格式.docx
- 文档编号:21824975
- 上传时间:2023-02-01
- 格式:DOCX
- 页数:32
- 大小:240.08KB
C语言图形五子棋课程设计报告docx文档格式.docx
《C语言图形五子棋课程设计报告docx文档格式.docx》由会员分享,可在线阅读,更多相关《C语言图形五子棋课程设计报告docx文档格式.docx(32页珍藏版)》请在冰豆网上搜索。
游戏结束时,有玩家选择是否开始新游戏。
音效提供模块:
玩家每落一子,系统提供音效一声,增加下棋的趣味性。
胜负判断模块:
实时监测棋盘上棋子,一旦某一色棋子出现五子连线,终止游戏程序,并着色连成一线的五子,棋盘下方弹出该色玩家胜出信息。
1.2.2程序流程设计
根据程序需求分析结果,可以得出程序的总体结构图如图1,程序总体流程图如图2。
五子棋
图1五子棋总体结构图
Y
图2程序总体流程图
第2章:
概要设计
2.1各类头文件和全局变量
#include<
stdio.h>
#include<
windows.h>
stdlib.h>
conio.h>
//使用getch()函数
intstartchoice;
//
intwinner;
intplayer;
Q[200][200]={0};
//Q数组记录旗子
charbutton;
//读入键盘输入的指令,如→
2.2画面显示模块
画面显示模块由欢迎界面,游戏棋盘界面,确认是否退出对话框界面,以及感谢使用界面组成。
画面显示模块函数如下:
voidWelcome()//欢迎界面
voidDraw()//绘画游戏棋盘界面
voidClean()//清除—→运动的轨迹
voidmenu_choose(charpress)//选择是否退出游戏对话框
voidPutDown()//显示落子函数
voidgoto_xy(intx,inty)//光标移动函数
画面效果图如图3,4,5,6。
图3欢迎界面图
图4主菜单界面图
图5游戏界面图
图6确认退出对话框
第3章:
详细设计
3.1玩家操作模块
棋子的移动与落子有键盘上按键控制,本程序选取甲乙双方按键都为W、S、↑、↓、←、→和回车键,“b”,“ESC”,分别代表上移、下移、左移、右移光标和落子,悔棋,退出。
在光标移动的过程中,光标按照玩家按键移动;
在玩家按下落子按键后,程序自动调用棋子显示子程序和判断胜负子程序。
当前玩家下棋后,另一位玩家下棋前,当前玩家可以悔棋。
甲乙的落子后,程序会为落子处的数组元素赋一个特定值(玩家甲的棋子赋为1,玩家乙的棋子赋为2),用于判定胜负和悔棋。
玩家操作模块主要由以下函数构成:
voidRecord()//记录棋子的情况
voidgo_back(intx1,inty1)//悔棋函数
voidPlay(charch)//读取键盘的操作移动光标下棋和悔棋操作
3.2音效提供模块
为了提高游戏的趣味性,我们为本游戏提供了简单系统音效。
程序语句很简单printf("
\a"
);
//'
\a'
表示蜂鸣声
3.3胜负判断模块
胜负判断模块是程序的关键,该模块的设计直接关系到程序的运行速率和运行结果的正确与否。
本函数根据每次落子的位置,分别向上、下、左、右、左上、左下、右上、右下八个方向判断是否有相同颜色的棋子连成五子,如果成立,游戏就结束,并显示提示信息,否则继续落子。
以下简析本程序流程:
由获胜条件可以知,通过判断行、列、斜边、反斜边方向上是否有连续的5个子即可得出是否获胜结果。
在游戏开始时,将棋盘初始化,即将棋盘抽象为一个18*18的数组,数组中每个元素数值设为0。
甲方落子时,将数组内相应坐标处元素赋值为2;
乙方落子时,将数组内相应坐标处元素赋值为1。
通过循环扫描棋盘数组,经扫描后,如发现在行、列、斜边、反斜边方向上有五个连续的2,甲方获胜;
如发现在行、列、斜边、反斜边方向上有五个连续的1,乙方获胜。
胜负判断模块主要由一个函数构成:
intJudge()//判断胜负函数
第4章:
调试分析
4.1图形模块
1.在图形模块中,因为是第一次使用,所以刚开始时对于棋盘创建的位置把握有些欠缺。
解决方案:
参考书本以及google,找出最合适的位置坐标。
2.在构建棋子时候,发现C语言中似乎对颜色的处理有些错误,当棋谱线的颜色为白色时,无法构建黑色棋子,只能画出白色棋子。
用白圈区别于白球,类似白子和黑子。
4.2玩家操作模块
1.在玩家操作模块中,出现的最大问题之一就是棋盘已经有棋子的地方还可以覆盖另一个棋子。
通过在PutDown()函数中添加if条件语句,判定如果所在位置对应的数组值不等于0时,不能落子。
2.另一个问题就是之前提到的,操作定位框的时候会将定位框移到棋盘之外造成溢出。
通过if语句判定,如果操作框超出范围则移动到对应相反位置,例如移动棋盘最上端,若继续向上移动,则移动至棋盘最下端对应位置。
3.还有一个就是悔棋模块中,通过将现有棋子覆盖与棋盘底色相同的颜色来覆盖后,棋谱线条部分也会被覆盖。
在go_back();
即悔棋函数。
用棋谱线来覆盖棋子(例如:
┌└├等)。
4.3胜负判断模块
1.在胜负判断中一直没能想到好的办法来数据化判断哪方玩家获得胜利。
通过参考书籍并加以优化,得出将棋谱做成数组,定义甲方落下为1,乙方落下为2,初始为0,这样即不会造成冲突,也很好的解决了判断问题。
2.另一个问题在于一直不能优化代码做到不每次都扫描整个棋盘来判断胜负。
至今尚未解决,尝试过局部扫描,但失败了。
第5章:
用户手册
1.进入演示程序后,即显示欢迎界面,几秒后,按任何键进入菜单界面,再选择人人对战可以进入主界面开始游戏或者选择退出键。
2.棋子的移动与落子有键盘上按键控制,本程序选取甲乙方都为↑、↓、←、→和回车键,分别代表上移、下移、左移、右移光标和落子。
3.在当前玩家按下落子按键后,程序自动调用棋子显示子程序和判断胜负子程序。
悔棋提示在棋盘右下方,为按键“b”(即backspace)。
4.游戏中Esc键可以直接退出游戏。
5.游戏过程中,如果玩家1或者玩家2有一方获得胜利后,程序自动将提示哪一方获得了胜利,并可以选择是否继续新游戏。
6.游戏结束且玩家选择不再继续后,显示谢谢使用界面,再按任意键退出游戏。
第6章:
小组分工
组长:
罗福莉
组员:
赵帅帅,何虹达
具体分工:
组员
任务分工
报告书写程序调试展示成果
赵帅帅
胜负判断设计主函数设计
何虹达
界面制作程序调试
第7章:
结论与心得
通过对各子程序的设计与优化,本程序完成了五子棋软件的主体的设计与制作,基本达到了使用五子棋软件的核心要求。
然而程序还有一些不足之处,首先,程序的界面过于简陋,其次,判断胜后没有显示连成一线的棋子是哪些,用户使用不便。
最后就是程序法实现人机对战,缺乏可玩性。
第8章:
源程序代码
//五子棋小游戏
intstartchoice,winner,player,Q[200][200]={0};
structPoint//点坐标的结构体
{
intx,y;
}point,game_xy;
structPiece//棋子的坐标记录
structPointcoord;
structPiece*fore;
};
structPiece*head,*p,*ptr,*ptr1;
COORDc;
c.X=2*x;
c.Y=y;
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),c);
}
voidInit()//初始化函数,将记录棋子的数组初始化
for(inti=0;
i<
200;
i++)
for(intj=0;
j<
j++)
Q[i][j]=0;
startchoice=0;
player=1;
p=(structPiece*)malloc(sizeof(structPiece));
head=p;
system("
color2F"
//#include<
2背景绿色F字体亮白色
goto_xy(10,3);
printf("
—→"
goto_xy(17,1);
主菜单"
goto_xy(13,3);
***人人对战***"
goto_xy(13,4);
***退出***"
point.x=12;
point.y=3;
goto_xy(0,0);
voidShowWho()//显示轮到哪一方下棋
goto_xy(17,22);
if(player==0)
轮到甲方落子"
else
轮到乙方落子"
goto_xy(point.x,point.y);
voidDraw()//绘画游戏界面
game_xy.x=10;
game_xy.y=3;
cls"
color3F"
//3湖蓝色F亮白色
goto_xy(15,1);
欢迎playour五子棋!
"
/*goto_xy(29,22);
重新开始r"
*/
goto_xy(1,22);
悔棋b"
goto_xy(1,23);
退出ESC"
constinti=8;
//const定义的数据不可以被改变而且修改数据比较方便
constintj=19;
constintk=3;
goto_xy(game_xy.x-i,game_xy.y+k);
//输出甲方的下棋方法
甲方:
●"
goto_xy(game_xy.x-i,game_xy.y+k+2);
移动:
上↑"
goto_xy(game_xy.x-i,game_xy.y+k+4);
下↓"
goto_xy(game_xy.x-i,game_xy.y+k+6);
左←"
goto_xy(game_xy.x-i,game_xy.y+k+8);
右→"
goto_xy(game_xy.x-i,game_xy.y+k+10);
落子:
Enter"
goto_xy(game_xy.x+j,game_xy.y+k);
//输出乙方的下棋方法
乙方:
○"
goto_xy(game_xy.x+j,game_xy.y+k+2);
goto_xy(game_xy.x+j,game_xy.y+k+4);
goto_xy(game_xy.x+j,game_xy.y+k+6);
goto_xy(game_xy.x+j,game_xy.y+k+8);
goto_xy(game_xy.x+j,game_xy.y+k+10);
for(intk1=0;
k1<
k1++)//初始化棋子记录,在第二局时有明确的作用
for(intk2=0;
k2<
k2++)
Q[k1][k2]=0;
18;
i++)//画棋盘
{
if(i==0)//画第一行
goto_xy(10,i+3);
┌┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┐"
}
if(i!
=0&
&
i!
=17)//画出中间16行
├┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┼┤"
if(i==17)//画最后一行
└┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┘"
point.x=19;
point.y=12;
goto_xy(19,12);
voidClean()//清除—→运动的轨迹
"
goto_xy(24,3);
goto_xy(10,4);
goto_xy(24,4);
voidmenu_choose(charpress)//选择游戏还是退出
if(press==72)//↑的ASCLL码
if(point.y==3)
point.y=4;
Clean();
goto_xy(10,point.y);
if(press==80)//↓的ASCLL码
if(point.y==4)
point.y=3;
point.y=4;
if(press==13)//13:
回车键的ASCLL码
startchoice=point.y-2;
//startchoice为1或2
voidgo_back(intx1,inty1)//悔棋函数
goto_xy(x1,y1);
if(x1==10)
if(y1==3)
┌"
elseif(y1==20)
└"
├"
elseif(x1==27)
┐"
┘"
┤"
┬"
┴"
┼"
Q[point.x][point.y]=0;
//在数组中将弹出的棋子对应的数据设为0
p->
coord.x=point.x;
coord.y=point.y;
ptr=p;
fore=ptr;
ShowWho();
Q[point.x][point.y]=player+1;
if(player)
player=0;
return;
if(Q[point.x][point.y]==0)//先判断该位置是否有棋子
●"
Record();
else
○"
voidPlay(charch)//键盘的操作移动光标下棋和悔棋操作
if(ch==72)//↑的ASCLL码光标上移
if(point.y<
=3)
point.y=20;
point.y--;
if(ch==75)//←的ASCLL码光标左移
if(point.x<
=10)
point.x=27;
point.x--;
if(ch==77)//→的ASCLL码光标右移
if(point.x>
=27)
point.x=10;
point.x++;
if(ch==80)//↓的ASCLL码光标下移
if(point.y>
=20)
point.y++;
if(ch==13)//回车键的ASCLL码下棋
PutDown();
if(button=='
b'
||button=='
B'
)//悔棋的操作
ptr1=p;
if(p!
=head)
p=p->
fore;
free(ptr1);
point.x=p->
coord.x;
point.y=p->
coord.y;
go_back(point.x,point.y);
intJudge()
intcount=0;
intpp=player==0?
2:
1;
//三目运算
for(intc=0;
c<
c++)
for(intr=0;
r<
r++)
if(Q[r][c]!
=pp)
continue;
//检查列
intrr=r;
intcc=c;
while(--cc>
=3&
Q[rr][cc]==pp)
count++;
cc=c;
while(++cc<
23&
if(count>
=4)
returnpp;
//检查行
count=0;
while(--rr>
=10&
rr=r;
while(++rr<
30&
//检查反斜边
cc--;
rr--;
while((cc>
=3||rr>
=10)&
count++;
cc++;
rr++;
while((cc<
23||rr<
30)&
if(count+1>
=5)
//检查正斜边
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言 图形 五子棋 课程设计 报告 docx