用VC++写一个五子棋游戏

运行在tubor c下的程序,最短

# include & ltstdio.h & gt

# include & ltstdlib.h & gt

# include & ltgraphics.h & gt

# include & ltbios.h & gt

# include & ltconio.h & gt

/*编译预处理,定义关键代码*/

#定义左0x4b00

#定义右0x4d00

#向下定义0x5000

#定义高达0x4800

/*如果你想在游戏中途退出,按Esc */

#定义ESC 0x011b

/*空格键表示移动*/

#定义空间0x3920

/*设置偏移量*/

#定义偏移20

#定义偏移_x 4

#定义偏移_y 3

/*定义数组大小*/

#定义编号19

/*定义全局变量*/

int状态[N][N];/*定义的数组,保存状态*/

int step_x,step _ y;/*行走坐标*/

int键;/*获取所按键盘的按键*/

int标志;/*玩家标志*/

/*自定义函数原型*/

void draw board();

void DrawCircle(int x,int y,int color);

void Alternation();

void JudgePlayer(int x,int y);

void Done();

int ResultCheck(int x,int y);

void welcome info();

void show message();

/*定义函数*/

/*显示欢迎信息功能*/

void WelcomeInfo()

{

char ch

/*将光标移动到指定位置*/

gotoxy(12,4);

/*显示欢迎信息*/

printf("欢迎来到五子棋word!");

gotoxy(12,6);

printf("1。可以用上下左右键移动棋子,“);

gotoxy(12,8);

printf("而且你移动后可以按空格键进入!");

gotoxy(12,10);

printf("2。你也可以用Esc键退出游戏!”);

gotoxy(12,12);

printf("3。不要把棋子移出棋盘!”);

gotoxy(12,14);

printf("要继续吗?(Y/N)");

ch = getchar();

/*判断程序是否应该继续*/

if(ch=='n'||ch=='N ')

/*如果不继续,启动程序*/

退出(0);

}

/*绘制棋盘功能*/

空白画板()

{

int x1,x2;

int y1,y2;

/*设置背景颜色*/

setbkcolor(2);

/*设置线条颜色*/

set color(1);

/*设置线条样式和宽度*/

setlinestyle(DOTTED_LINE,1,1);

/*根据预设的偏移量开始绘制棋盘*/

for(x1=1,y1=1,y2 = 18;x 1 & lt;=18;x1++)

line((x1+OFFSET_x)*OFFSET,(y1+OFFSET_y)*OFFSET,(x 1+OFFSET _ x)* OFFSET,(y2+OFFSET _ y)* OFFSET);

for(x1=1,y1=1,x2 = 18;y 1 & lt;=18;y1++)

line((x 1+OFFSET _ x)* OFFSET,(y1+OFFSET_y)*OFFSET,(x2+OFFSET_x)*OFFSET,(y 1+OFFSET _ y)* OFFSET);

/*将每个点的状态设置为0*/

for(x 1 = 1;x 1 & lt;=18;x1++)

for(y 1 = 1;y 1 & lt;=18;y1++)

状态[x 1][y 1]= 0;

/*显示帮助信息*/

set color(14);

/*设置字体和大小*/

settextstyle(1,0,1);

out textxy((19+OFFSET _ x)* OFFSET,(2+OFFSET_y)*OFFSET," Player key:");

set color(9);

settextstyle(3,0,1);

outtextxy((19+OFFSET _ x)* OFFSET,(4+OFFSET_y)*OFFSET," UP-UP ");

outtextxy((19+OFFSET _ x)* OFFSET,(6+OFFSET_y)*OFFSET," DOWN-DOWN ");

outtextxy((19+OFFSET _ x)* OFFSET,(8+OFFSET_y)*OFFSET,“左-左”);

out textxy((19+OFFSET _ x)* OFFSET,(10+OFFSET_y)*OFFSET,“右-右”);

out textxy((19+OFFSET _ x)* OFFSET,(12+OFFSET_y)*OFFSET," ENTER-space ");

set color(14);

settextstyle(1,0,1);

out textxy((19+OFFSET _ x)*偏移量,(14+OFFSET _ y)*偏移量," Exit:");

set color(9);

settextstyle(3,0,1);

outtextxy((19+OFFSET _ x)* OFFSET,(16+OFFSET_y)*OFFSET," ESC ");

}

/*画圆功能*/

空心绘制圆(int x,int y,int color)

{

setcolor(颜色);

/*设置绘制圆形线条的样式和宽度,设置为虚线*/

setlinestyle(SOLID_LINE,0,1);

x =(x+OFFSET _ x)* OFFSET;

y =(y+OFFSET _ y)* OFFSET;

/*画一个以(x,y)为圆心,以8为半径的圆*/

circle(x,y,8);

}

/*交换棋方格功能*/

无效交替()

{

if(flag==1)

flag = 2;

其他

flag = 1;

}

/*为不同的棋步绘制不同颜色的圆函数*/

空判断层(int x,int y)

{

if(flag==1)

DrawCircle(x,y,15);

if(flag==2)

DrawCircle(x,y,4);

}

/*判断当前棋手是否获胜的函数*/

int ResultCheck(int x,int y)

{

int j,k;

int n1,N2;

while(1)

{

/*确定水平方向是否有五个颜色相同的圆*/

n 1 = 0;

N2 = 0;

/*向左水平计数*/

for(j=x,k = y;j & gt=1;j -)

{

if(状态[j][k]= =标志)

n 1++;

其他

打破;

}

/*向右水平计数*/

for(j=x,k = y;j & lt=18;j++)

{

if(状态[j][k]= =标志)

n2++;

其他

打破;

}

if(n 1+N2-1 & gt;=5)

{

返回(1);

}

/*确定垂直方向是否有五个相同颜色的圆*/

n 1 = 0;

N2 = 0;

/*垂直向上*/

for(j=x,k = y;k & gt=1;k -)

{

if(状态[j][k]= =标志)

n 1++;

其他

打破;

}

/*垂直向下计数*/

for(j=x,k = y;k & lt=18;k++)

{

if(状态[j][k]= =标志)

n2++;

其他

打破;

}

if(n 1+N2-1 & gt;=5)

{

返回(1);

}

/*判断从左上到右下是否有五个相同颜色的圆*/

n 1 = 0;

N2 = 0;

/*左上角的数字*/

for(j=x,k = y;(j & gt= 1);& amp(k & gt=1);j -,k -)

{

if(状态[j][k]= =标志)

n 1++;

其他

打破;

}

/*右下方的数字*/

for(j=x,k = y;(j & lt= 18);& amp(k & lt=18);j++,k++)

{

if(状态[j][k]= =标志)

n2++;

其他

打破;

}

if(n 1+N2-1 & gt;=5)

{

返回(1);

}

/*判断从右上到左下是否有五个相同颜色的圆*/

n 1 = 0;

N2 = 0;

/*右上方的数字*/

for(j=x,k = y;(j & lt= 18);& amp(k & gt=1);j++,k -)

{

if(状态[j][k]= =标志)

n 1++;

其他

打破;

}

/*左下方的数字*/

for(j=x,k = y;(j & gt= 1);& amp(k & lt=18);j -,k++)

{

if(状态[j][k]= =标志)

n2++;

其他

打破;

}

if(n 1+N2-1 & gt;=5)

{

返回(1);

}

return(0);

}

}

/*执行下棋功能*/

无效完成()

{

int I;

int j;

/*根据不同的键值执行不同的操作*/

开关(钥匙)

{

/*如果向左移动*/

案例左侧:

/*如果下一步超出了棋盘的左边界,什么也不做*/

if(step _ x-1 & lt;0)

打破;

其他

{

for(i=step_x-1,j = step _ y;我& gt=1;我-)

if(状态[j]==0)

{

DrawCircle(step_x,step_y,2);

打破;

}

如果(我& lt1)

打破;

step _ x = I;

JudgePlayer(step_x,step _ y);

打破;

}

/*如果向右移动*/

案例权利:

/*如果下一步超出了棋盘的右边界,什么也不做*/

if(step _ x+1 & gt;18)

打破;

其他

{

for(i=step_x+1,j = step _ y;我& lt=18;i++)

if(状态[j]==0)

{

/*每走一步画一个圈,展示移动过程*/

DrawCircle(step_x,step_y,2);

打破;

}

如果(i & gt18)破位;

step _ x = I;

/*根据不同的棋手画不同颜色的圆圈*/

JudgePlayer(step_x,step _ y);

/*显示谁在下棋*/

打破;

}

/*如果向下移动*/

案例向下:

/*如果下一步超出了棋盘的下边界,则什么也不做*/

if((step_y+1)>18)

打破;

其他

{

for(i=step_x,j = step _ y+1;j & lt=18;j++)

if(状态[j]==0)

{

DrawCircle(step_x,step_y,2);

打破;

}

if(j & gt;18)破位;

step _ y = j;

JudgePlayer(step_x,step _ y);

打破;

}

/*如果向上移动*/

案例向上:

/*如果下一步超出了棋盘的上边界,则什么也不做*/

if((step _ y-1)& lt;0)

打破;

其他

{

for(i=step_x,j = step _ y-1;j & gt=1;j -)

if(状态[j]==0)

{

DrawCircle(step_x,step_y,2);

打破;

}

if(j & lt;1)破位;

step _ y = j;

JudgePlayer(step_x,step _ y);

打破;

}

/*如果是退出键*/

案例ESC:

打破;

/*如果可以*/

案例空间:

/*如果操作在棋盘内*/

if(step _ x & gt;=1。& ampstep _ x & lt=18。& ampstep _ y & gt=1。& ampstep _ y & lt=18)

{

/*如果棋子当前位置的状态为0*/

if(状态[步骤x][步骤y]==0)

{

/*将棋子当前位置的状态更改为flag,指示哪个棋手下了该棋*/

状态[步骤x][步骤y]=标志;

/*如果判断当前棋手获胜*/

if(结果检查(步骤x,步骤y)==1)

{

/*以指定的频率打开电脑扬声器*/

声音(1000);

/*说话人的出现时间是1秒*/

延时(1000);

nosound();

gotoxy(30,4);

setbkcolor(蓝色);

/*清除图形屏幕*/

clear device();

/*设置图形输出的当前视口*/

setviewport(100,100,540,380,1);

/*绿色实心填充*/

setfillstyle(1,2);

setcolor(黄色);

矩形(0,0,439,279);

漫填(50,50,14);

set color(12);

settextstyle(1,0,5);

/*三笔划字体,水平放大5倍*/

outtextxy(20,20,“恭喜!”);

set color(15);

settextstyle(3,0,4);

/*如果玩家1获胜,将显示获胜信息*/

if(flag==1)

{

/*无衬线字体,水平放大5倍*/

outtextxy(20,120," Player1赢得比赛!");

}

/*如果玩家1获胜,将显示获胜信息*/

if(flag==2)

{

/*无衬线字体,水平放大5倍*/

outtextxy(20,120,"玩家2赢得比赛!");

}

set color(14);

settextstyle(2,0,8);

getch();

退出(0);

}

/*如果当前棋手没有赢,交换棋手*/

交替();

/*提示棋手是谁*/

show message();

打破;

}

}

其他

打破;

}

}

/*显示象棋功能*/

void ShowMessage()

{

/*轮到Player1下棋了*/

if(flag==1)

{

set color(2);

settextstyle(1,0,1);

gotoxy(100,30);

/*覆盖原始笔迹*/

outtextxy(100,30,“轮到Player2了!”);

set color(12);

settextstyle(1,0,1);

outtextxy(100,30,“轮到Player1了!”);

}

/*轮到玩家2下棋*/

if(flag==2)

{

set color(2);

settextstyle(1,0,1);

/*覆盖原始笔迹*/

outtextxy(100,30,“轮到Player1了!”);

set color(12);

settextstyle(1,0,1);

gotoxy(100,20);

outtextxy(100,30,“轮到Player2了!”);

}

}

/*主函数*/

int main()

{

int gdriver

int gmode

int错误代码;

/*清除文本模式窗口*/

clr SCR();

/*显示欢迎信息*/

welcome info();

gdriver = DETECT

gmode = 0;

/*初始化图形系统*/

registerbgidriver(EGA VGA _ driver);//将驱动程序加载到执行程序中。方法见“独立图形程序的建立”一文。

init graph(& amp;g driver & amp;gmode,“”;

/*返回上一次不成功图形操作的错误代码*/

error code = graph result();

if (errorcode!= grOk)

{

/*根据错误代码输出错误消息字符串*/

printf(" \ n注意:grphics初始化时出错:%s\n ",grapherrormsg(Error code));

printf("按任意键退出!");

getch();

退出(1);

}

/*设置标志的初始值。默认情况下,它是Player1 first */

flag = 1;

/*画一个棋盘*/

draw board();

show message();

{

step _ x = 0;

step _ y = 0;

JudgePlayer(step_x-1,step _ y-1);

{

/*如果没有按键,bioskey(1)函数将返回0*/

while(BIOS key(1)= = 0);

/*从键盘上按键*/

key = BIOS key(0);

/*根据获得的键值下棋*/

done();

}while(键!空间与空间。& amp钥匙!= ESC);

}while(键!= ESC);

/*关闭图形系统*/

closegraph();

返回0;

}