用VC++写一个五子棋游戏
# 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;
}