黑白棋程序设计.docx
《黑白棋程序设计.docx》由会员分享,可在线阅读,更多相关《黑白棋程序设计.docx(18页珍藏版)》请在冰豆网上搜索。
黑白棋程序设计
课程设计任务书
学院
理学院
专业
统计学
学生姓名
班级学号
课程设计题目
黑白棋程序设计
实践教学要求与任务:
1、进一步培养学生结构化程序设计的思想,加深对高级语言基本语言要素和控制结构的理解;
2、针对C语言中的重点和难点内容进行训练,独立完成有一定工作量的程序设计任务,同时强调好的程序设计风格。
3、掌握C语言的编程技巧及程序设计的常用算法
设计任务:
本次设计主要实现黑白棋游戏的系统程序
该程序主要实现与黑白棋有关的包括棋盘绘制,棋子绘制,双方执棋下子,统计双方分数,比较,输出输赢等一系列程序,实现在该程序中能够正常进行双方对弈的功能。
工作计划与进度安排:
第一天查阅资料;第二、三天程序设计;第四天程序调试;第五天答辩
指导教师:
201年月日
专业负责人:
201年月日
学院教学副院长:
201年月日
摘要
程序设计语言类课程的指导思想是:
使学生通过学习即高级编程语言的知识、编程技术和基本算法,又掌握程序设计的思想和方法,更具备利用计算机求解实际问题的能力,能灵活运用高级语言进行程序设计[6]。
其实认真学习一门语言并不困难,关键要所追求的学习的方法和途径。
一条好的途径便于快速掌握,熟悉运用语言。
学习的目的在于应用,理论来源于实践,如果在学习中能够通过有效的途径如自己动手设计一个功能比较前大的开发系统,借鉴于各种工具书,善于总结。
定可以很好的效果。
正是如此,使我们在这几年中对语言学习有了很大提高。
通过实践的学习,我认到学好计算机要重视实践操作,不仅仅是学习C语言,还是其它的语言,以及其它的计算机方面的知识都要重在实践,所以后在学习过程中,我会更加注视实践操作,使自己便好地学好计算机。
关键词:
掌握编程语言的知识;编程技术;基本算法思想和方法
黑白棋44
2.1.用到的函数:
4
2.1.1main()主函数:
4
2.1.2DrawQp()画棋盘函数:
4
2.1.3MoveColor()恢复原来格子的状态4
2.1.4playtoplay()人人对战函数4
2.1.5QpChange()判断棋盘变化4
2.1.6PrintScore()输出成绩5
2.2.子函数功能一览表5
2.3.主函数流程图6
2.3.1棋盘绘制流程图6
2.4.函数解析7
2.4.1图形库文件7
2.4.2图形初始化函数7
2.4.3设置背景颜色7
2.4.4画线7
2.4.5设置填充模式和颜色7
2.4.6方向操作7
2.4.7落棋位置判断8
2.4.8判断棋盘的变化和改变棋子的颜色8
2.4.9成绩输出8
2.4.10输出成绩8
2.4.11输出最后的胜利者结果8
u2.5.源代码9
u2.6运行结果17
u2.7心得体会17
参考文献18
黑白棋
2.1.用到的函数:
2.1.1main()主函数:
在主函数中,棋盘状态用数组a[8][8],初值为0,表示空格。
用图形系统画出棋盘,调用playtoplay()人人对弈函数开始游戏,一旦游戏结束后,关闭图形系统,程序结束。
2.1.2DrawQp()画棋盘函数:
背景颜色设为蓝色,从坐标(100,100)开始每隔40个单位用白色画一条水平直线,一条垂直线,构成棋盘,用循环语句实现。
以x和y为圆心,xradius和yradius为水平和垂直轴画一填充椭圆,当xradius和yradius相等时,则画出的是圆,用它表示棋子。
SetPlayColor()设置棋子的颜色:
函数的参数为整型变量t,根据t的值来设计填充棋子的当前颜色,值为1代表白棋,值为2代表黑棋。
2.1.3MoveColor()恢复原来格子的状态
因为棋子移动过程并没有改变数组元素的值,所以可以根据数组元素的值判定原来的状态,如果值是1,就恢复白色棋子,值是2则恢复黑色棋子,否则恢复蓝色空格。
2.1.4playtoplay()人人对战函数
这是游戏进行的函数,主要是接收棋手的按键消息,按Esc键程序可以随时结束。
按上下左右光标键,则改变棋子移动的坐标值。
按回车键后判断。
2.1.5QpChange()判断棋盘变化
当棋手按回车键落子后,就要分别往8个方向判断是否包围住对方棋子,如果是,则改变棋盘。
如果所有方向都判断过,并且没有引起棋盘的变化,则棋盘变化标志值yes为0,返回yes,结束本函数。
根据当前数组元素的值判断分数,也就是各方棋子的个数,如果数组元素值为1,白棋棋子数累加;如果数组元素值为2,则黑棋棋子数累加。
2.1.6PrintScore()输出成绩
利用设置实体填充模式填充矩形条清除掉前次的成绩,再利用sprintf()函数将整数转换为字符串的形式,再利用outtextxy()函数将成绩输出。
playWin()输出胜利者结果根据分数值score1和score2的大小得出下棋的结果,输出赢者信息
2.2.子函数功能一览表
序号
1
2
3
4
5
6
名称
DrawQp
SetPlay
Playtoplay
MoveColor
QpChange
DoScore
功能
绘制棋盘和初始棋子
设置棋子第一次的颜色
人人对战函数
恢复原来棋盘状态
判断棋盘的变化改变棋子的颜色
处理分数
备注
在界面上绘制320*320的棋盘,并在棋盘中绘制8*8的格子,初始棋子
先走棋者持白子,后走棋黑子,每次交替
俩棋手交替走棋,定义键盘操作等
棋子由初始位置到落子位置的路径不改变颜色
走棋后判断棋盘的变化情况,根据变化情况判断是否可以输出分数
根据棋盘上旗子的多少进行分数的处理
2.3.主函数流程图
2.3.1棋盘绘制流程图
2.4.函数解析
2.4.1图形库文件
#include"graphics.h"
2.4.2图形初始化函数
intgd=DETECT,gr
图形初始化函数initgraph(&driver,&mode,“路径”)功能:
装入图形驱动程序
2.4.3设置背景颜色
在本程序中,设置的的北京颜色为蓝色,setbkcolor(BLUE),根据上述可知,此时,游戏界面的底色为蓝色。
setcolor(0)将线的颜色设置为黑色,由此是为了取消圆形周围的东西。
2.4.4画线
在本程序中,使用上述源代码实现绘制棋盘的功能,也就是以40为一个步增,以(100,100)为起点,以(100,420)、(420,100)(420,420)为顶点画出棋盘,棋盘大下为320*320,由于步增是40,所以,棋盘上自然出现8*8的格子,由于画线的时候,没有定义线的颜色,所以线的颜色是默认的白色,所以最终出现了兰色的底面上以白色画格子的棋盘。
2.4.5设置填充模式和颜色
在本程序中,棋子为半径为15的圆,颜色分别为代码为15和8的深灰色和白色两种棋子,分别由两位旗手来使用。
附表:
颜色代号
颜色号
0
1
15
颜色
黑色
蓝色
白色
符号常量
BLACK
BLUE
WHITE
2.4.6方向操作
在主程序前,使用宏定义将UP、DOWN、LEFT、RIGHT,做了相应的定义,因此,在对战函数当中可以使用已经进行过定义的以上四个进行操作,每次移动后,在屏幕上显示的都是一个以15为半径的圆形。
由于走棋时,每个格子不能重复落子,所以,需要判断棋手要落子处是不是已经有了棋子
2.4.7落棋位置判断
走棋后,判断棋盘的变化情况,将棋子途径的地方恢复为空格状态,并且开始统计棋手的尝试次数,当一个棋手在一次走棋的过程中尝试的次数超过空格的个数的时候,取消该棋手的本次走棋,改为下个旗手走棋,也就是跳出本次循环,进行下一次的循环。
如果常识的次数没有超过空格的个数,而是落棋的位置无效,则旗手可以继续尝试,知道到达尝试次数。
当某次走棋后,接受的按键的值为ESC的时候,则退出游戏,当落子后在判定棋盘的变化时,一方的棋子为0,或者是双方已经下满60手,则执行playWin函数,输出游戏的结果。
2.4.8判断棋盘的变化和改变棋子的颜色
通过判断数a[i][j]的值来判断棋子的颜色,已经定义当a[i][j]=1的时候,棋子为白色,当a[i][j]=2的时候棋子为黑色,当a[i][j]的值不为1和2的时候,则此时恢复为背景
2.4.9成绩输出
清空之前的成绩,a[i][j]==1/2?
;Score2++;Score1++;Score2++>Score1++?
?
黑色胜利,全部胜利=?
白色胜利
2.4.10输出成绩
在统计完得分后,分别在(550,200)和(550,300)俩个地方输出参与游戏的俩个人的分数信息。
2.4.11输出最后的胜利者结果
黑子胜利,在(100,50)的位置上输出blackwin,白子获得胜利,在(100,50)的位置上输出“whitewin”,当出现得分相同的情况时,在(60,50)的位置上输出“youallwin!
”。
u2.5.源代码
#include"graphics.h"
#defineLEFT0x4b00
#defineRIGHT0x4d00
#defineDOWN0x5000
#defineUP0x4800
#defineESC0x011b
#defineENTER0x1c0d
inta[8][8]={0},key,score1,score2;
charplayone[3],playtwo[3];
voidplaytoplay(void);
voidDrawQp(void);/*画棋盘函数*/
voidSetPlayColor(intx);
voidMoveColor(intx,inty);
intQpChange(intx,inty,intz);/
voidDoScore(void);
voidPrintScore(intn);/
voidplayWin(void);/
voidmain(void)
{
intgd=DETECT,gr;
initgraph(&gd,&gr,"c:
\\tc");
DrawQp();
playtoplay();/*人人对战*/
getch();
closegraph();
}
voidDrawQp()
{
inti,j;
score1=score2=0;
setbkcolor(BLUE);
for(i=20;i<=600;i+=30)
{
line(20,i,600,i);
line(i,20,i,600);
}
setcolor(0);
setfillstyle(SOLID_FILL,15);
fillellipse(500,200,15,15);
setfillstyle(SOLID_FILL,8);
fillellipse(500,300,15,15);
a[3][3]=a[4][4]=1;
a[3][4]=a[4][3]=2;
setfillstyle(SOLID_FILL,WHITE);
fillellipse(120+3*40,120+3*40,15,15);
fillellipse(120+4*40,120+4*40,15,15);
setfillstyle(SOLID_FILL,8);
fillellipse(120+3*40,120+4*40,15,15);
fillellipse(120+4*40,120+3*40,15,15);
score1=score2=2;
DoScore();
}
voidplaytoplay()
{
intx,y,t=1,i,j,cc=0;
while
(1)
{
x=120,y=80;
while
(1)
{
PrintScore
(1);
PrintScore
(2);
SetPlayColor(t);
fillellipse(x,y,15,15);
key=bioskey(0);
if(key==ESC)
break;
else
if(key==ENTER)
{
if(y!
=80&&a[(x-120)/40][(y-120)/40]!
=1
&&a[(x-120)/40][(y-120)/40]!
=2)
{
if(t%2==1)
a[(x-120)/40][(y-120)/40]=1;
else
a[(x-120)/40][(y-120)/40]=2;
if(!
QpChange(x,y,t))
{
a[(x-120)/40][(y-120)/40]=0;
cc++;
if(cc>=64-score1-score2)
{
MoveColor(x,y);
fillellipse(x,y,15,15);
break;
}
else
continue;
}
DoScore();
break;
}
else
continue;
}
else
if(key==LEFT&&x>120)
{
MoveColor(x,y);
fillellipse(x,y,15,15);
SetPlayColor(t);
x-=40;
fillellipse(x,y,15,15);
}
else
if(key==RIGHT&&x<400&&y>80)
{
MoveColor(x,y);
fillellipse(x,y,15,15);
SetPlayColor(t);
x+=40;
fillellipse(x,y,15,15);
}
else
if(key==UP&&y>120)
{
MoveColor(x,y);
fillellipse(x,y,15,15);
SetPlayColor(t);
y-=40;
fillellipse(x,y,15,15);
}
else
if(key==DOWN&&y<400)
{
MoveColor(x,y);
fillellipse(x,y,15,15);
SetPlayColor(t);
y+=40;
fillellipse(x,y,15,15);
}
}
if(key==ESC)
break;
if((score1+score2)==64||score1==0||score2==0)
{
playWin();
break;
}
t=t%2+1;
cc=0;
}/*endwhile*/
}
voidSetPlayColor(intt)
{
if(t%2==1)
setfillstyle(SOLID_FILL,15);
else
setfillstyle(SOLID_FILL,8);
}
voidMoveColor(intx,inty)
{
if(y<100)
setfillstyle(SOLID_FILL,BLUE);
else
switch(a[(x-120)/40][(y-120)/40])
{
case1:
setfillstyle(SOLID_FILL,15);break;
case2:
setfillstyle(SOLID_FILL,8);break;
default:
setfillstyle(SOLID_FILL,BLUE);
}
}
intQpChange(intx,inty,intt)
{
inti,j,k,kk,ii,jj,yes;
yes=0;
i=(x-120)/40;
j=(y-120)/40;
SetPlayColor(t);
if(j<6)/*往右边*/
{
for(k=j+1;k<8;k++)
if(a[i][k]==a[i][j]||a[i][k]==0)
break;
if(a[i][k]!
=0&&k<8)
{
for(kk=j+1;kk{
a[i][kk]=a[i][j];
fillellipse(120+i*40,120+kk*40,15,15);
}
if(kk!
=j+1)
yes=1;
}
}
if(j>1)
{
for(k=j-1;k>=0;k--)
if(a[i][k]==a[i][j]||!
a[i][k])
break;
if(a[i][k]!
=0&&k>=0)
{
for(kk=j-1;kk>k&&k>=0;kk--)
{
a[i][kk]=a[i][j];
fillellipse(120+i*40,120+kk*40,15,15);
}
if(kk!
=j-1)
yes=1;
}
}
if(i<6)
{
for(k=i+1;k<8;k++)
if(a[k][j]==a[i][j]||!
a[k][j])
break;
if(a[k][j]!
=0&&k<8)
{
for(kk=i+1;kk{
a[kk][j]=a[i][j];
fillellipse(120+kk*40,120+j*40,15,15);
}
if(kk!
=i+1)
yes=1;
}
}
if(i>1)
{
for(k=i-1;k>=0;k--)
if(a[k][j]==a[i][j]||!
a[k][j])
break;
if(a[k][j]!
=0&&k>=0)
{
for(kk=i-1;kk>k&&k>=0;kk--)
{
a[kk][j]=a[i][j];
fillellipse(120+kk*40,120+j*40,15,15);
}
if(kk!
=i-1)
yes=1;
}
}
if(i>1&&j<6)
{
for(k=i-1,kk=j+1;k>=0&&kk<8;k--,kk++)
if(a[k][kk]==a[i][j]||!
a[k][kk])
break;
if(a[k][kk]&&k>=0&&kk<8)
{
for(ii=i-1,jj=j+1;ii>k&&k>=0;ii--,jj++)
{
a[ii][jj]=a[i][j];
fillellipse(120+ii*40,120+jj*40,15,15);
}
if(ii!
=i-1)
yes=1;
}
}
if(i<6&&j>1)
{
for(k=i+1,kk=j-1;k<8&&kk>=0;k++,kk--)
if(a[k][kk]==a[i][j]||!
a[k][kk])
break;
if(a[k][kk]!
=0&&k<8&&kk>=0)
{
for(ii=i+1,jj=j-1;ii{
a[ii][jj]=a[i][j];
fillellipse(120+ii*40,120+jj*40,15,15);
}
if(ii!
=i+1)
yes=1;
}
}
if(i>1&&j>1)
{
for(k=i-1,kk=j-1;k>=0&&kk>=0;k--,kk--)
if(a[k][kk]==a[i][j]||!
a[k][kk])
break;
if(a[k][kk]!
=0&&k>=0&&kk>=0)
{
for(ii=i-1,jj=j-1;ii>k&&k>=0;ii--,jj--)
{
a[ii][jj]=a[i][j];
fillellipse(120+ii*40,120+jj*40,15,15);
}
if(ii!
=i-1)
yes=1;
}
}
if(i<6&&j<6)
{
for(k=i+1,kk=j+1;kk<8&&kk<8;k++,kk++)
if(a[k][kk]==a[i][j]||!
a[k][kk])
break;
if(a[k][kk]!
=0&&kk<8&&k<8)
{
for(ii=i+1,jj=j+1;ii{
a[ii][jj]=a[i][j];
fillellipse(120+ii*40,120+jj*40,15,15);
}
if(ii!
=i+1)
yes=1;
}
}
returnyes;
}
voidDoScore()
{
inti,j;
score1=score2=0;
for(i=0;i<8;i++)
for(j=0;j<8;j++)
if(a[i][j]==1)
score1++;
else
if(a[i][j]==2)
score2++;
}
voidPrintScore(intplaynum)
{
if(playnum==1)
{
setfillstyle(SOLID_FILL,BLUE);
bar(550,100,640,400);
}
setcolor(RED);
settextstyle(0,0,4);
if(playnum==1)
{
sprintf(playone,"%d",score1);
outtextxy(550,200,playone);
}
else
{
sprintf(playtwo,"%d",score2);
outtextxy(550,300,playtwo);
}
setcolor(0);
}
voidplayWin()
{
settextstyle(0,0,4);
setcolor(12);
if(score2>score1)
outtextxy(100,50,"blackwin!
");
else
if(score2outtextxy(100,50,"whitewin!
");
else
outtextxy(60,50,"youallwin!
");
key=bioskey(0);
key=key&0xff?
key&0xff:
key>>8;
return(key);
}
u2.6运行结果
u2.7心得体会
在这次课程设计中,我深深地感受到了C语言的博大精深,从中知道了好多之前不知的知识。
比如,用C语言还可以制作出有图形化,有色彩的界面,之前都只是以为C语言制作出来的程序的运行界面是一片黑屏,没有什么有趣的东西,老想着那个黑屏下能做出什么方便用户操作的界面呢?
但通过这次课程设计,我清楚地得到了答案,用C语言做出的程序是很实用的,运行效率是很高的。
在这次课程设计中,我对程序做了一些扩展:
A.采用类似图形化的界面,运用一些屏幕操作函数对程序运行界面进行一些美化,使程序运行时会出现欢迎界面,运行界面,退出界面,在运行界面中,有输入、输出窗口,还有菜单窗口、操作信息提示窗口、这些窗口在程序运行过程中的位置是固定的,使信息可以在相对应的窗口内进行输入、输出,改变了以往程序运行界面从上到下进行输入或输出信息的单一窗口界面形式。
使程序运行时出现了多窗口。
B.在程序中调用一个时间函数,使程序运行窗口的右上角显示出了当前的系统时间。
在这次设计中,学到的知识很多,但要学知识也很多。
在以后的学习中,我会努力地扩展C语言,加深对C语言的学习
参考文献
[1]谭浩