急求这个五子棋的悔棋功能。
#include<graphics.h>#define N 20
/*定义键盘*/
#define up 0x4800
#define down 0x5000
#define left 0x4b00
#define right 0x4d00
#define esc 0x011b
#define enter 0x1c0d
#define A 0x1e61
#define S 0x1f73
#define D 0x2064
#define W 0x1177
#define space 0x3920
#define Y 0x1579
#define R 0x1372
#define n 0x316e
int gamespeed=5000;
int i,j,key;
struct Chess
{
int x;
int y;/*x,y表示当前光标的位置*/
int yes[N][N];/* 0表示无棋子,1表示棕色棋子,2表示红色棋子*/
int kao;/* 1表示棕棋准备落子,2表示红棋落子*/
int ok;/*1表示棕棋胜出,2表示红棋胜出*/
}chess;
void init(void) /*图形模式初始化*/
{
int driver=DETECT,mode=0; /*mode=0时,线时将所画位置的原来信息覆盖了*/
registerbgidriver(EGAVGA_driver);/*建立独立图形运行程序*/
initgraph(&driver,&mode,"");
}
void show(void)/*当有一方胜出时、输入作者:黄敏旋*/
{
outtextxy(50,30,"The Quintet Game design by Huang Minxuan");
}
void drawqp(void)/*画棋盘*/
{ setbkcolor(DARKGRAY);/*背景色为淡灰色*/
setcolor(14);/*线为黄色*/
for(i=50;i<=(N-1)*20+30;i+=20)
{
line(50,i,(N-1)*20+30,i);
line(i,50,i,(N-1)*20+30); /*画线*/
}
setcolor(4);/*光标点为红色*/
for(i=1;i<3;i++)
{
circle((N-1)*10+40,(N-1)*10+40,i);/*画中心光标*/
}}
void clew(void) /*不同玩家的棋子用不同的方向键走*/
{
setcolor(6);
settextstyle(0,0,1);
outtextxy(410,20,"1P:Up Down Left Right Enter");/*在坐标(410,20)处输出字符串*/
outtextxy(410,40,"2P: W S A D Space" ); /*在坐标(410,40)处输出字符串*/
}
void place(void)/*画出光标的位置*/
{
line(chess.x-10,chess.y-10,chess.x-7,chess.y-10);
line(chess.x-10,chess.y-10,chess.x-10,chess.y-7);
line(chess.x-10,chess.y+10,chess.x-10,chess.y+7);
line(chess.x-10,chess.y+10,chess.x-7,chess.y+10);
line(chess.x+10,chess.y-10,chess.x+10,chess.y-7);
line(chess.x+10,chess.y-10,chess.x+7,chess.y-10);
line(chess.x+10,chess.y+10,chess.x+7,chess.y+10);
line(chess.x+10,chess.y+10,chess.x+10,chess.y+7);
}
void win(void)/*判断是否胜出*/
{ for(i=1;i<N;i++)
{ for(j=1;j<N;j++)
{
if(((j+4)<N&&chess.yes[i][j]!=0&&
chess.yes[i][j]==chess.yes[i][j+1]&&
chess.yes[i][j+1]==chess.yes[i][j+2]&&
chess.yes[i][j+2]==chess.yes[i][j+3]&&
chess.yes[i][j+3]==chess.yes[i][j+4])||
((i+4)<N&&chess.yes[i][j]!=0&&
chess.yes[i][j]==chess.yes[i+1][j]&&
chess.yes[i+1][j]==chess.yes[i+2][j]&&
chess.yes[i+2][j]==chess.yes[i+3][j]&&
chess.yes[i+3][j]==chess.yes[i+4][j])||
((i+4)<N&&(j+4)<N&&chess.yes[i][j]!=0&&
chess.yes[i][j]==chess.yes[i+1][j+1]&&
chess.yes[i+1][j+1]==chess.yes[i+2][j+2]&&
chess.yes[i+2][j+2]==chess.yes[i+3][j+3]&&
chess.yes[i+3][j+3]==chess.yes[i+4][j+4])||
((i+4)<N&&j>4&&chess.yes[i][j]!=0&&
chess.yes[i][j]==chess.yes[i+1][j-1]&&
chess.yes[i+1][j-1]==chess.yes[i+2][j-2]&&
chess.yes[i+2][j-2]==chess.yes[i+3][j-3]&&
chess.yes[i+3][j-3]==chess.yes[i+4][j-4]))
{
if(chess.yes[i][j]==1)
chess.ok=1;/*棋胜出*/
else
chess.ok=2;/*棋胜出*/
break;
}
}
if(chess.ok!=0)
break;
}
}
void gameover(void)
{
if(chess.ok==1)
{
outtextxy(420,90,"Congratulation!");
outtextxy(420,120,"The brown win!");
}
else
{
outtextxy(420,90,"Congratulation!");
outtextxy(420,120,"The red win!") ;
}
}
void zbz(void)/*显示光标的横纵坐标*/
{
char str1[10],str2[10];
setcolor(12); /*淡红色*/
settextstyle(0,0,2);/*输出当前坐标字符为8*8点阵,从左到右,16*16点阵*/
sprintf(str1,"X:%d",(chess.x-30)/20);
sprintf(str2,"Y:%d",(chess.y-30)/20);
outtextxy(60,420,str1);
outtextxy(135,420,str2);
}
void gameplay(void)
{
for(i=1;i<N;i++)/*棋盘初始化*/
for(j=1;j<N;j++)
chess.yes[i][j]=0;
chess.kao=1; /*棕棋先走*/
chess.ok=0;/*双方胜负未分*/
chess.x=(N-1)*10+40;
chess.y=(N-1)*10+40;/*初始化光标,将光标定位在棋盘的中心*/
setcolor(6);
place();
while(1)
{
zbz();
key=bioskey(0);
if(key==esc)
break;
/*棕棋键盘移动*/
else if(key==up&&chess.y>50&&chess.kao==1)
{
setcolor(0);place();
chess.y-=20;
}
else if(key==down&&chess.y<(N-1)*20+30&&chess.kao==1)
{
setcolor(0);place();
chess.y+=20;
}
else if(key==left&&chess.x>50&&chess.kao==1)
{
setcolor(0);place();
chess.x-=20;
}
else if(key==right&&chess.x<(N-1)*20+30&&chess.kao==1)
{
setcolor(0);place();
chess.x+=20;
}
/*红方键盘移动*/
else if(key==W&&chess.y>50&&chess.kao==2)
{
setcolor(0);place();
chess.y-=20;
}
else if(key==S&&chess.y<(N-1)*20+30&&chess.kao==2)
{
setcolor(0);place();
chess.y+=20;
}
else if(key==A&&chess.x>50&&chess.kao==2)
{
setcolor(0);place();
chess.x-=20;
}
else if(key==D&&chess.x<(N-1)*20+30&&chess.kao==2)
{
setcolor(0);place();
chess.x+=20;
}
else if(key==space&&chess.yes[(chess.x-30)/20][(chess.y-30)/20]==0&&chess.kao==2)
{
setcolor(4); /*红棋*/
for(i=1;i<=9;i++)
{
circle(chess.x,chess.y,i);
delay(10000);
}
chess.yes[(chess.x-30)/20][(chess.y-30)/20]=2;
chess.kao=1;
win();
if(chess.ok!=0)
{
gameover();
break;
}
}
else if(key==enter&&chess.yes[(chess.x-30)/20][(chess.y-30)/20]==0&&chess.kao==1)
{
setcolor(6);/*棕棋*/
for(i=1;i<=9;i++)
{
circle(chess.x,chess.y,i);
delay(10000); /*推迟10秒*/
}
chess.yes[(chess.x-30)/20][(chess.y-30)/20]=1;
chess.kao=2;
win();
if(chess.ok!=0)
{
gameover();
break;
}
}
else
continue;
if(chess.ok!=0)
break;
if(chess.kao==1)
setcolor(6); /*棕棋*/
else
setcolor(4);/*红棋*/
place();
}/*endwhile(1)*/
}
main()
{
while(1)
{ init();
cleardevice();
clew();
drawqp();
setfillstyle(SOLID_FILL,7);
show();
gameplay();
setcolor(15);
settextstyle(0,0,2);
outtextxy(230,450,"CONTINUE(Y/N)?");
while(1)
{ key=bioskey(0);
if(key==Y||key==n||key==esc)
break;
}
if(key==n||key==esc)
break;
}
closegraph();/*根据测试结果初始化图形*/
}
--------------------编程问答-------------------- 添加个棋谱功能嘛,这样还有保存棋谱的功能
补充:.NET技术 , C#