当前位置:首页 >> 理学 >>

c语言五子棋课程设计[1]


枣 庄 学 院 信息科学与工程学院 课程设计任务书

题目:

C 语言程序设计:五子棋

学 姓 专 课

号: 名: 业: 程: 马怀志

201112130335 张 培 培 软 件 外 包 C 语言程序设计 职称: 助 教

指导教师:

完成时间: 2012 年 5 月----2012 年 5 月

枣庄学院信息科学与工程学院制

枣庄学院 C 语言课程设计任务书 10 本三 软件外包专业 张培培


课程设计的任务和具体要求
1.目的:





课程设计任务书及成绩评定

1)复习、巩固 C 语言的基础知识,进一步加深对 C 语言的理解和掌握; 2)课程设计为学生提供了一个既动手又动脑,独立实践的机会,将课本上的理论知识和实际 有机的结合起来,锻炼学生的分析解决实际问题的能力。提高学生适应实际,实践编程的能 力; 3)培养学生在项目开发中团队合作精神、创新意识及能力。 2.要求: 1) 、对系统进行功能模块分析、控制模块分析正确,符合课题要求,实现相应功能;可以加 以其他功能或修饰,使程序更加完善、合理; 2) 、系统设计要实用,编程简练,可用,功能全面 3) 、说明书、流程图要清楚 4) 、记录设计情况(备查,也为编写设计说明书作好准备) ; 5) 、要求采用模块化程序设计方法,及锯齿型书写格式,要求上机调试通过和按设计报告格 式。

指导教师签字:

日期:

1

枣庄学院 C 语言课程设计任务书 10 本三 软件外包专业 张培培
指导教师评语

成绩:

指导教师签字:

日期:

课程设计所需软件、硬件等

软件:Microsoft Visual C++6.0 操作系统:WIN xp Rom:256 Cpu:1.6Ghz

课程设计进度计划
起至日期 工作内容 备注

2

枣庄学院 C 语言课程设计任务书 10 本三 软件外包专业 张培培

5 月 25 日 5 月 26 日 5 月 27 日

进行程序设计需求分析 分析程序代码 撰写课程设计任务书

参考文献、资料索引 序号 文献、资料名称 编著者 出版单位

[1] 贾宗璞、 许合利, 语言程序设计, C 江苏: 中国矿业大学出版社, 2007.6 [2] 谭浩强,C 程序设计(第二版),北京:清华大学出版社,2001.1 [3] http://www.baidu.com

3

枣庄学院 C 语言课程设计任务书 10 本三 软件外包专业 张培培





摘 要 .........................................................................................................................1 第 1 章:需求分析 ...................................................................................................1 1.1 五子棋背景 ....................................................................................................1 1.2 程序设计........................................................................................................1 1.2.1 程序需求分析............................................................................................1 1.2.2 程序流程设计 ............................................................................................2 第 2 章:概要设计 ...................................................................................................3 2.1.1 各类头文件,变量及宏定义....................................................................3 2.1.2 全局变量....................................................................................................3 2.2 图形模块........................................................................................................3 2.3 玩家操作模块................................................................................................4 2.4 胜负判断模块................................................................................................4 2.5 玩家计分模块 ................................................................................................5 2.6 各模块之间调用关系如下............................................................................5 第 3 章:详细设计 ...................................................................................................6 3.1 图形模块........................................................................................................6 3.2 玩家操作模块..............................................................................................10 3.3 胜负判断模块 ..............................................................................................12 3.4 文件操作模块..............................................................................................15 3.5 函数大致调用关系图 ..................................................................................18 第 4 章:调试分析 .................................................................................................19 4.1 4.2 4.3 4.4 图形模块......................................................................................................19 玩家操作模块..............................................................................................20 胜负判断模块..............................................................................................20 玩家计分模块..............................................................................................20

第 5 章:用户手册 .................................................................................................21 第 6 章:测试分析 .................................................................................................21 结 论 .......................................................................................................................22

4

枣庄学院 C 语言课程设计任务书 10 本三 软件外包专业 张培培

摘 要
五子棋是一种两人对弈的纯策略型棋类游戏,应用 C 语言编写程序可以 在计算机上实现二人对弈五子棋功能。二人对弈五子棋程序由图像生成、光标 移动与落子、 判断胜负和系统帮助等子程序构成; 程序中应用了结构体、 数组、 全局变量、 按键处理和图形编程等元素和语句。 程序通过棋盘和棋子图像生成、 二人移子与落子和判断胜负等功能的实现,在计算机上实现了二人五子棋对 弈。

第 1 章:需求分析
1.1 五子棋背景
传统五子棋的棋具与围棋相同,棋子分为黑白两色,棋盘为 15×15,棋 子放置于棋盘线交叉点上。两人对局,各执一色,轮流下一子,先将横、竖或 斜线的 5 个或 5 个以上同色棋子连成不间断的一排者为胜。 因为传统五子棋在落子后不能移动或拿掉, 所以也可以用纸和笔来进行游 戏。

1.2 程序设计
本程序设计为人与人对弈,一方执黑棋,一方执白棋,轮流走棋,每方都 试图在游戏结束前让自己的棋子五子相连,首先实现五子相连的一方获胜。程 序执行过程中,要求棋盘、棋子时时可见,并且人可以通过按键盘按键移动光 标,摆放棋子。

1.2.1 程序需求分析
根据功能需求,将程序分为图形显示、玩家控制、胜负判断和玩家计分四 个模块,以下分析各模块的需求。 图形显示模块:程序开始运行时,给出欢迎及帮助界面;游戏开始后要求 生成 19×19 的棋盘图像,并在棋盘上方提示当前落子方棋子颜色,游戏进行 过程中,要求实时显示棋盘上已落下的棋子;分出胜负后,要求给出游戏结束 画面。 玩家控制模块:程序开始时,需玩家确定而后开始游戏;游戏过程中,两 个玩家通过不同的按键移动光标,选择落子;游戏结束时,有玩家选择是否开

1

枣庄学院 C 语言课程设计任务书 10 本三 软件外包专业 张培培 始新棋局。 胜负判断模块:实时监测棋盘上棋子,一旦某一色棋子出现五子连线,终 止游戏程序,并着色连成一线的五子,弹出该色玩家胜出界面。 玩家计分模块: 一方玩家再胜利后通过对文件的操作进行计分,并输出于 计分板上。

1.2.2 程序流程设计
根据程序需求分析结果,可以得出程序的总体结构图如图 1,程序总体流 程图如图 2。

图1

2

枣庄学院 C 语言课程设计任务书 10 本三 软件外包专业 张培培

第 2 章:概要设计
2.1.1 各类头文件,变量及宏定义
#include"stdio.h" #include "Conio.h" #include "graphics.h" #include <bios.h> #include<dos.h> #define closegr closegraph /*定义 1 号玩家的操作键键码*/ #define W 0x1177/*上移--'W'*/ #define S 0x1f73/*下移--'S'*/ #define A 0x1e61/*左移--'A'*/ #define D 0x2064/*右移--'D'*/ #define SP 0x3920/*落子--空格键*/ /*定义 2 号玩家的操作键键码*/ #define UP 0x4800/*上移--方向键 up*/ #define DOWN 0x5000/*下移--方向键 down*/ #define LEFT 0x4b00/*左移--方向键 left*/ #define RIGHT 0x4d00/*右移--方向键 right*/ #define ENTER 0x1c0d/*落子--回车键 Enter*/ #define ESC 0x011b/*退出*/ #define Y 0x1579/*YES*/ #define N 0x316e/*NO*/ #define BACK 0xe08 /*悔棋*/ #define DEL 0x5300 /*删除比分*/

2.1.2 全局变量
int ch,dh,del;/*文件操作计分变量*/ int k,i,j,n,t;/*控制变量*/ int a[20][20];/*棋盘数组*/

2.2 图形模块
棋盘的显示由游戏开始与结束部分控制, 棋子以及棋子定位框的显示与保 留由玩家操控部分决定,本章只列写棋盘与棋子的显示程序。

3

枣庄学院 C 语言课程设计任务书 10 本三 软件外包专业 张培培 图形模块主要由以下函数组成: initgr();/*图形界面初始化函数*/ Welcome();/*欢迎界面*/ Help();/*帮助界面*/ board();/*画棋盘*/ white();/*画白棋子*/ black();/*画黑棋子*/ bye();/*结束界面*/ green();/*连珠时着色相应棋子*/ show();drawmat();/*显示中文的点阵图函数,以及产生动态变色效果*/ border();/*棋子定位框函数*/ delborder();/*删除当前位置棋子定位框函数*/ p1turn();/*轮到 1p 时在左边边框画出白棋以及输出 white turn 以提示 1p 进行操 作*/ p2turn();/*轮到 2p 时在右边边框画出黑棋以及输出 black turn 以提示 2p 进行操 作*/ p1del();/*轮到 2p 时去除 p1turn();函数的效果*/ p2del();/*轮到 1p 时去除 p2turn();函数的效果*/

2.3 玩家操作模块
棋子的移动与落子有键盘上按键控制,本程序选取 1P 按键为 W、S、A、 D 和空格键,2P 按键为↑、↓、←、→和回车键,分别代表上移、下移、左移、 右移光标和落子。在光标移动的过程中,光标按照玩家按键移动;在玩家按下 落子按键后,程序自动调用棋子显示子程序和判断胜负子程序。1P、2P 的落 子后,程序会为落子处的数组元素赋一个特定值,用于判定胜负。 玩家操作模块主要由以下函数构成: P1move();/*玩家 1 移动函数*/ P2move();/*玩家 2 移动函数*/ Back();/*悔棋函数*/

2.4 胜负判断模块
胜负判断模块是程序的关键, 该模块的设计直接关系到程序的运行速率和 运行结果的正确与否。本函数根据每次落子的位置,分别向上、下、左、右、 左上、左下、右上、右下八个方向判断是否有相同颜色的棋子连成五子,如果 成立,游戏就结束,并显示提示信息,否则继续落子。 以下简析本程序流程:,由获胜条件可以知,通过判断上、下、左、右、 斜上、 斜下八个方向上是否有连续的 5 个子即可得出是否获胜结果。在游戏开 始时,将棋盘初始化,即将棋盘抽象为一个 19*19 的数组,数组中每个元素数 值设为 6。1P 落子时,将数组内相应坐标处元素赋值为 0;2P 落子时,将数组
4

枣庄学院 C 语言课程设计任务书 10 本三 软件外包专业 张培培 内相应坐标处元素赋值为 1。通过循环扫描棋盘数组,如果 上、下、左、右、 斜上、斜下八个方向某 5 个连续的子所对应的数组中元素之和等于 5 时,1P 获胜;当上、下、左、右、斜上、斜下八个方向某 5 个连续的子所对应的数组 中元素之和等于 0 时,2P 获胜。 胜负判断模块主要由以下几个函数构成: Win();/*主要函数,判断胜负*/ P1win();/*p1 胜利时调用,用于告知 p1 玩家胜利及询问是否继续*/ P1win();/*p2 胜利时调用,用于告知 p2 玩家胜利及询问是否继续*/ restart();/*询问是否重新开始新的一局比赛的函数*/ initialization();/*初始化棋盘对应数组所有值为 6*/

2.5 玩家计分模块
为了能使 1p 和 2p 更直观更便捷地看到双方对战的比分,所以做了此计分 模块,因为分数不能因为重新调用 main()函数就丢失了,所以采用对文件的 操作, 通过文件来记录双方的比分,这里对 score1.txt 和 score2.txt 文件进 行操作,用来计 1p 和 2p 的分数。 玩家计分模块主要由以下几个函数构成: Point();/*整合所有文件操作的模块*/ p1_point_input();/*1p 计分文件读取*/ p1_point_input2();/*1p 计分文件写入*/ p1_point_output();/*1p 计分文件输出*/ p2_point_input();/*2p 计分文件读取*/ p2_point_input2();/*2p 计分文件写入*/ p2_point_output();/*2p 计分文件输出*/ delscore1() ; /*删除当前 1p 分数*/ delscore2(); /*删除当前 2p 分数*/

2.6 各模块之间调用关系如下

5

枣庄学院 C 语言课程设计任务书 10 本三 软件外包专业 张培培

第 3 章:详细设计
3.1 图形模块
①initgr() /* BGI 初始化 */ { int gd = DETECT, gm = 0; /* 和 gd = VGA,gm = VGAHI 是同样效果 */ registerbgidriver(EGAVGA_driver);/* 注册 BGI 驱动后可以不需要.BGI 文件 的支持运行 */ initgraph(&gd, &gm, ""); } ② welcome() /*欢迎界面*/ { initgr() ; /*初始化*/ clearviewport(); /*清屏*/ setcolor(2); /*设置颜色*/ settextstyle(0,0,6); /*样式*/ outtextxy(180,180,"Welcome");/*位置以及内容*/ settextstyle(0,0,2); /*文本样式*/ outtextxy(240,420,"press any key to continue");/*位置以及内容*/ getch(); /*press any key to continue*/ } ③ help() /*帮助界面,基本操作同 welcome();函数*/ { initgr(); clearviewport(); setcolor(2); settextstyle(0,0,2); outtextxy(60,100,"P1 move; W S A D "); outtextxy(60,120," set : space "); outtextxy(60,180,"P2 outtextxy(60,200," move: up down left right "); set: Enter"); ;

outtextxy(60,240,"You can press Backspace to pull back!") outtextxy(60,280,"When you want to quit the game,"); outtextxy(60,300,"press Esc."); outtextxy(220,440,"press any key to continue"); getch();

6

枣庄学院 C 语言课程设计任务书 10 本三 软件外包专业 张培培 } ④ bye() /*say bye~@!,实现功能同上*/ { initgr(); clearviewport(); setcolor(4) ; settextstyle(0,0,6); outtextxy(130,180,"Thank you!"); settextstyle(0,0,2); outtextxy(240,420,"press any key to quit"); getch(); } ⑤ board()/*画棋盘*/ { setcolor(14); /*线色*/ setfillstyle(1,6); /*样式*/ bar(120,50,520,450); /*棋盘底*/ for(k=0;k<21 ;k++) { line(120+20*k,50,120+20*k,450) ; /*竖线*/ line(120,50+20*k,520,50+20*k) ; /*横线*/ } setfillstyle(1,9) ; bar(540,200,620,300); /*1p2p 两边框*/ bar(20,200,100,300); setcolor(2); settextstyle(3,0,4); outtextxy(50,210,"1p"); outtextxy(570,210,"2p"); delay(50000); show(); /*显示动态变色效果的标题*/ moveto(320,250); /*初始化中心位置*/ border(); /*画定位框*/ p1turn(); /*p1 开始落子,游戏开始*/ } ⑥white() /*画白棋*/ { setcolor(15); setfillstyle(1,15); circle(getx(),gety(),9);
7

枣庄学院 C 语言课程设计任务书 10 本三 软件外包专业 张培培 floodfill(getx(),gety(),15); } black() /*画黑棋*/ { setcolor(0); setfillstyle(1,0); circle(getx(),gety(),9); floodfill(getx(),gety(),0); } green() /*用粉色着色连珠时的棋子*/ { setcolor(13); setfillstyle(1,13); circle(getx(),gety(),9); floodfill(getx(),gety(),13); } ⑦ p1turn()/*画左边边框内白棋子*/ { setcolor(15); setfillstyle(1,15); circle(60,250,9); floodfill(60,250,15); settextstyle(3,0,4); outtextxy(20,280,"white turn"); } p2turn() /*右边边框内黑色棋子*/ { setcolor(0); setfillstyle(1,0); circle(580,250,9); floodfill(580,250,0); settextstyle(3,0,4); outtextxy(540,280,"black turn"); } p1del()/*不是 1turn 时候抹去左边边框内棋子*/ { setfillstyle(1,9) ; floodfill(60,250,9); setcolor(9); settextstyle(3,0,4); outtextxy(20,280,"white turn"); } p2del()/*不是 2turn 时候抹去右边边框内棋子*/
8

枣庄学院 C 语言课程设计任务书 10 本三 软件外包专业 张培培 { setfillstyle(1,9); floodfill(580,250,9) ; setcolor(9); settextstyle(3,0,4); outtextxy(540,280,"black turn"); } ⑧ border() /*画定位框*/ { setcolor(14); line(getx()-8,gety()-9,getx()-3,gety()-9); /*通过画线函数画出定位框*/ line(getx()+8,gety()-9,getx()+3,gety()-9); line(getx()-8,gety()-9,getx()-8,gety()-4); line(getx()+8,gety()-9,getx()+8,gety()-4); line(getx()-8,gety()+9,getx()-3,gety()+9); line(getx()+8,gety()+9,getx()+3,gety()+9); line(getx()-8,gety()+9,getx()-8,gety()+4); line(getx()+8,gety()+9,getx()+8,gety()+4); } delborder() /*除去定位框*/ { setcolor(6); /*本质在于颜色覆盖*/ line(getx()-8,gety()-9,getx()-3,gety()-9); line(getx()+8,gety()-9,getx()+3,gety()-9); line(getx()-8,gety()-9,getx()-8,gety()-4); line(getx()+8,gety()-9,getx()+8,gety()-4); line(getx()-8,gety()+9,getx()-3,gety()+9); line(getx()+8,gety()+9,getx()+3,gety()+9); line(getx()-8,gety()+9,getx()-8,gety()+4); line(getx()+8,gety()+9,getx()+8,gety()+4); } ⑨ drawmat(char *mat,int matsize,int x,int y,int color)/*点阵图所用标准输出方 式*/ { int i,j,k,m; m=(matsize-1)/8+1; for(j=0;j<matsize;j++) for(i=0;i<m;i++) for(k=0;k<8;k++) if(mat[j*m+i]&(0x80>>k)) putpixel(x+i*8+k,y+j,color); } show() /*动态点阵图中文闪烁效果*/
9

枣庄学院 C 语言课程设计任务书 10 本三 软件外包专业 张培培 { for(n=0;n<3;n++) { delay(10000); drawmat(wu32K,32,240,0,3);/*输出点阵图的“五”字*/ delay(10000); drawmat(zi32K,32,290,0,3); delay(10000); drawmat(qi32K,32,340,0,3); delay(10000); drawmat(wu32K,32,240,0,2); delay(10000); drawmat(zi32K,32,290,0,2); delay(10000); drawmat(qi32K,32,340,0,2); }

3.2 玩家操作模块
① p1move() /*玩家 1 操作*/ { switch(bioskey(0)) /*bioskey 函数对键盘操作*/ { case W: /*上移*/ {if(gety()<90) {delborder();moveto(getx(),430);} 所有 if 语句作用在于 delborder();moverel(0,-20);border();p1move();} 如果落子即将溢出边 case A: /*左移*/ 框,让其改变位置到 { if(getx()<160) 另一端,例如移动棋 {delborder();moveto(500,gety());} 盘最上端,若继续向 delborder();moverel(-20,0);border();p1move();} 上移动,则移动至棋 case S: /*下移*/ 盘最下端对应位置 {if(gety()>410) {delborder();moveto(getx(),70);} delborder();moverel(0,20);border();p1move();} case D: /*右移*/ { if(getx()>480) {delborder();moveto(140,gety());} delborder();moverel(20,0);border();p1move();} case SP: /*落子*/ {if(a[getx()][gety()]!=6) /*判定如果棋盘此处无子才能下,否则重新调用 p1move 函数*/ {p1move();}
10

枣庄学院 C 语言课程设计任务书 10 本三 软件外包专业 张培培 delborder(); /*去除定位框*/ white(); /*画棋子*/ a[getx()][gety()]=1;/*将所在位置对应的数组点赋值为 1*/ win(); /*判断胜负*/ border(); /*在新的位置画出定位框*/ p1del(); 对左右两边提示框操作,提示轮到 p2turn(); 2p 进行操作, 并调用 p2move()函数 p2move();} case ESC: / *结束游戏*/ {bye();closegraph(); exit(0);} case BACK : /*悔棋操作*/ {back();p1del();p2turn();p2move();} default: p1move();

} } ② p2move() /*玩家 2 操作*/ { switch(bioskey(0)) P2move(); { 函数与 p1move();函 case UP: 数基本作用相同 {if(gety()<90) {delborder();moveto(getx(),430);} delborder();moverel(0,-20);border();p2move();} case LEFT: {if(getx()<160) {delborder();moveto(500,gety());}delborder();moverel(-20,0);border();p2move();} case DOWN: {if(gety()>410) {delborder();moveto(getx(),70);}delborder();moverel(0,20);border();p2move();} case RIGHT: { if(getx()>480) {delborder();moveto(140,gety());}delborder();moverel(20,0);border();p2move();} case ENTER: {if(a[getx()][gety()]!=6) {p2move();}delborder();black();a[getx()][gety()]=0;win();border();p2del();p1turn() ;p1move();}
11

枣庄学院 C 语言课程设计任务书 10 本三 软件外包专业 张培培 default: p2move(); case ESC: {bye();closegraph(); exit(0);} case BACK : {back();p2del();p1turn();p1move();} } } ③ back() /*悔棋功能*/ { setcolor(6); setfillstyle(1,6); circle(getx(),gety(),9); floodfill(getx(),gety(),6); /*通过将现有棋子覆盖与棋盘底色相同的颜色来实 现*/ setcolor(14) ; line(getx()-9,gety(),getx()+9,gety()) ; line(getx(),gety()-9,getx(),gety()+9) ; 因为覆盖棋盘颜色后对应的 }
棋谱线条颜色被覆盖,所以通 过画线函数补回被覆盖负分 的线色

3.3 胜负判断模块
① win() /*胜负判断主程序*/ { for(i=120;i<540;i=i+20) for(j=50;j<470;j=j+20)/*通过循环扫描整个棋盘判定胜负*/ { if((a[i][j]+a[i+20][j]+a[i+40][j]+a[i+60][j]+a[i+80][j]==5)||(a[i][j]+a[i][j+20]+a[i][j +40]+a[i][j+60]+a[i][j+80]==5)|| (a[i][j]+a[i+20][j+20]+a[i+40][j+40]+a[i+60][j+60]+a[i+80][j+80]==5)||(a[i][j+80] +a[i+20][j+60]+a[i+40][j+40]+a[i+60][j+20]+a[i+80][j]==5)) /*如果棋盘上任何位置数组对应的值之和为 5,则白方 5 子连珠*/ { if(a[i][j]+a[i+20][j]+a[i+40][j]+a[i+60][j]+a[i+80][j]==5) { moveto(i,j); green();delay(10000);moveto(i+20,j);green(); delay(10000);moveto(i+40,j);green();delay(10000);moveto(i+60,j);green();delay(1 0000);moveto(i+80,j);green();delay(10000); }
12

枣庄学院 C 语言课程设计任务书 10 本三 软件外包专业 张培培 else if(a[i][j]+a[i][j+20]+a[i][j+40]+a[i][j+60]+a[i][j+80]==5) { moveto(i,j); green();delay(10000);moveto(i,j+20);green(); delay(10000);moveto(i,j+40);green();delay(10000);moveto(i,j+60);green();delay(1 0000);moveto(i,j+80);green();delay(10000); } else if(a[i][j]+a[i+20][j+20]+a[i+40][j+40]+a[i+60][j+60]+a[i+80][j+80]==5) {moveto(i,j); green();delay(10000);moveto(i+20,j+20);green(); delay(10000);moveto(i+40,j+40);green();delay(10000);moveto(i+60,j+60);green(); delay(10000);moveto(i+80,j+80);green();delay(10000); } else if(a[i][j+80]+a[i+20][j+60]+a[i+40][j+40]+a[i+60][j+20]+a[i+80][j]==5) {moveto(i,j+80); green();delay(10000);moveto(i+20,j+60);green(); delay(10000);moveto(i+40,j+40);green();delay(10000);moveto(i+60,j+20);green(); delay(10000);moveto(i+80,j);green();delay(10000); } delscore1();p1_point_input2();p1_point_output() ; p1win(); } if((a[i][j]+a[i+20][j]+a[i+40][j]+a[i+60][j]+a[i+80][j]==0)||(a[i][j]+a[i][j+20]+a[i][j +40]+a[i][j+60]+a[i][j+80]==0)|| (a[i][j]+a[i+20][j+20]+a[i+40][j+40]+a[i+60][j+60]+a[i+80][j+80]==0)||(a[i][j+80] +a[i+20][j+60]+a[i+40][j+40]+a[i+60][j+20]+a[i+80][j]==0))

{ if(a[i][j]+a[i+20][j]+a[i+40][j]+a[i+60][j]+a[i+80][j]==0) { moveto(i,j); green();delay(10000);moveto(i+20,j);green(); delay(10000);moveto(i+40,j);green();delay(10000);moveto(i+60,j);green();delay(1 0000);moveto(i+80,j);green();delay(10000); } else if(a[i][j]+a[i][j+20]+a[i][j+40]+a[i][j+60]+a[i][j+80]==0) { moveto(i,j);
13

枣庄学院 C 语言课程设计任务书 10 本三 软件外包专业 张培培 green();delay(10000);moveto(i,j+20);green(); delay(10000);moveto(i,j+40);green();delay(10000);moveto(i,j+60);green();delay(1 0000);moveto(i,j+80);green();delay(10000); } else if(a[i][j]+a[i+20][j+20]+a[i+40][j+40]+a[i+60][j+60]+a[i+80][j+80]==0) {moveto(i,j); green();delay(10000);moveto(i+20,j+20);green(); delay(10000);moveto(i+40,j+40);green();delay(10000);moveto(i+60,j+60);green(); delay(10000);moveto(i+80,j+80);green();delay(10000); } else if(a[i][j+80]+a[i+20][j+60]+a[i+40][j+40]+a[i+60][j+20]+a[i+80][j]==0) {moveto(i,j+80); green();delay(10000);moveto(i+20,j+60);green(); delay(10000);moveto(i+40,j+40);green();delay(10000);moveto(i+60,j+20);green(); delay(10000);moveto(i+80,j);green();delay(10000); } delscore2(); p2_point_input2();p2_point_output() ;p2win(); } } }

② p1win() { setcolor(15) ; settextstyle(0,0,2); outtextxy(10,110,"1p win"); outtextxy(240,460,"Restart?(Y/N)"); restart(); } p2win() { setcolor(15) ; settextstyle(0,0,2); outtextxy(535,110,"2p win"); outtextxy(240,460,"Restart?(Y/N)");
14

此处 2 个函数用于 1p 或 2p 获胜后的告知以及询问是 否开始新的一局,调用 restart(); 函 数 以 继 续 或 退 出。

枣庄学院 C 语言课程设计任务书 10 本三 软件外包专业 张培培 restart(); } ③ restart() { switch(bioskey(0)) {case Y: {main();} case N: {bye();closegraph(); exit(0);} default:restart(); } } ④ initialization() { for(i=120;i<540;i++) for(j=50;j<470;j++) 为 6*/ { a[i][j]=6; } }

通过对键盘的操作, 提取 Y 或 N 以确定是否开始新的一局。

/*循环初始化棋盘对应的数组所在位置值

3.4 文件操作模块
point() */ { p1_point_input(); p1_point_output() ; p2_point_input(); p2_point_output() ; /*用于整合所有计分的函数, 方便操作
之所以做这么多函数来实现文件操作的计分,是因为我发现 C 语言中对文件操作似乎存在 bug,如果放在一个函数中经 常出现文件无法正常读取,无法正常写入等现象,即使拆分 成如此多函数,也依旧偶尔会出现以上提到的一些小 bug。

} p1_point_input() /*1p 计分文件读取*/ { FILE *fp; fp=fopen("score1.txt","r"); ch=getw(fp); fclose(fp); }
15

首先打开文件,然后取出里面的 数字赋值于 ch 变量, 再用另一个 函数打开文件并对 ch 进行自增操 作,最后将 ch 写入文件。

枣庄学院 C 语言课程设计任务书 10 本三 软件外包专业 张培培 p1_point_input2() /*1p 计分文件输入*/ { FILE *fp; fp=fopen("score1.txt","r+"); ch=ch+1; putw(ch,fp); fclose(fp); } p1_point_output() /*1p 计分输出*/ {

int i=0; char sh,score[10]; FILE *fp; fp=fopen("score1.txt", "r"); for(; (sh=fgetc(fp))!=EOF; ) { score[i++]=sh; } score[i]='\0'; setcolor(12); settextstyle(3,0,4); outtextxy(40,320,"score"); outtextxy(55,340,score); fclose(fp); } p2_point_input() { FILE *fp; fp=fopen("score2.txt","r"); dh=getw(fp); fclose(fp); } p2_point_input2() { FILE *fp; fp=fopen("score2.txt","r+"); dh=dh+1; putw(dh,fp); fclose(fp);
16

通过再次打开文件,循环扫描,输出 文件中的数值并设置其样式。

玩家 2 的计分模块,和玩家 1 的相同,就不再重复介绍 了。

枣庄学院 C 语言课程设计任务书 10 本三 软件外包专业 张培培 } p2_point_output() {

int i=0; char fh,score[10]; FILE *fp; fp=fopen("score2.txt", "r"); for(; (fh=fgetc(fp))!=EOF; ) { score[i++]=fh; } score[i]='\0'; setcolor(12); settextstyle(3,0,4); outtextxy(560,320,"score"); outtextxy(575,340,score); fclose(fp);

依旧通过循环读取文件内比分, 然后通过颜色覆盖从而达到分数 改变功能,这么操作十分复杂, 体现了 C 语言图形编程下的不完 善性。

delscore1() /*删除当前 1p 分数*/ { int i=0; char sh,score[10]; FILE *fp; fp=fopen("score1.txt", "r"); for(; (sh=fgetc(fp))!=EOF; ) { score[i++]=sh; } score[i]='\0'; setcolor(0); settextstyle(3,0,4); outtextxy(40,320,"score"); outtextxy(55,340,score);

17

枣庄学院 C 语言课程设计任务书 10 本三 软件外包专业 张培培 fclose(fp); } delscore2() /*删除当前 2p 分数*/ {

int i=0; char fh,score[10]; FILE *fp; fp=fopen("score2.txt", "r"); for(; (fh=fgetc(fp))!=EOF; ) { score[i++]=fh; } score[i]='\0'; setcolor(0); settextstyle(3,0,4); outtextxy(560,320,"score"); outtextxy(575,340,score); }

3.5 函数大致调用关系图

18

枣庄学院 C 语言课程设计任务书 10 本三 软件外包专业 张培培

注: 因为函数过多且调用关系过于复杂,没办法把所有函数的调用关系用图表 达,所以只能将大致的关系图表示出来。

第 4 章:调试分析
主要遇到的问题已经在详细分析里说道, 这里主要列举一些遇到的一些小 问题。

4.1 图形模块
1.在图形模块中,因为是第一次使用,所以刚开始时对于棋盘创建的位置把
19

枣庄学院 C 语言课程设计任务书 10 本三 软件外包专业 张培培 握有些欠缺。 解决方案:参考书本以及其他资料,找出最合适的位置坐标。 2. 在构建棋子时候,发现 C 语言中似乎对颜色的处理有些错误,当棋谱线的 颜色为白色时,无法构建黑色棋子,只能画出白色棋子。 解决方案:经过不断尝试,确认 bug 存在后,改变棋谱线颜色为淡黄色,之后 能够成功画出黑色与白色棋子。 3. 在着色连珠五子的时候,依旧是颜色问题,发现有些颜色无法着色。 解决方案:经过多次调试后找出了部分能进行着色的颜色,并选定粉色。

4.2 玩家操作模块
1. 在玩家操作模块中,出现的最大问题之一就是棋盘已经有棋子的地方还可 以覆盖另一个棋子。 解决方案: 通过在 2 个 move 函数中添加 if 条件语句,判定如果所在位置对应 的数组值不等于 6 时,不能落子。 2. 另一个问题就是之前提到的,操作定位框的时候会将定位框移到棋盘之外 造成溢出。 解决方案: 通过 if 语句判定,如果操作框超出范围则移动到对应相反位置, 例如移动棋盘最上端,若继续向上移动,则移动至棋盘最下端对应位置。 3. 还有一个就是悔棋模块中,通过将现有棋子覆盖与棋盘底色相同的颜色来 覆盖后,棋谱线条部分也会被覆盖。 解决方案:在 back();即悔棋函数中,添加 line 画线函数来补棋谱线。

4.3 胜负判断模块
1. 在胜负判断中一直没能想到好的办法来数据化判断哪方玩家获得胜利。 解决方案:通过参考书籍并加以优化,得出将棋谱做成数组,定义白子落下为 1, 黑子落下为 5, 初始为 6, 这样即不会造成冲突, 也很好的解决了判断问题。 2. 另一个问题在于一直不能优化代码做到不每次都扫描整个棋盘来判断胜 负。 解决方案:至今尚未解决,尝试过局部扫描,但失败了。

4.4 玩家计分模块
1. 虽然这个功能不是主要功能,但却是困扰我最久的,就是对文件的操作经 常出错,有时候能读取文件,有时候读取失败,一直没能找到问题的源头。 解决方案:经过多次尝试,发现对文件的操作一次最好在一个函数中构建,所 以光是对文件的操作就做了好多个函数,但是最后还是偶尔会出现 bug。

20

枣庄学院 C 语言课程设计任务书 10 本三 软件外包专业 张培培

第 5 章:用户手册
1. 本程序的运行环境为 DOS 操作系统,执行文件为 five.exe;文件目录下 score1.txt 和 score2.txt 是用于玩家的计分文件。 2. 进入演示程序后,即显示欢迎界面,按任何键进入帮助界面,再按任何键 可以进入主界面开始游戏 3. 棋子的移动与落子有键盘上按键控制,本程序选取 1P 按键为 W、S、A、D 和空格键,2P 按键为↑、↓、←、→和回车键,分别代表上移、下移、左移、 右移光标和落子。在光标移动的过程中,光标按照玩家按键移动;在玩家按下 落子按键后,程序自动调用棋子显示子程序和判断胜负子程序。1P、2P 的落 子后,程序会为落子处的数组元素赋一个特定值,用于判定胜负。 4.游戏中 esc 键可以直接退出游戏,backspace 键可以操作进行悔棋。 5.游戏过程中, 如果玩家 1 或者玩家 2 有一方获得胜利后,程序自动将提示哪 一方获得了胜利,并将着色构成连珠的 5 个子。 6.游戏结束且玩家选择不再继续后,跳出结束界面。退出程序。

第 6 章:测试分析
本五子棋游戏采用 C 语言下图形界面编程,以下是各步骤及功能截图:

欢迎,帮助以及结束界面
21

枣庄学院 C 语言课程设计任务书 10 本三 软件外包专业 张培培

主界面

获胜界面(包括计分)

结 论
通过对各子程序的设计与优化,本程序完成了五子棋软件的主体的 设计与制作, 基本达到了使用五子棋软件的核心要求。然而程序还有一些不足 之处,首先,程序的计分模块存在些许小问题,偶尔会出现不计分现象并且还 无法做到删除计分功能,其次,程序的界面过于简陋,而且无法使用鼠标进行 操作。最后就是程序无法实现人机对战,缺乏可玩性。

22


赞助商链接
相关文章:
课程设计-c语言设计_五子棋游戏
课程设计-c语言设计_五子棋游戏_工学_高等教育_教育专区。课程设计-c语言设计_...课程设计报告 1.1 问题描述连珠(五子棋)是有两个人在一盘棋上进行对抗的竞技...
C语言图形五子棋课程设计报告
兰州交通大学博文学院 C 语言课程设计 设计题目: 专班学姓业: 级: 号: 名: 五子棋游戏 自动化 14 自动化 20143109 王续 史红霞 指导教师: 二零一四年六月...
C语言图形五子棋课程设计报告
C 语言课程设计报告 设计报告---五子棋南昌航空大学软件学院 102032 班 陈琦帆 1 C 语言课程设计报告 语言课程设计报告五子棋 院系: :软件学院 专业:软件工程 ...
C语言课程设计五子棋源代码_+设计报告
C语言课程设计五子棋源代码_+设计报告_计算机软件及应用_IT/计算机_专业资料。C...[Y]==1) {if(getx()==500) moveto(120,gety());moverel(20,0);...
《C++语言程序设计》课程设计报告--五子棋
课程: 题目: 年级: 专业: 学号: 姓名: 指导教师: C++语言程序设计 五子棋 江苏师范大学数学与统计学院 【摘要】 五子棋是我国古代的、传统的黑白棋种之一。五...
(完整版)基于C语言的五子棋程序毕业课程设计报告
(完整版)基于C语言五子棋程序毕业课程设计报告 - 研究报告,创业计划,项目建议书,可行性分析,可研报告,可行性研究报告,项目研究报告,商业计划
C语言五子棋源代码 设计报告
C 语言程序设计综合实验 设计报告 题目: 班级; 人数: 五子棋 07 电气(1)班 4人 小组成员: 时间: 08.9.19 目录 1 课程设计报告 1.1 课题描述 1.2 ...
C语言课设 五子棋
一年 7 月 11 计算机课程设计基于 C 语言五子棋游戏的制作 ***学院 计算机课程设计课题申报表系 相关课程 课题名称 级学生 指导教师 学生人数 设计地点...
C语言程序设计之五子棋
C语言程序设计之五子棋_计算机软件及应用_IT/计算机_专业资料。安徽大学 电子信息...通过 C 语言课程 设计,我们对语言这门课程有了更深一步的了解。它是计算 机...
基于C语言五子棋小游戏
基于C语言五子棋小游戏_育儿理论经验_幼儿教育_教育专区。五子棋小游戏一.需求...c语言课程设计_五子棋游... 5页 1下载券 C语言五子棋游戏 4页 免费 C...
更多相关标签: