如何用C实现黑白棋游戏
# define Left 0x4b 00/*左光标值*/
# define Right 0x4d 00/*右光标值*/
#定义光标下的向下0x5000 /*键值*/
#在游标上定义UP 0x4800 /*键值*/
#定义ESC 0x011b/* ESC键值*/
# define ENTER 0x 1c0d/* ENTER key value */
int a[8][8]={0},key,score1,score2/*用于存储棋子的特定分数、密钥和变量*/
char playone[3],playtwo[3];/*两个人的分数转换成字符串输出*/
void play play(void);/*每个人与函数*/
void draw qp(void);/*绘制棋盘功能*/
void SetPlayColor(int x);/*首次设置棋子的颜色*/
void MoveColor(int x,int y);/*恢复原来的棋盘状态*/
int QpChange(int x,int y,int z);/*判断棋盘的变化*/
void DoScore(void);/*处理分数*/
void print score(int n);/*输出结果*/
void playWin(无效);/*输出获奖者信息*/
/* * * * * *主要功能* * * * * * */
无效总管(无效)
{
int gd=DETECT,gr;
init graph(& amp;gd,& ampgr," c:\ \ TC ");/*初始化图形系统*/
draw qp();/*画一个棋盘*/
play toplay();/*每个人都玩*/
getch();
closegraph();/*关闭图形系统*/
}
Void DrawQp()/*画一个棋盘*/
{
int i,j;
score 1 = score 2 = 0;/*选手都是0分*/
setbkcolor(蓝色);
for(I = 100;我& lt=420;i+=40)
{
行(100,I,420,I);/*画一条水平线*/
行(我,100,我,420);/*画一条垂直线*/
}
set color(0);/*取消一个圆周围的圆*/
setfillstyle(SOLID_FILL,15);/*白色固体填充模式*/
filllellipse(500,200,15,15);/*在显示分数的地方画象棋*/
setfillstyle(SOLID_FILL,8);/*黑色实心填充模式*/
filllellipse(500,300,15,15);
a[3][3]= a[4][4]= 1;/*初始两个黑棋*/
a[3][4]= a[4][3]= 2;/*初始两盘白棋*/
setfillstyle(SOLID_FILL,白色);
filllellipse(120+3*40,120+3 * 40,15,15);
filllellipse(120+4*40,120+4 * 40,15,15);
setfillstyle(SOLID_FILL,8);
filllellipse(120+3 * 40,120+4*40,15,15);
filllellipse(120+4 * 40,120+3*40,15,15);
score 1 = score 2 = 2;/*下棋后改分数*/
DoScore();/*输出起始分数*/
}
Void playtoplay()/*每个人都玩*/
{
int x,y,t=1,I,j,cc = 0;
While(1)/*棋手移动*/
{
x=120,y = 80/*每个棋子开始出来的坐标,其中X是行坐标,Y是列坐标*/
While(1) /*一个棋手的具体过程*/
{
print score(1);/*输出玩家1的分数*/
print score(2);/*输出玩家2的结果*/
SetPlayColor(t);/*t变量用于判断玩家手中棋子的颜色*/
filllellipse(x,y,15,15);
key = BIOS key(0);/*接收按钮*/
If(key==ESC)/*跳出游戏*/
打破;
其他
If(key==ENTER)/*如果按OK,可以跳出循环*/
{
如果(y!= 80 & amp& ampa[(x-120)/40][(y-120)/40]!=1
& amp& ampa[(x-120)/40][(y-120)/40]!=2)/*如果移动位置没有工件*/
{
If(t%2==1)/*如果玩家移动1 */
a[(x-120)/40][(y-120)/40]= 1;
Else/*否则参与人2移动*/
a[(x-120)/40][(y-120)/40]= 2;
如果(!QpChange(x,y,t))/*判断移动后棋盘的变化*/
{
a[(x-120)/40][(y-120)/40]= 0;/*恢复空白状态*/
cc++;/*开始计算尝试次数*/
if(cc & gt;=64-score1-score2) /*如果试图超过空格数,则停止*/
{
MoveColor(x,y);
filllellipse(x,y,15,15);
打破;
}
其他
继续;/*如果密钥无效*/
}
DoScore();/*分数的变化*/
打破;/*如果棋盘变了,就轮到对方下棋*/
}
否则/*如果已经有棋子,继续按键*/
继续;
}
Else /*四个方向按钮的判断*/
if(key = = LEFT & amp;& ampx & gt120)/*左箭头键*/
{
MoveColor(x,y);
filllellipse(x,y,15,15);
SetPlayColor(t);
x-= 40;
filllellipse(x,y,15,15);
}
其他
if(key = = RIGHT & amp;& ampx & lt400 & amp& ampy & gt80)/*右箭头键*/
{
MoveColor(x,y);
filllellipse(x,y,15,15);
SetPlayColor(t);
x+= 40;
filllellipse(x,y,15,15);
}
其他
if(key = = UP & amp;& ampy & gt120)/*向上箭头*/
{
MoveColor(x,y);
filllellipse(x,y,15,15);
SetPlayColor(t);
y-= 40;
filllellipse(x,y,15,15);
}
其他
if(key = = DOWN & amp;& ampy & lt400)/*向下箭头*/
{
MoveColor(x,y);
filllellipse(x,y,15,15);
SetPlayColor(t);
y+= 40;
filllellipse(x,y,15,15);
}
}
If(key==ESC)/*结束游戏*/
打破;
如果((score 1+score 2)= = 64 | | | score 1 = = 0 | | score 2 = = 0)/*格满或一个棋子为0判断胜负*/
{
playWin();/*输出最终结果*/
打破;
}
t = t % 2+1;/*一方走后,改变棋子颜色,即轮到另一方走*/
cc = 0;/*计数值恢复为0*/
} /*endwhile*/
}
Void SetPlayColor(int t)/*设置棋子颜色*/
{
if(t%2==1)
setfillstyle(SOLID_FILL,15);/*白色*/
其他
setfillstyle(SOLID_FILL,8);/*灰色*/
}
Void MoveColor(int x,int y)/*一步后恢复原始网格状态*/
{
if(y & lt;100)/*如果从起点出发,会变回蓝色*/
setfillstyle(SOLID_FILL,蓝色);
Else/*其他情况下,如果是1,还原白棋盘,2还原黑棋盘,或者还原蓝棋盘*/
开关(a[(x-120)/40][(y-120)/40])
{
案例1:
setfillstyle(SOLID_FILL,15);打破;/*白色*/
案例二:
setfillstyle(SOLID_FILL,8);打破;/*黑色*/
默认值:
setfillstyle(SOLID_FILL,蓝色);/*蓝色*/
}
}
Int QpChange(int x,int y,int t)/*判断棋盘的变化*/
{
int i,j,k,kk,ii,jj,yes
是= 0;
I =(x-120)/40;/*计算数组元素的行下标*/
j =(y-120)/40;/*计算数组元素的列下标*/
SetPlayColor(t);/*设置棋子的变色*/
/*开始判断八个方向的变化*/
if(j & lt;6)/*向右*/
{
for(k = j+1;k & lt8;k++)
if(A[I][k]= = A[I][j]| | A[I][k]= = 0)/*遇到自己的棋子或空格时结束*/
打破;
如果(a[i][k]!= 0 & amp& ampk & lt8)
{
for(kk = j+1;kk & ltk & amp& ampk & lt8;Kk++)/*判断正确*/
{
a[I][kk]= a[I][j];/*改变棋子的颜色*/
filllellipse(120+I * 40,120+kk*40,15,15);
}
如果(kk!=j+1) /*如果满足条件,部分棋子已经变色*/
是= 1;
}
}
if(j & gt;1)/*判断左边*/
{
for(k = j-1;k & gt=0;k -)
if(a[i][k]==a[i][j]||!a[i][k])
打破;
如果(a[i][k]!= 0 & amp& ampk & gt=0)
{
for(kk = j-1;kk & gtk & amp& ampk & gt=0;kk -)
{
a[I][kk]= a[I][j];
filllellipse(120+I * 40,120+kk*40,15,15);
}
如果(kk!=j-1)
是= 1;
}
}
如果(我& lt6)/*判断底部*/
{
for(k = I+1;k & lt8;k++)
if(a[k][j]==a[i][j]||!a[k][j])
打破;
if(a[k][j]!= 0 & amp& ampk & lt8)
{
for(kk = I+1;kk & ltk & amp& ampk & lt8;kk++)
{
a[kk][j]= a[I][j];
filllellipse(120+kk * 40,120+j*40,15,15);
}
如果(kk!=i+1)
是= 1;
}
}
如果(i & gt1)/*以上判断*/
{
for(k = I-1;k & gt=0;k -)
if(a[k][j]==a[i][j]||!a[k][j])
打破;
if(a[k][j]!= 0 & amp& ampk & gt=0)
{
for(kk = I-1;kk & gtk & amp& ampk & gt=0;kk -)
{
a[kk][j]= a[I][j];
filllellipse(120+kk * 40,120+j*40,15,15);
}
如果(kk!=i-1)
是= 1;
}
}
如果(i & gt1。& ampj & lt6)/*右上*/
{
for(k=i-1,kk = j+1;k & gt= 0 & amp& ampkk & lt8;k -,kk++)
if(a[k][kk]==a[i][j]||!a[k][kk])
打破;
如果(a[k][kk]& amp;& ampk & gt= 0 & amp& ampkk & lt8)
{
for(ii=i-1,jj = j+1;ii & gtk & amp& ampk & gt=0;ii -,jj++)
{
a[ii][jj]= a[I][j];
filllellipse(120+ii * 40,120+jj*40,15,15);
}
如果(ii!=i-1)
是= 1;
}
}
如果(我& lt6 & amp& ampj & gt1)/*左下方*/
{
for(k=i+1,kk = j-1;k & lt8 & amp& ampkk & gt=0;k++,kk -)
if(a[k][kk]==a[i][j]||!a[k][kk])
打破;
如果(a[k][kk]!= 0 & amp& ampk & lt8 & amp& ampkk & gt=0)
{
for(ii=i+1,jj = j-1;ii & ltk & amp& ampk & lt8;ii++,jj -)
{
a[ii][jj]= a[I][j];
filllellipse(120+ii * 40,120+jj*40,15,15);
}
如果(ii!=i+1)
是= 1;
}
}
如果(i & gt1。& ampj & gt1)/*左上*/
{
for(k=i-1,kk = j-1;k & gt= 0 & amp& ampkk & gt=0;k -,kk -)
if(a[k][kk]==a[i][j]||!a[k][kk])
打破;
如果(a[k][kk]!= 0 & amp& ampk & gt= 0 & amp& ampkk & gt=0)
{
for(ii=i-1,jj = j-1;ii & gtk & amp& ampk & gt=0;ii -,jj -)
{
a[ii][jj]= a[I][j];
filllellipse(120+ii * 40,120+jj*40,15,15);
}
如果(ii!=i-1)
是= 1;
}
}
如果(我& lt6 & amp& ampj & lt6)/*右下方*/
{
for(k=i+1,kk = j+1;kk & lt8 & amp& ampkk & lt8;k++,kk++)
if(a[k][kk]==a[i][j]||!a[k][kk])
打破;
如果(a[k][kk]!= 0 & amp& ampkk & lt8 & amp& ampk & lt8)
{
for(ii=i+1,jj = j+1;ii & ltk & amp& ampk & lt8;ii++,jj++)
{
a[ii][jj]= a[I][j];
filllellipse(120+ii * 40,120+jj*40,15,15);
}
如果(ii!=i+1)
是= 1;
}
}
返回yes/*返回棋子的颜色是否被改变*/
}
Void DoScore()/*处理分数*/
{
int i,j;
score 1 = score 2 = 0;/*重新开始评分*/
for(I = 0;我& lt8;i++)
for(j = 0;j & lt8;j++)
If(a[i][j]==1)/*分别统计两个人的分数*/
score 1++;
其他
if(a[i][j]==2)
score 2++;
}
void print score(int playnum)/* output score */
{
If(playnum==1)/*清除以前的成就*/
{
setfillstyle(SOLID_FILL,蓝色);
吧(550,100,640,400);
}
setcolor(红色);
settextstyle(0,0,4);/*设置文本输出样式*/
If(playnum==1)/*确定输出哪个玩家的点数,在不同的位置输出*/
{
sprintf(季后赛,“%d”,得分1);
outtextxy(550,200,季后赛);
}
其他
{
sprintf(playtwo,“%d”,score 2);
outtextxy(550,300,play two);
}
set color(0);
}
Void playWin()/*输出最终赢家结果*/
{
settextstyle(0,0,4);
set color(12);
if(score 2 & gt;Score1)/*开始判断最终结果*/
outtextxy(100,50,“黑赢!”);
其他
if(score 2 & lt;得分1)
outtextxy(100,50,“白胜!”);
其他
outtextxy(60,50,“你们都赢了!”);
}