⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 wuzhiqi.txt

📁 五子棋游戏代码
💻 TXT
字号:
/*这个程序是人人对战的五子棋*/
#include<graphics.h>
#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
#include<bios.h>

#define COL 133 /*宏定义*/
#define FAR 53

#define LEFT 0x4b00
#define RIGHT 0x4d00
#define DOWN 0x5000
#define UP 0x4800
#define Esc 0x011b
#define ENTER 0x1c0d

int a[25][25];         /*用-1表示白棋,用1表示黑棋*/

void gamebegin();
void gameover();
void gameplay();
void drawchess(int,int,int);
void gamewin(int);
void drawflag(int,int,int);
int gamecomputer(int,int); /*返回1表示win,返回0表示not win*/
void whochess(int);


/*主函数*/
void main()
{
   int gdriver=DETECT,gmode;
   initgraph(&gdriver,&gmode,"");
   gameplay();
   gameover();
   closegraph();
}

/*这个函数是初始化函数*/
void gamebegin()
{
   int i,j;
   setbkcolor( GREEN  );
   cleardevice();
   for(i=0;i<25;i++)
       line(COL,FAR+i*15,COL+15*24,FAR+i*15);
   for(i=0;i<25;i++)
       line(COL+i*15,FAR,COL+i*15,FAR+15*24);

   setcolor(YELLOW);
   circle(140,40,6);
   setfillstyle(SOLID_FILL,RED);
   floodfill(140,40,YELLOW);

   outtextxy(155,40,"VS");

   setcolor(YELLOW);
   circle(180,40,6);
   setfillstyle(SOLID_FILL,WHITE);
   floodfill(180,40,YELLOW);

   for(i=0;i<25;i++)
       for(j=0;j<25;j++)
           a[i][j]=0;
}

/*结束函数*/
void gameover()
{
    cleardevice();
    outtextxy(FAR+15*13,COL+15*6,"Game Over");
    getch();
    exit(0);
}

/*游戏开始函数*/
void gameplay()
{
    char again='y';
    int who=1;        /*用-1表示白棋,用1表示红棋*/
    int key=0,x,y,win;
    void *image;
    while(again=='y'||again=='Y')
    {
       gamebegin();
       key=0;
       x=COL+15*13;
       y=FAR+15*13;
       while(1)
       {
          drawflag(x,y,key);
          whochess(who);
          key=bioskey(0);
          if(key==Esc)
          {
             setactivepage(1);
             outtextxy(10,200,"Exit?(Y/N)");
             image=(char *)malloc(imagesize(10,190,120,210));
             getimage(10,190,120,210,image);
             setactivepage(0);
             putimage(10,200,image,XOR_PUT);
             while(1)
            {
             again=getch();
             if(again=='y'||again=='Y'||again=='n'||again=='N')
                break;
             }
             if(again=='y'||again=='Y')
                gameover();
             else
               {drawflag(x,y,0);
                putimage(10,200,image,XOR_PUT);
                continue;
                }
          }
          else if(key==LEFT)
          {
             if(x==COL)
                x=COL+15*24;
             else
                x-=15;
           }
          else if(key==RIGHT)
          {
             if(x==COL+15*24)
                x=COL;
             else
                x+=15;
           }
          else if(key==UP)
          {
             if(y==FAR)
                y=FAR+15*24;
             else
                y-=15;
          }
          else if(key==DOWN)
          {
             if(y==FAR+15*24)
                y=FAR;
             else
                y=y+15;
           }
           else if(key==ENTER)
           {
               if(a[(y-FAR)/15][(x-COL)/15]==0)
               {
                    drawchess(who,x,y);
                    if(who==1)
                      {a[(y-FAR)/15][(x-COL)/15]=1;
                       who=-1;
                       }
                    else
                      {a[(y-FAR)/15][(x-COL)/15]=-1;
                       who=1;
                       }
                    win=gamecomputer(((x-COL)/15),((y-FAR)/15));
                    if(win==1)
                    {
                       gamewin(who);
                       break;
                     }
                }
             }
          else
             continue;
       }
       while(1)
            {
             outtextxy(10,200,"Continue?(Y/N)");
             again=getch();
             if(again=='y'||again=='Y'||again=='n'||again=='N')
                break;
             }
     }
}

/*画棋子函数*/
void drawchess(int whose,int x,int y)
{
   setcolor(YELLOW);
   circle(x,y,6);
   if(whose==1)              /*画红棋*/
      setfillstyle(SOLID_FILL,RED);
   if(whose==-1)             /*画白棋*/
      setfillstyle(SOLID_FILL,WHITE);
   floodfill(x,y,YELLOW);    /*填充颜色*/
}

/*这个函数是用来控制上下左右的,实用异或来消除以前的图像*/
void drawflag(int x,int y,int key1)
{
   void *p;
   setactivepage(1);
   setcolor(YELLOW);
   rectangle(0,0,16,16);
   p=(char *)malloc(imagesize(0,0,16,16));
   getimage(0,0,16,16,p);
   setactivepage(0);
   putimage(x-8,y-8,p,XOR_PUT);      /*输出当前的指示位置*/
   if(key1==LEFT)        /*当按左健时就把以前的那个指示位置消除*/
     {if(x==COL+15*24)         /*当在最右边的位置时就把最左边的指示位置消除*/
         putimage(COL-8,y-8,p,XOR_PUT);
      else                     /*当在一般位置是的情况*/
         putimage(x-8+15,y-8,p,XOR_PUT);
      }
   else if(key1==RIGHT)
      {if(x==COL)
          putimage(COL+15*24-8,y-8,p,XOR_PUT);
       else
         putimage(x-8-15,y-8,p,XOR_PUT);
       }
   else if(key1==UP)
      {if(y==FAR+15*24)
          putimage(x-8,FAR-8,p,XOR_PUT);
       else
          putimage(x-8,y-8+15,p,XOR_PUT);
       }
   else if(key1==DOWN)
      {if(y==FAR)
          putimage(x-8,FAR+15*24-8,p,XOR_PUT);
       else
          putimage(x-8,y-8-15,p,XOR_PUT);
       }
   else if(key1==ENTER)
       putimage(x-8,y-8,p,XOR_PUT);
}

/*计算有没有赢函数*/
int gamecomputer(int x,int y)
{
   int flag1=0,flag2=0,i=0;
   for(i=0,flag1=0,flag2=0;;i++)   /*左-右*/
   {
      if(a[y][x]==a[y][x-i]&&x-i>=0)
         flag1++;
      if(a[y][x]==a[y][x+i]&&x+i<=24)
         flag2++;
      if((flag1+flag2-1)==5)
      {
         setcolor(11);
         setlinestyle(SOLID_LINE,0,3);
         line(15*x+COL-(flag1-1)*15-6,15*y+FAR,15*x+COL+(flag2-1)*15+6,15*y+FAR);
         return 1;
      }
      if(!(a[y][x]==a[y][x-i]&&x-i>=0)&&!(a[y][x]==a[y][x+i]&&x+i<=24))
         break;
    }
   for(i=0,flag1=0,flag2=0;;i++)      /*上|下*/
   {
      if(a[y][x]==a[y-i][x]&&y-i>=0)
         flag1++;
      if(a[y][x]==a[y+i][x]&&y+i<=24)
         flag2++;
      if((flag1+flag2-1)==5)
      {
         setcolor(11);
         setlinestyle(SOLID_LINE,0,3);
         line(15*x+COL,15*y+FAR-(flag1-1)*15-6,15*x+COL,15*y+FAR+(flag2-1)*15+6);
         return 1;
      }
      if(!(a[y][x]==a[y-i][x]&&y-i>=0)&&!(a[y][x]==a[y+i][x]&&y+i<=24))
         break;
    }
   for(i=0,flag1=0,flag2=0;;i++)   /*右上\左下*/
   {
      if(a[y][x]==a[y-i][x-i]&&(x-i)>=0&&(y-i)>=0)
         flag1++;
      if(a[y][x]==a[y+i][x+i]&&(x+i)<=24&&(y+i)<=24)
         flag2++;
      if((flag1+flag2-1)==5)
      {
         setcolor(11);
         setlinestyle(SOLID_LINE,0,3);
         line(15*x+COL-(flag1-1)*15-3,15*y+FAR-(flag1-1)*15-3,15*x+COL+(flag2-1)*15+3,15*y+FAR+(flag2-1)*15+3);
         return 1;
      }
      if(!(a[y][x]==a[y-i][x-i]&&(x-i)>=0&&(y-i)>=0)&&!(a[y][x]==a[y+i][x+i]&&(x+i)<=24&&(y+i)<=24))
         break;
    }
   for(i=0,flag1=0,flag2=0;;i++)       /*左上/右下*/
   {
      if(a[y][x]==a[y-i][x+i]&&(x+i)<=24&&(y-i)>=0)
         flag1++;
      if(a[y][x]==a[y+i][x-i]&&(y+i)<=24&&(x-i)>=0)
         flag2++;
      if((flag1+flag2-1)==5)
      {
         setcolor(11);
         setlinestyle(SOLID_LINE,0,3);
         line(15*x+COL+(flag1-1)*15+3,15*y+FAR-(flag1-1)*15-3,15*x+COL-(flag2-1)*15-3,15*y+FAR+(flag2-1)*15+3);
         return 1;
      }
      if(!(a[y][x]==a[y-i][x+i]&&(x+i)<=24&&(y-i)>=0)&&!(a[y][x]==a[y+i][x-i]&&(y+i)<=24&&(x-i)>=0))
         break;
    }
    return 0;
}


/*判断谁胜利的函数*/
void gamewin(int whose)
{
   setlinestyle(SOLID_LINE,0,1);
   if(whose==1)
     {setcolor(YELLOW);
      circle(15,130,6);
      setfillstyle(SOLID_FILL,WHITE);
      floodfill(15,130,YELLOW);

      outtextxy(30,130,"defeat");

      circle(90,130,6);
      setfillstyle(SOLID_FILL,RED);
      floodfill(90,130,YELLOW);

      outtextxy(10,150,"White Chess Win");
      }
   if(whose==-1)
     {setcolor(YELLOW);
      circle(15,130,6);
      setfillstyle(SOLID_FILL,RED);
      floodfill(15,130,YELLOW);

      outtextxy(30,130,"defeat");

      circle(90,130,6);
      setfillstyle(SOLID_FILL,WHITE);
      floodfill(90,130,YELLOW);

      outtextxy(10,150,"Red Chess Win");
      }
    setcolor(WHITE);
}

/*提示是谁下棋函数*/
void whochess(int whose)
{
    outtextxy(335,40,"Play");
    setcolor(YELLOW);
    circle(320,40,6);
    if(whose==1)
       setfillstyle(SOLID_FILL,RED);
    else
       setfillstyle(SOLID_FILL,WHITE);
    floodfill(320,40,YELLOW);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -