c语言报告五子棋(共16页)_第1页
c语言报告五子棋(共16页)_第2页
c语言报告五子棋(共16页)_第3页
c语言报告五子棋(共16页)_第4页
c语言报告五子棋(共16页)_第5页
已阅读5页,还剩12页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、精选优质文档-倾情为你奉上C语言课程设计报告题目: 简单的c五子棋 设计者: 方阳 专业班级: 软件工程1303班 学号: 4 指导老师: 刘洁 所属系部: 计算机学院 2014年6月25日河南理工大学1、设计任务书1.1、 题目与要求:本人计划编写一个简单的c五子棋,应用C语言编写程序可以在计算机上实现二人对弈五子棋功能。二人对弈五子棋程序由图像生成、光标移动与落子、判断胜负和系统帮助等子程序构成;程序中应用了结构体、数组、全局变量、按键处理和图形编程等元素和语句。程序通过棋盘和棋子图像生成、二人移子与落子和判断胜负等功能的实现,在计算机上实现了二人五子棋对弈。1.2、 本系统涉及的知识点:

2、结构、数组、循环、函数、分支、2、功能设计根据功能需求,将程序分为图形显示、玩家控制、胜负判断和玩家计分四个模块,以下分析各模块的需求。图形显示模块:程序开始运行时,给出欢迎及帮助界面;游戏开始后要求生成19×19的棋盘图像,并在棋盘上方提示当前落子方棋子颜色,游戏进行过程中,要求实时显示棋盘上已落下的棋子;分出胜负后,要求给出游戏结束画面。玩家控制模块:程序开始时,需玩家确定而后开始游戏;游戏过程中,两个玩家通过不同的按键移动光标,选择落子;游戏结束时,有玩家选择是否开始新棋局。胜负判断模块:实时监测棋盘上棋子,一旦某一色棋子出现五子连线,终止游戏程序,并着色连成一线的五子,弹出该

3、色玩家胜出界面。玩家计分模块:一方玩家再胜利后通过对文件的操作进行计分,并输出于计分板上。2.1、算法设计根据程序需求分析结果,可以得出程序的总体结构图如图。2.2部分模块流程图程序流程图3、程序代码设计3.1 图形模块initgr() /* BGI初始化 */ int gd = DETECT, gm = 0; /* 和gd = VGA,gm = VGAHI是同样效果 */ registerbgidriver(EGAVGA_driver);/* 注册BGI驱动后可以不需要.BGI文件的支持运行 */ initgraph(&gd, &gm, ""); welc

4、ome() /*欢迎界面*/ 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() /*

5、帮助界面,基本操作同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 move: up down left right "); outtextxy(60,200," set: Enter"); outtextxy(60,240,

6、"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(); bye() /*say bye!,实现功能同上*/ initgr(); clearviewport(); setcolor(4) ; settexts

7、tyle(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

8、,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

9、();/*p1开始落子,游戏开始*/ white() /*画白棋*/setcolor(15);setfillstyle(1,15);circle(getx(),gety(),9);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);floodfi

10、ll(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,

11、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时候抹去右边边框内棋子*/setfillstyle(1,9);floodfill(580,250,9) ;setcolor(9);settextstyle(3,0,4);outtextxy(540,280,"blac

12、k 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,

13、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

14、()-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(

15、j=0;j<matsize;j+) for(i=0;i<m;i+) for(k=0;k<8;k+) if(matj*m+i&(0x80>>k) putpixel(x+i*8+k,y+j,color);show() /*动态点阵图中文闪烁效果*/ 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); de

16、lay(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语句作用在于如果落子即将溢出边框,让其改变位置到另一端,例如移动棋盘最上端,若继续向上移动,则移动至棋盘最下端对应位置 if(gety()<90) delborder();moveto(

17、getx(),430); 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

18、()>480) delborder();moveto(140,gety(); delborder();moverel(20,0);border();p1move(); case SP: /*落子*/ if(agetx()gety()!=6)/*判定如果棋盘此处无子才能下,否则重新调用p1move函数*/ p1move();delborder(); /*去除定位框*/white();/*画棋子*/agetx()gety()=1;/*将所在位置对应的数组点赋值为1*/win(); /*判断胜负*/border(); /*在新的位置画出定位框*/对左右两边提示框操作,提示轮到2p进行操作,并调

19、用p2move()函数p1del();p2turn();p2move(); case ESC: / *结束游戏*/ bye();closegraph(); exit(0); case BACK : /*悔棋操作*/ back();p1del();p2turn();p2move(); default: p1move(); p2move() /*玩家2操作*/P2move(); 函数与p1move();函数基本作用相同switch(bioskey(0) case UP: if(gety()<90) delborder();moveto(getx(),430); delborder();mov

20、erel(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();

21、delborder();moverel(20,0);border();p2move(); case ENTER: if(agetx()gety()!=6) p2move();delborder();black();agetx()gety()=0;win();border();p2del();p1turn();p1move(); default: p2move(); case ESC: bye();closegraph(); exit(0); case BACK : back();p2del();p1turn();p1move(); back()/*悔棋功能*/setcolor(6);setfi

22、llstyle(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

23、)/*通过循环扫描整个棋盘判定胜负*/ if(aij+ai+20j+ai+40j+ai+60j+ai+80j=5)|(aij+aij+20+aij+40+aij+60+aij+80=5)| (aij+ai+20j+20+ai+40j+40+ai+60j+60+ai+80j+80=5)|(aij+80+ai+20j+60+ai+40j+40+ai+60j+20+ai+80j=5)/*如果棋盘上任何位置数组对应的值之和为5,则白方5子连珠*/ if(aij+ai+20j+ai+40j+ai+60j+ai+80j=5) moveto(i,j); green();delay(10000);moveto

24、(i+20,j);green(); delay(10000);moveto(i+40,j);green();delay(10000);moveto(i+60,j);green();delay(10000);moveto(i+80,j);green();delay(10000); else if(aij+aij+20+aij+40+aij+60+aij+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

25、+60);green();delay(10000);moveto(i,j+80);green();delay(10000); else if(aij+ai+20j+20+ai+40j+40+ai+60j+60+ai+80j+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();dela

26、y(10000); else if(aij+80+ai+20j+60+ai+40j+40+ai+60j+20+ai+80j=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_outp

27、ut() ; p1win(); if(aij+ai+20j+ai+40j+ai+60j+ai+80j=0)|(aij+aij+20+aij+40+aij+60+aij+80=0)| (aij+ai+20j+20+ai+40j+40+ai+60j+60+ai+80j+80=0)|(aij+80+ai+20j+60+ai+40j+40+ai+60j+20+ai+80j=0) if(aij+ai+20j+ai+40j+ai+60j+ai+80j=0) moveto(i,j); green();delay(10000);moveto(i+20,j);green(); delay(10000);move

28、to(i+40,j);green();delay(10000);moveto(i+60,j);green();delay(10000);moveto(i+80,j);green();delay(10000); else if(aij+aij+20+aij+40+aij+60+aij+80=0) 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(10000);moveto(i,

29、j+80);green();delay(10000); else if(aij+ai+20j+20+ai+40j+40+ai+60j+60+ai+80j+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(aij+80+ai+20j+60+

30、ai+40j+40+ai+60j+20+ai+80j=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)

31、 ;settextstyle(0,0,2);此处2个函数用于1p或2p获胜后的告知以及询问是否开始新的一局,调用restart();函数以继续或退出。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)"); restar

32、t();restart()通过对键盘的操作,提取Y或N以确定是否开始新的一局。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*/ aij=6; 3.4 文件操作模块point() /*用于整合所有计分的函数,方便操作*/之所以做这么多函数来实现文件操作的计分,是因为我发现C语言中对文件操作似乎存在bug

33、,如果放在一个函数中经常出现文件无法正常读取,无法正常写入等现象,即使拆分成如此多函数,也依旧偶尔会出现以上提到的一些小bug。p1_point_input();p1_point_output() ;p2_point_input();p2_point_output() ;p1_point_input() /*1p计分文件读取*/首先打开文件,然后取出里面的数字赋值于ch变量,再用另一个函数打开文件并对ch进行自增操作,最后将ch写入文件。 FILE *fp; fp=fopen("score1.txt","r"); ch=getw(fp); fclose(

34、fp);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,score10; FILE *fp;通过再次打开文件,循环扫描,输出文件中的数值并设置其样式。 fp=fopen("score1.txt", "r"); for(; (sh=fgetc(fp)!=EOF; ) s

35、corei+=sh; scorei='0' setcolor(12); settextstyle(3,0,4); outtextxy(40,320,"score"); outtextxy(55,340,score); fclose(fp); p2_point_input()玩家2的计分模块,和玩家1的相同,就不再重复介绍了。 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

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论