当前位置:编程学习 > C#/ASP.NET >>

急求这个五子棋的悔棋功能。

#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#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,