如何用C实现黑白棋游戏

#include "graphics.h" /*图形系统头文件*/

# 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,“你们都赢了!”);

}