计算机技术基础c语言课程设计 黑白棋游戏.docx
《计算机技术基础c语言课程设计 黑白棋游戏.docx》由会员分享,可在线阅读,更多相关《计算机技术基础c语言课程设计 黑白棋游戏.docx(16页珍藏版)》请在冰点文库上搜索。
计算机技术基础c语言课程设计黑白棋游戏
计算机技术基础课程设计
C语言
设计报告
黑白棋游戏程序
一、选题背景:
随着电脑的普及以及人们对C语言的崇拜,用C语言编写一些简单的应用小程序解决实际问题变的越来越容易和方便。
平常学习有点累,就容易迷上网络游戏,所以就编写了一个小黑白棋游戏,闲暇的时候玩玩,既益智又娱乐,又不至于上瘾。
二、设计思想:
运用了C语言的各种语句(如FOR循环语句,IFELSE条件语句等)。
程序设计分三大部分:
第一部分为选择界面,可选择为人机下棋和双人下棋;第二部分为程序运行部分,解决整个程序中的关键问题和算法;第三部分为结束部分,主要是输出文档和设计者的信息。
三.程序流程图:
四.程序清单:
#include"graphics.h"
#include"stdio.h"
#defineLENsizeof(structdian)
#defineNULL0
intdian[8][8],result[10][2];/*dian[][]中存格子的状态,无子,黑子或白子*/
intN,M,s=0,K=0;
intdx,dy,key;
charCOMPUTER=0;
intcomputer=2;
structdian/*记录所有已经下的子的位置*/
{
intx;
inty;
structdian*next;
};
structdiana,*p1,*p,*head;
voidinit(void)/*初始化*/
{
intgd=DETECT,gm;
initgraph(&gd,&gm,"c:
\\tc");
cleardevice();
}
voidjiemian1(void)/*第一个界面*/
{
setlinestyle(0,0,3);
setcolor(RED);
rectangle(1,1,640,480);
setcolor(BLUE);
rectangle(3,3,638,478);
setcolor(YELLOW);
rectangle(5,5,636,476);
settextstyle(0,0,6);
setcolor(WHITE);
outtextxy(160,160,"HEIBAI");
settextstyle(0,0,1);
setcolor(BLUE);
outtextxy(210,280,"press1toplaywithcomputer");
outtextxy(210,320,"press2toplaywithanother");
do{/*选择是和人玩还是和电脑下去*/
COMPUTER=bioskey(0);
}while(COMPUTER!
='1'&&COMPUTER!
='2');
cleardevice();
}
voidqipan(void)/*画棋盘*/
{
inti;
setlinestyle(0,0,3);
setcolor(9);
for(i=0;i<=160;i+=20)
{
line(240,i+160,400,i+160);
line(i+240,160,i+240,320);
}
}
voidinsert(intx,inty)/*将下子的位置插入链表*/
{
structdian*p2;
p2=(structdian*)malloc(LEN);
p2->x=x;p2->y=y;
p1->next=p2;
p2->next=NULL;
p1=p2;
}
voidpaint(intx,inty,intt)/*画棋子*/
{
setcolor(t);
setlinestyle(0,0,1);
circle(20*x+250,20*y+170,8);
setfillstyle(SOLID_FILL,t);
floodfill(20*x+250,20*y+170,t);
}
voidjiemian2(void)/*下棋的界面*/
{
inti,j;
for(i=0;i<8;i++)
for(j=0;j<8;j++)
dian[i][j]=1;
setcolor(8);
rectangle(236,156,404,324);
setfillstyle(SOLID_FILL,6);
bar(238,158,402,322);
setcolor(3);
rectangle(8,8,160,378);
bar(10,10,158,376);
settextstyle(0,0,1);
outtextxy(20,20,"LEFT:
change");
outtextxy(20,50,"RIGHT:
change");
outtextxy(20,80,"ENTER:
play");
outtextxy(20,110,"ESC:
leave");
setcolor(RED);
outtextxy(20,200,"anythingwrong?
");
outtextxy(40,220,"E-mailme:
");
outtextxy(12,245,"renren3052@");
qipan();
a.x=3;a.y=3;a.next=NULL;dian[3][3]=0;/*刚开局时候棋盘上的四个棋子*/
p=head=&a;p1=&a;
paint(3,3,0);
insert(3,4);paint(3,4,7);dian[3][4]=7;
insert(4,3);paint(4,3,7);dian[4][3]=7;
insert(4,4);paint(4,4,0);dian[4][4]=0;
}
voidshine(intx,inty,intt)/*棋子闪烁*/
{
staticinti=0,j=0;
if(i==x&&j==y)return0;
do{
paint(x,y,t);
delay(50000);
paint(x,y,6);
delay(50000);
}while(!
kbhit());
key=bioskey(0);
i=x;j=y;
}
voidscan(intx,inty,intt)/*查找可以下子的位置或是要变颜色的棋子*/
{
intb,c,d,e,i,j,m,n,r;
K=0;
if(dian[x][y]==1)r=1;
elser=t;
b=x-1;c=x+1;d=y-1;e=y+1;
if(b<0)b=0;/*查一个子如黑子四周格子的情况,有可能出边界,把边界限制一下*/
if(c>7)c=7;
if(d<0)d=0;
if(e>7)e=7;
for(i=b;i<=c;i++)
for(j=d;j<=e;j++)
{
if(dian[i][j]==t||dian[i][j]==1)continue;
dx=i-x;dy=j-y;m=i;n=j;
while(dian[m][n]==s){m+=dx;n+=dy;}
if(dian[m][n]==r)continue;
if(m<0||m>7||n<0||n>7)continue;
result[K][0]=m;result[K][1]=n;
K++;
}
}
voidvary(intx,inty,intt)/*下子,插入链表,查找并改变需要改变颜色的棋子*/
{
inti,m,n;
if(t==0)N+=1;
elseM+=1;
paint(x,y,t);
insert(x,y);
scan(x,y,t);
dian[x][y]=t;
for(i=0;i{
dx=result[i][0]-x;
dy=result[i][1]-y;
if(dx==0)dx=0;
elsedx=dx/abs(dx);
if(dy==0)dy=0;
elsedy=dy/abs(dy);
m=x;n=y;m+=dx;n+=dy;
do{
if(t==0){N++;M--;}
else{M++;N--;}
paint(m,n,t);
dian[m][n]=t;
m+=dx;n+=dy;
}while(dian[m][n]!
=t);
}
}
voidpresskey(intt)/*按键*/
{
inti;
for(i=0;i{
if(computer)/*如果和电脑下并且这一步不是电脑下*/
do{
shine(result[i][0],result[i][1],t);/*闪烁棋子*/
}while(key!
=0x4b00&&key!
=0x4d00&&key!
=0x1c0d&&key!
=0x011b);/*如果没有按键继续闪烁*/
if(computer==0)
{
srand(time(NULL));/*电脑下棋随机选择下哪个位置*/
i=rand()%K;
}
if(computer==0||key==0x1c0d)
{
vary(result[i][0],result[i][1],t);break;
}
if(key==0x011b)exit(0);/*如果按ESC离开游戏*/
}
}
voidrun(intt)/*游戏运行*/
{
inti;
if(t==0)s=7;
if(t==7)s=0;
a:
p=head;
do{
if(dian[p->x][p->y]==s)continue;
scan(p->x,p->y,t);/*查找可以下子的地方并存在result数组中*/
if(K==0)continue;
presskey(t);
if(computer==0||key==0x1c0d)break;
}while((p=p->next)!
=NULL);
if(key==0x4b00||key==0x4d00)gotoa;
}
voidscore(void)/*显示分数*/
{
charstr1[4],str2[4];
setlinestyle(SOLID_LINE,0,THICK_WIDTH);
setcolor(3);
rectangle(4,4,636,476);
setcolor(4);
rectangle(6,6,634,474);
setfillstyle(SOLID_FILL,YELLOW);
rectangle(8,380,632,472);
setcolor(9);
rectangle(10,382,630,470);
bar(12,384,628,468);
settextstyle(0,0,2);
setcolor(6);
outtextxy(280,400,"score");
sprintf(str1,"%d",N);
sprintf(str2,"%d",M);
outtextxy(120,430,"PLAYER1");
outtextxy(260,430,str1);
outtextxy(300,430,":
");
outtextxy(330,430,str2);
if(COMPUTER=='1')outtextxy(390,430,"COMPUTER");
elseouttextxy(390,430,"PLAYER2");
}
voidwiner(void)/*胜利显示*/
{
settextstyle(0,0,4);
setcolor(9);
if(N>M)outtextxy(200,50,"player1win!
");
elseif(N");
elseouttextxy(200,50,"nowiner!
");
}
voidsoundG(void)/*结束声音*特色哦!
**/
{
inti;
for(i=20;i<=1000;i++)
{
sound(i);
delay(1500);
nosound();
}
}
voidcloseG()/*游戏结束*/
{
inti;
cleardevice();
settextstyle(1,0,6);
setcolor(YELLOW);
outtextxy(25,180,"Thankstomyteacher!
");
for(i=0;i<=1000;i++)
{
delay(1500);
}
cleardevice();
settextstyle(1,0,5);
setcolor(WHITE);
outtextxy(120,50,"ProgrammeDesiged:
");
outtextxy(230,120,"XiaoWen");
outtextxy(35,250,"E-mail:
renren3052@");
outtextxy(190,330,"QQ:
574973988");
outtextxy(228,410,"2007.01.01");
getch();
closegraph();
}
main()
{inti;
init();
jiemian1();
cleardevice();
N=2;M=2;
jiemian2();
do{
if(COMPUTER=='1')
{
if(s==0)computer=1;
elsecomputer=0;
}
score();
run(s);
}while(N+M!
=64||N==0||M==0);
score();
winer();
settextstyle(0,0,1);
outtextxy(310,95,"Doyoulikeit?
");
outtextxy(260,125,"Iamxiaowen.From050606");
soundG();
closeG();
}
五.主要解决问题的方法及技术关键:
1.主要解决问题:
用各种语句实现棋盘函数,下子位置链表插入函数,画棋子函数,下棋界面函数,棋子闪烁函数,下子位置函数,按键函数,运行函数,显示分数函数,胜负函数,声音函数等。
2.技术关键:
调用了graphics.h函数,使界面更生动。
利用if,for等语句实现了键盘方向控制。
使用子函数调用,使程序模块化,易于理解。
六.总结、设计结果说明:
1.设计优点:
本程序简单明了,只是利用简单的语句解决问题。
例如在调用下子运行的函数时,利用了很多的for循环和if语句。
而且,运行出的结程序有各种颜色的显示,又有声音,令人心旷神怡。
2.设计不足:
该程序有点冗长,有些语句不够简洁。
对于程序冗长,需要继续改进,及循环的集中,对于功能不够强大,是由于现在能力限制,时间仓促,等以后多学了响应的知识,力求将程序趋于完美。