C语言图形五子棋专业课程设计方案报告_第1页
C语言图形五子棋专业课程设计方案报告_第2页
C语言图形五子棋专业课程设计方案报告_第3页
C语言图形五子棋专业课程设计方案报告_第4页
C语言图形五子棋专业课程设计方案报告_第5页
已阅读5页,还剩50页未读 继续免费阅读

下载本文档

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

文档简介

C语言课程设计汇报五子棋院系:软件学院 专业:软件工程班级:102032 学号:10203230 指导老师:王星摘要五子棋是一个两人对弈纯策略型棋类游戏,应用C语言编写程序能够在计算机上实现二人对弈五子棋功效。二人对弈五子棋程序由图像生成、光标移动和落子、判定胜败和系统帮助等子程序组成;程序中应用了结构体、数组、全局变量、按键处理和图形编程等元素和语句。程序经过棋盘和棋子图像生成、二人移子和落子和判定胜败等功效实现,在计算机上实现了二人五子棋对弈。AbstractGobangisatraditionalchecker-typegameinwhichtheliningupoffivepiecesinastraightlinescoresvictory.AndClanguagecanaccomplisha2-playergobangoncomputers.This2-playergobangprogramcontains4mainsections,theyare,graphics,movementandselection,victoryjudgmentandhelpingsystem.SeveralelementsandsentencesofCprogramminglanguagesuchasstructuralelement,array,globalvariables,pressprocessingandGraphicsProgrammingarealsoappliedintheprogram.Withtheaccomplishmentofthethreemainsubprograms,namely,checkerboardandpiecesconstruction,players’step-selectionandvictoryjudgment,awholeprogramofgobangisestablishedandgobangisavailableoncomputers.

目录一、需求分析 4二、概要设计 6三、具体设计 9四、调试分析 23五、用户手册 24六、测试数据 25七、附录 26

第1章:需求分析1.1五子棋背景传统五子棋棋具和围棋相同,棋子分为黑白两色,棋盘为15×15,棋子放置于棋盘线交叉点上。两人对局,各执一色,轮番下一子,先将横、竖或斜线5个或5个以上同色棋子连成不间断一排者为胜。因为传统五子棋在落子后不能移动或拿掉,所以也能够用纸和笔来进行游戏。1.2程序设计 本程序设计为人和人对弈,一方执黑棋,一方执白棋,轮番走棋,每方全部试图在游戏结束前让自己棋子五子相连,首先实现五子相连一方获胜。程序实施过程中,要求棋盘、棋子时时可见,而且人能够经过按键盘按键移动光标,摆放棋子。1.2.1程序需求分析依据功效需求,将程序分为图形显示、玩家控制、胜败判定和玩家计分四个模块,以下分析各模块需求。图形显示模块:程序开始运行时,给出欢迎及帮助界面;游戏开始后要求生成19×19棋盘图像,并在棋盘上方提醒目前落子方棋子颜色,游戏进行过程中,要求实时显示棋盘上已落下棋子;分出胜败后,要求给出游戏结束画面。玩家控制模块:程序开始时,需玩家确定以后开始游戏;游戏过程中,两个玩家经过不一样按键移动光标,选择落子;游戏结束时,有玩家选择是否开始新棋局。胜败判定模块:实时监测棋盘上棋子,一旦某一色棋子出现五子连线,终止游戏程序,并着色连成一线五子,弹出该色玩家胜出界面。玩家计分模块:一方玩家再胜利后经过对文件操作进行计分,并输出于计分板上。1.2.2程序步骤设计依据程序需求分析结果,能够得出程序总体结构图图1,程序总体步骤图图2。图1第2章:概要设计2.1.1各类头文件,变量及宏定义#include"stdio.h"#include"Conio.h"#include"graphics.h"#include<bios.h>#include<dos.h>#defineclosegrclosegraph/*定义1号玩家操作键键码*/#defineW0x1177/*上移--'W'*/#defineS0x1f73/*下移--'S'*/#defineA0x1e61/*左移--'A'*/#defineD0x2064/*右移--'D'*/#defineSP0x3920/*落子--空格键*//*定义2号玩家操作键键码*/#defineUP0x4800/*上移--方向键up*/#defineDOWN0x5000/*下移--方向键down*/#defineLEFT0x4b00/*左移--方向键left*/#defineRIGHT0x4d00/*右移--方向键right*/#defineENTER0x1c0d/*落子--回车键Enter*/#defineESC0x011b/*退出*/#defineY0x1579/*YES*/#defineN0x316e/*NO*/#defineBACK0xe08/*悔棋*/#defineDEL0x5300/*删除比分*/2.1.2全局变量intch,dh,del;/*文件操作计分变量*/intk,i,j,n,t;/*控制变量*/inta[20][20];/*棋盘数组*/2.2图形模块棋盘显示由游戏开始和结束部分控制,棋子和棋子定位框显示和保留由玩家操控部分决定,本章只列写棋盘和棋子显示程序。图形模块关键由以下函数组成:initgr();/*图形界面初始化函数*/Welcome();/*欢迎界面*/Help();/*帮助界面*/board();/*画棋盘*/white();/*画白棋子*/black();/*画黑棋子*/bye();/*结束界面*/green();/*连珠时着色对应棋子*/show();drawmat();/*显示汉字点阵图函数,和产生动态变色效果*/border();/*棋子定位框函数*/delborder();/*删除目前位置棋子定位框函数*/p1turn();/*轮到1p时在左边边框画出白棋和输出whiteturn以提醒1p进行操作*/p2turn();/*轮到2p时在右边边框画出黑棋和输出blackturn以提醒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落子时,将数组内对应坐标处元素赋值为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各模块之间调用关系以下第3章:具体设计3.1图形模块=1\*GB3①initgr()/*BGI初始化*/{intgd=DETECT,gm=0;/*和gd=VGA,gm=VGAHI是一样效果*/registerbgidriver(EGAVGA_driver);/*注册BGI驱动后能够不需要.BGI文件支持运行*/initgraph(&gd,&gm,"");}=2\*GB3②welcome() /*欢迎界面*/{initgr(); /*初始化*/clearviewport(); /*清屏*/setcolor(2); /*设置颜色*/settextstyle(0,0,6); /*样式*/outtextxy(180,180,"Welcome");/*位置和内容*/settextstyle(0,0,2); /*文本样式*/outtextxy(240,420,"pressanykeytocontinue");/*位置和内容*/getch(); /*pressanykeytocontinue*/}=3\*GB3③help()/*帮助界面,基础操作同welcome();函数*/{initgr();clearviewport();setcolor(2);settextstyle(0,0,2);outtextxy(60,100,"P1move;WSAD");outtextxy(60,120,"set:space");outtextxy(60,180,"P2move:updownleftright");outtextxy(60,200,"set:Enter");outtextxy(60,240,"YoucanpressBackspacetopullback!");outtextxy(60,280,"Whenyouwanttoquitthegame,");outtextxy(60,300,"pressEsc.");outtextxy(220,440,"pressanykeytocontinue");getch();}=4\*GB3④bye()/*saybye~@!,实现功效同上*/{initgr();clearviewport();setcolor(4);settextstyle(0,0,6);outtextxy(130,180,"Thankyou!");settextstyle(0,0,2);outtextxy(240,420,"pressanykeytoquit");getch();}=5\*GB3⑤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开始落子,游戏开始*/}=6\*GB3⑥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);floodfill(getx(),gety(),13);}=7\*GB3⑦p1turn()/*画左边边框内白棋子*/{setcolor(15);setfillstyle(1,15);circle(60,250,9);floodfill(60,250,15);settextstyle(3,0,4);outtextxy(20,280,"whiteturn");}p2turn()/*右边边框内黑色棋子*/{setcolor(0);setfillstyle(1,0);circle(580,250,9);floodfill(580,250,0);settextstyle(3,0,4);outtextxy(540,280,"blackturn");}p1del()/*不是1turn时候抹去左边边框内棋子*/{setfillstyle(1,9);floodfill(60,250,9);setcolor(9);settextstyle(3,0,4);outtextxy(20,280,"whiteturn");}p2del()/*不是2turn时候抹去右边边框内棋子*/{setfillstyle(1,9);floodfill(580,250,9);setcolor(9);settextstyle(3,0,4);outtextxy(540,280,"blackturn");}=8\*GB3⑧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);}=9\*GB3⑨ drawmat(char*mat,intmatsize,intx,inty,intcolor)/*点阵图所用标准输出方法*/{inti,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()/*动态点阵图汉字闪烁效果*/{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玩家操作模块=1\*GB3①p1move()/*玩家1操作*/{switch(bioskey(0))/*bioskey函数对键盘操作*/{caseW: /*上移*/{if(gety()<90) 全部if语句作用在于假如落子立即溢出边框,让其改变位置到另一端,比如移动棋盘最上端,若继续向上移动,则移动至棋盘最下端对应位置{delborder();moveto(全部if语句作用在于假如落子立即溢出边框,让其改变位置到另一端,比如移动棋盘最上端,若继续向上移动,则移动至棋盘最下端对应位置delborder();moverel(0,-20);border();p1move();}caseA: /*左移*/{if(getx()<160){delborder();moveto(500,gety());}delborder();moverel(-20,0);border();p1move();}caseS: /*下移*/{if(gety()>410){delborder();moveto(getx(),70);}delborder();moverel(0,20);border();p1move();}caseD: /*右移*/{if(getx()>480){delborder();moveto(140,gety());}delborder();moverel(20,0);border();p1move();}caseSP:/*落子*/{if(a[getx()][gety()]!=6)/*判定假如棋盘此处无子才能下,不然重新调用p1move函数*/{p1move();}delborder();/*去除定位框*/white(); /*画棋子*/a[getx()][gety()]=1;/*将所在位置对应数组点赋值为1*/win();/*判定胜败*/border();/*在新位置画出定位框*/对左右两边提醒框操作,提醒轮到2p进行操作,并调用p2move()对左右两边提醒框操作,提醒轮到2p进行操作,并调用p2move()函数p2turn();p2move();}caseESC:/*结束游戏*/{bye();closegraph();exit(0);}caseBACK:/*悔棋操作*/{back();p1del();p2turn();p2move();}default:p1move();}}=2\*GB3②P2move();函数和p1move();函数基础作用相同p2move()/*P2move();函数和p1move();函数基础作用相同{switch(bioskey(0)){caseUP:{if(gety()<90){delborder();moveto(getx(),430);}delborder();moverel(0,-20);border();p2move();}caseLEFT:{if(getx()<160){delborder();moveto(500,gety());}delborder();moverel(-20,0);border();p2move();}caseDOWN:{if(gety()>410){delborder();moveto(getx(),70);}delborder();moverel(0,20);border();p2move();}caseRIGHT:{if(getx()>480){delborder();moveto(140,gety());}delborder();moverel(20,0);border();p2move();}caseENTER:{if(a[getx()][gety()]!=6){p2move();}delborder();black();a[getx()][gety()]=0;win();border();p2del();p1turn();p1move();}default:p2move();caseESC:{bye();closegraph();exit(0);}caseBACK:{back();p2del();p1turn();p1move();}}}=3\*GB3③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胜败判定模块=1\*GB3①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)假如五子连珠,扫描是哪一个方向有连珠,并将连珠5个字进行动态着色,方便玩家双方识别。{moveto(i,j);green();delay(10000);假如五子连珠,扫描是哪一个方向有连珠,并将连珠5个字进行动态着色,方便玩家双方识别。}elseif(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(10000);moveto(i,j+80);green();delay(10000);}elseif(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);}elseif(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();}此处判定假如棋盘上任何位置数组对应值之和为此处判定假如棋盘上任何位置数组对应值之和为0,则黑方5子连珠{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(10000);moveto(i+80,j);green();delay(10000);}elseif(a[i][j]+a[i][j+20]+a[i][j+40]+a[i][j+60]+a[i][j+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,j+80);green();delay(10000);}elseif(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);}此处依旧是五子连珠后着色模块。elseif(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();}}}=2\*GB3②p1win(){setcolor(15);settextstyle(0,0,2);outtextxy(10,110,"1pwin");此处2个函数用于1p此处2个函数用于1p或2p获胜后通知和问询是否开始新一局,调用restart();函数以继续或退出。restart();}p2win(){setcolor(15);settextstyle(0,0,2);outtextxy(535,110,"2pwin");outtextxy(240,460,"Restart?(Y/N)");restart();}=3\*GB3③restart(){经过对键盘操作,提取Y或N经过对键盘操作,提取Y或N以确定是否开始新一局。{caseY:{main();}caseN:{bye();closegraph();exit(0);}default:restart();}}=4\*GB3④initialization(){for(i=120;i<540;i++)for(j=50;j<470;j++) /*循环初始化棋盘对应数组所在位置值为6*/{a[i][j]=6;}}3.4文件操作模块point()/*用于整合全部计分函数,方便操作*/之所以做这么多函数来实现文件操作计分,是因为我发觉C之所以做这么多函数来实现文件操作计分,是因为我发觉C语言中对文件操作似乎存在bug,假如放在一个函数中常常出现文件无法正常读取,无法正常写入等现象,即使拆分成如此多函数,也依旧偶然会出现以上提到部分小bug。p1_point_input();p1_point_output();p2_point_input();p2_point_output();}p1_point_input()/*1p计分文件读取*/{FILE*fp;fp=fopen("score1.txt","r");首先打开文件,然后取出里面数字赋值于ch变量,再用另一个函数打开文件并对ch进行自增操作,最终将ch写入文件。首先打开文件,然后取出里面数字赋值于ch变量,再用另一个函数打开文件并对ch进行自增操作,最终将ch写入文件。fclose(fp);}p1_point_input2()/*1p计分文件输入*/{FILE*fp;fp=fopen("score1.txt","r+");ch=ch+1;putw(ch,fp);fclose(fp);}p1_point_output()/*1p计分输出*/{inti=0;charsh,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(){玩家2计分模块,和玩家1玩家2计分模块,和玩家1相同,就不再反复介绍了。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);}p2_point_output(){inti=0;charfh,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);delscore1()/*删除目前1p分数*/{inti=0;charsh,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);依旧经过循环读取文件内比分,然后经过颜色覆盖从而达成分数改变功效,这么操作十分复杂,表现了C语言图形编程下不完善性。fclose(依旧经过循环读取文件内比分,然后经过颜色覆盖从而达成分数改变功效,这么操作十分复杂,表现了C语言图形编程下不完善性。}delscore2()/*删除目前2p分数*/{inti=0;charfh,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函数大致调用关系图注:因为函数过多且调用关系过于复杂,没措施把全部函数调用关系用图表示,所以只能将大致关系图表示出来。第4章:调试分析关键碰到问题已经在具体分析里说道,这里关键列举部分碰到部分小问题。4.1图形模块1.在图形模块中,因为是第一次使用,所以刚开始时对于棋盘创建位置把握有些欠缺。处理方案:参考书本和其它资料,找出最适宜位置坐标。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。第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语言下图形界面编程,以下是各步骤及功效截图:欢迎,帮助和结束界面主界面获胜界面(包含计分)第7章:附录 见(附录)。结论经过对各子程序设计和优化,本程序完成了五子棋软件主体设计和制作,基础达成了使用五子棋软件关键要求。然而程序还有部分不足之处,首先,程序计分模块存在些许小问题,偶然会出现不计分现象,而且还无法做到删除计分功效,其次,程序界面过于简陋,而且无法使用鼠标进行操作。最终就是程序无法实现人机对战,缺乏可玩性。附录1.源程序文件清单:Five.c(主程序)score1.txt(玩家1计分)score2.txt(玩家2计分)2.源程序/*WIN-TCBGI图形编程模板*/#include"stdio.h"#include"Conio.h"#include"graphics.h"#include<bios.h>#include<dos.h>#defineclosegrclosegraph/*定义1号玩家操作键键码*/#defineW0x1177/*上移--'W'*/#defineS0x1f73/*下移--'S'*/#defineA0x1e61/*左移--'A'*/#defineD0x2064/*右移--'D'*/#defineSP0x3920/*落子--空格键*//*定义2号玩家操作键键码*/#defineUP0x4800/*上移--方向键up*/#defineDOWN0x5000/*下移--方向键down*/#defineLEFT0x4b00/*左移--方向键left*/#defineRIGHT0x4d00/*右移--方向键right*/#defineENTER0x1c0d/*落子--回车键Enter*/#defineESC0x011b#defineY0x1579#defineN0x316e#defineBACK0xe08/*悔棋*/#defineDEL0x5300/*删除比分*/intch,dh,del;intk,i,j,n,t;inta[20][20];p1move();/*定义函数*/p2move();win();p1_point_input();p1_point_input2();p1_point_output();p2_point_input();p2_point_input2();p2_point_output();point();back();p1win();p2win();white();black();welcome();help();initialization();board();p1turn();p2turn();p1del();initgr();p2del();border();show();delborder();drawmat();restart();green();bye();delscore2();delscore1();/*全部函数定义完成*/welcome()/*欢迎界面*/{initgr();clearviewport();setcolor(2);settextstyle(0,0,6);outtextxy(180,180,"Welcome");settextstyle(0,0,2);outtextxy(240,420,"pressanykeytocontinue");getch();}bye()/*saybye~@!*/{initgr();clearviewport();setcolor(4);settextstyle(0,0,6);outtextxy(130,180,"Thankyou!");settextstyle(0,0,2);outtextxy(240,420,"pressanykeytoquit");getch();}help()/*帮助界面*/{initgr();clearviewport();setcolor(2);settextstyle(0,0,2);outtextxy(60,100,"P1move;WSAD");outtextxy(60,120,"set:space");outtextxy(60,180,"P2move:updownleftright");outtextxy(60,200,"set:Enter");outtextxy(60,240,"YoucanpressBackspacetopullback!");outtextxy(60,280,"Whenyouwanttoquitthegame,");outtextxy(60,300,"pressEsc.");outtextxy(220,440,"pressanykeytocontinue");getch();}charwu32K[]={/*以下是'五'32点阵楷体_GB2312字模,128byte*/0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3C,0x00,0x00,0x03,0xFF,0x00,0x00,0x7F,0xE0,0x00,0x00,0x02,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x06,0x38,0x00,0x00,0x07,0xFE,0x00,0x01,0xFE,0x1C,0x00,0x00,0xEC,0x18,0x00,0x00,0x08,0x18,0x00,0x00,0x18,0x18,0x00,0x00,0x18,0x30,0x00,0x00,0x10,0x30,0x00,0x00,0x30,0x30,0x00,0x00,0x30,0x30,0x00,0x00,0x20,0x7F,0xF0,0x00,0xFF,0xFF,0xF8,0x7F,0xC0,0x00,0x00,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,};charzi32K[]={/*以下是'子'32点阵楷体_GB2312字模,128byte*/0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x00,0x00,0x01,0xFE,0x00,0x00,0xFF,0x9E,0x00,0x00,0x78,0x18,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0xC0,0x00,0x00,0x03,0x80,0x00,0x00,0x01,0x80,0x00,0x00,0x01,0x83,0xF0,0x00,0x01,0xFF,0xFC,0x00,0x3F,0xF0,0x00,0x3F,0xF8,0xC0,0x00,0x1E,0x00,0xC0,0x00,0x00,0x00,0xC0,0x00,0x00,0x00,0xC0,0x00,0x00,0x00,0xC0,0x00,0x00,0x00,0xC0,0x00,0x00,0x00,0xC0,0x00,0x00,0x00,0xC0,0x00,0x00,0x00,0xC0,0x00,0x00,0x00,0xC0,0x00,0x00,0x00,0xC0,0x00,0x00,0x1D,0xC0,0x00,0x00,0x07,0xC0,0x00,0x00,0x03,0x80,0x00,0x00,0x03,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,};charqi32K[]={/*以下是'棋'32点阵楷体_GB2312字模,128byte*/0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x02,0x00,0x03,0x00,0x01,0x80,0x03,0x00,0x01,0x80,0x03,0x00,0x01,0x81,0xC3,0x00,0x01,0x81,0x83,0x00,0x01,0x80,0x83,0x00,0x01,0x80,0x83,0xE0,0x01,0x80,0xFF,0x80,0x01,0xF7,0xE3,0x00,0x0F,0xE0,0x82,0x00,0x7D,0x80,0x82,0x00,0x01,0x80,0xFA,0x00,0x03,0x80,0x82,0x00,0x03,0x80,0x82,0x00,0x07,0xF0,0xBA,0x00,0x0D,0xB0,0xC2,0x00,0x09,0x80,0x82,0x00,0x19,0x80,0x82,0xFC,0x31,0x80,0xBF,0xFE,0x21,0x9F,0xE0,0x00,0x41,0x18,0x00,0x00,0x01,0x00,0x80,0x00,0x01,0x01,0xC7,0x00,0x01,0x01,0x83,0xC0,0x01,0x03,0x00,0xE0,0x01,0x06,0x00,0x70,0x01,0x0C,0x00,0x20,0x01,0x10,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,};show()/*inputword*/{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);}}drawmat(char*mat,intmatsize,intx,inty,intcolor){inti,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);}initgr()/*BGI初始化*/{intgd=DETECT,gm=0;/*和gd=VGA,gm=VGAHI是一样效果*/registerbgidriver(EGAVGA_driver);/*注册BGI驱动后能够不需要.BGI文件支持运行*/initgraph(&gd,&gm,"");}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();}white()/*画白棋*/{setcolor(15);setfillstyle(1,15);circle(getx(),gety(),9);floodfill(getx(),gety(),15);}green()/*画绿棋*/{setcolor(13);setfillstyle(1,13);circle(getx(),gety(),9);floodfill(getx(),gety(),13);}black()/*画黑棋*/{setcolor(0);setfillstyle(1,0);circle(getx(),gety(),9);floodfill(getx(),gety(),0);}p1turn()/*画左边白棋子*/{setcolor(15);setfillstyle(1,15);circle(60,250,9);floodfill(60,250,15);settextstyle(3,0,4);outtextxy(20,280,"whiteturn");}p2turn()/*右边黑色棋子*/{setcolor(0);setfillstyle(1,0);circle(580,250,9);floodfill(580,250,0);settextstyle(3,0,4);outtextxy(540,280,"blackturn");}p1del()/*不是1turn时候抹去左边棋子*/{setfillstyle(1,9);floodfill(60,250,9);setcolor(9);settextstyle(3,0,4);outtextxy(20,280,"whiteturn");}p2del()/*不是2turn时候抹去左边棋子*/{setfillstyle(1,9);floodfill(580,250,9);setcolor(9);settextstyle(3,0,4);outtextxy(540,280,"blackturn");}p1_point_input()/*1p计分文件读取*/{FILE*fp;fp=fopen("score1.txt","r");ch=getw(fp);fclose(fp);}p1_point_input2()/*1p计分文件输入*/{FILE*fp;fp=fopen("score1.txt","r+");ch=ch+1;putw(ch,fp);fclose(fp);}p1_point_output()/*1p计分输出*/{inti=0;charsh,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);}p2_point_output(){inti=0;charfh,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);}delscore2()/*删除目前2p分数*/{inti=0;charfh,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);}point(){p1_point_input();p1_point_output();p2_point_input();p2_point_output();}delscore1()/*删除目前1p分数*/{inti=0;charsh,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);fclose(fp);}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);}back(){setcolor(6);setfillstyle(1,6);circle(getx(),gety(),9);floodfill(getx(),get

温馨提示

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

评论

0/150

提交评论