五子棋


/*
运行环境:VC++6.0。
(需添加turbo图形库 网址:http://www.easyx.cn/skills/)
算法改进中。
按上下左右键控制光标。
按空格落子。
    */

#include <graphics.h> 
#include <stdlib.h> 
#include <conio.h> 
#include <stdio.h> 
#include <time.h>
#include <windows.h>
//设置偏移量
#define OFFSET 20
#define OFFSET_x 4
#define OFFSET_y 3
//定义棋子的坐标
int ChessMan_y;
int ChessMan_x;
//定义棋子的次序,在x行第几位,y行第几位
int ChessManOrder_x;
int ChessManOrder_y;
//此变量判断下棋方
int PlayChessOrder;
//定义数组大小
#define N 19
//此数组表现棋盘上坐标的状态
int status[N][N];
//获取按键变量
int key;
HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
void gotoxy(int x, int y)
{
 COORD coord;
 coord.X = x;
 coord.Y = y;
 SetConsoleCursorPosition(hConsole, coord);
}
/*gotoxy()函数,使坐标移动到屏幕(x,y)点。*/
void main()
{
 initgraph(640, 480);
 ChessMan_x=280;
 ChessMan_y=260;
 PlayChessOrder=3;
 int x1,x2;
 int y1,y2;
    //在棋盘上画点。
    int x=100;
    for(int i=1;i<19;i++)
 {
   int y=80;
  for(int ii=1;ii<19;ii++)
  {
            gotoxy(x,y);
            setcolor(YELLOW);
            setfillstyle(WHITE);
            fillcircle(x,y,3);
             y+=20;
  }
  x+=20;
 }
 //设置线条颜色
 setcolor(WHITE);
 //按照预设的偏移量开始画棋盘
 for(x1=1,y1=1,y2=18;x1<=18;x1++)
 {
        line((x1+OFFSET_x)*OFFSET,(y1+OFFSET_y)*OFFSET,(x1+OFFSET_x)*OFFSET,(y2+OFFSET_y)*OFFSET);
 }
 for(x1=1,y1=1,x2=18;y1<=18;y1++)
 {
        line((x1+OFFSET_x)*OFFSET,(y1+OFFSET_y)*OFFSET,(x2+OFFSET_x)*OFFSET,(y1+OFFSET_y)*OFFSET);
 }
     //将各个点的状态设为三。
 for(x1=0;x1<18;x1++)
 {
        for(y1=0;y1<18;y1++)
       {
             status[x1][y1]=3;
        }
 }
 //gotoxy(100,80);
while(1)
{
      Sleep(10);
      //判断按键,用key变量记录。
       if(kbhit())
       {
             key=getch();
             switch(key)
             {
                   case 32:
                   ChessManOrder_x=(ChessMan_x-100)/20;
                   ChessManOrder_y=(ChessMan_y-80)/20;
                   gotoxy(ChessMan_x,ChessMan_y);
                   if(PlayChessOrder%2==0)
                   {
                          setcolor(YELLOW);
                          setfillstyle(RED);
                          fillcircle(ChessMan_x,ChessMan_y,10);
                          status[ChessManOrder_x][ChessManOrder_y]=1;
                    }
                   else
                   {
                         setcolor(YELLOW);
                         setfillstyle(BLUE);
                          fillcircle(ChessMan_x,ChessMan_y,10);
                         status[ChessManOrder_x][ChessManOrder_y]=2;
                     }
                   PlayChessOrder++;
                   break;
                   case 72:
                   //如果超出棋盘什么也不做
                   if((status[ChessManOrder_x][ChessManOrder_y-1]!=3)&&(status[ChessManOrder_x][ChessManOrder_y-1]!=1)&&(status[ChessManOrder_x][ChessManOrder_y-1]!=2))
                   break;
                   if((status[ChessManOrder_x][ChessManOrder_y]!=1)&&(status[ChessManOrder_x][ChessManOrder_y]!=2))
                   {
                           gotoxy(ChessMan_x,ChessMan_y);
                           setcolor(YELLOW);
                           setfillstyle(WHITE);
                           fillcircle(ChessMan_x,ChessMan_y,3);
                           (ChessMan_y)-=20;
                    }
                   else
                   (ChessMan_y)-=20;
                    break;
                  case 77:
                   if((status[ChessManOrder_x+1][ChessManOrder_y]!=3)&&(status[ChessManOrder_x+1][ChessManOrder_y]!=1)&&(status[ChessManOrder_x+1][ChessManOrder_y]!=2))
                   break;
                   if((status[ChessManOrder_x][ChessManOrder_y]!=1)&&(status[ChessManOrder_x][ChessManOrder_y]!=2))
                   {
                          gotoxy(ChessMan_x,ChessMan_y);
                          setcolor(YELLOW);
                          setfillstyle(WHITE);
                          fillcircle(ChessMan_x,ChessMan_y,3);
                           (ChessMan_x)+=20;
                    }
                     else
                    (ChessMan_x)+=20;
                     break;
                      case 80:
                       if((status[ChessManOrder_x][ChessManOrder_y+1]!=3)&&(status[ChessManOrder_x][ChessManOrder_y+1]!=1)&&(status[ChessManOrder_x][ChessManOrder_y+1]!=2))
                     break;
                     if((status[ChessManOrder_x][ChessManOrder_y]!=1)&&(status[ChessManOrder_x][ChessManOrder_y]!=2))
                    {
                             gotoxy(ChessMan_x,ChessMan_y);
                              setcolor(YELLOW);
                             setfillstyle(WHITE);
                             fillcircle(ChessMan_x,ChessMan_y,3);
                              (ChessMan_y)+=20;
                        }
                   else
                  (ChessMan_y)+=20;
                   break;
                   case 75:
                   if((status[ChessManOrder_x-1][ChessManOrder_y]!=3)&&(status[ChessManOrder_x-1][ChessManOrder_y]!=1)&&(status[ChessManOrder_x-1][ChessManOrder_y]!=2))
                  break;
                  if((status[ChessManOrder_x][ChessManOrder_y]!=1)&&(status[ChessManOrder_x][ChessManOrder_y]!=2))
                  {
                        gotoxy(ChessMan_x,ChessMan_y);
                         setcolor(YELLOW);
                         setfillstyle(WHITE);
                         fillcircle(ChessMan_x,ChessMan_y,3);
                        (ChessMan_x)-=20;
                    }
                   else 
                   (ChessMan_x)-=20;
                   break;
                   default:
                   break;
                    }
          ChessManOrder_x=(ChessMan_x-100)/20;
          ChessManOrder_y=(ChessMan_y-80)/20;
          if(status[ChessManOrder_x][ChessManOrder_y]==3)
           { 
                 gotoxy(ChessMan_x,ChessMan_y);
                setcolor(YELLOW);
                setfillstyle(RED);
                fillcircle(ChessMan_x,ChessMan_y,3);
            }
   //横向判断胜负。
   for(i=0;i<5;i++)
   {  
           int n=0;
           int m=0;
           for(int ii=(ChessManOrder_x-i);ii<=ChessManOrder_x+(4-i);ii++)
           {
                   if(status[ii][ChessManOrder_y]==1)
                   m++;
                    if(status[ii][ChessManOrder_y]==2)
                   n++;
              }
             if(m==5||n==5)
             {
                   printf("GameOver");
                   closegraph();
               }
   }
   //竖向判断胜负
   for(i=0;i<5;i++)
   {  
            int n=0;
             int m=0;
            for(int ii=(ChessManOrder_y-i);ii<=ChessManOrder_y+(4-i);ii++)
            {
                  if(status[ChessManOrder_x][ii]==1)
                  m++;
                  if(status[ChessManOrder_x][ii]==2)
                  n++;
               }
           if(m==5||n==5)
           {
                  printf("GameOver");
                  closegraph();
             }
   }
   //左上至右下方向判断红方胜负
    int n1=0;
    int n2=0;
    int j;
    int k;
    /*向左上方数*/
    for(j=ChessManOrder_x,k=ChessManOrder_y;(j>=1)&&(k>=1);j--,k--)
    {
              if(status[j][k]==1)
              n1++;
             else
             break;
    }
    /*向左下方数*/
     for(j=ChessManOrder_x,k=ChessManOrder_y;(j<=18)&&(k<=18);j++,k++)
    {
              if(status[j][k]==1)
               n2++;
               else
               break;
    }
    if(n1+n2>5)
    {
              printf("GameOver red win.");
              closegraph();
    }
   //左上至右下方向判断红方胜负结束
        //左上至右下方向判断蓝方胜负
     n1=0;
    n2=0;
    /*向左上方数*/
    for(j=ChessManOrder_x,k=ChessManOrder_y;(j>=1)&&(k>=1);j--,k--)
    {
              if(status[j][k]==2)
               n1++;
              else
              break;
    }
    /*向左下方数*/
     for(j=ChessManOrder_x,k=ChessManOrder_y;(j<=18)&&(k<=18);j++,k++)
    {
              if(status[j][k]==2)
              n2++;
              else
              break;
    }
    if(n1+n2>5)
    {
              printf("GameOver,blue win.");
              closegraph();
    }
   //左上至右下方向判断蓝方胜负结束
    //蓝方右上至左下判断
    int m1=0;
    int m2=0;
    //向右上方数
    for(j=ChessManOrder_x,k=ChessManOrder_y;(j<=18)&&(k>=1);j++,k--)
    {
              if(status[j][k]==2)
              m1++;
              else
              break;
    }
    //向左下方数
    for(j=ChessManOrder_x,k=ChessManOrder_y;(j>=1)&&(k<=18);j--,k++)
    {
              if(status[j][k]==2)
              m2++;
              else
              break;
    }
    if(m1+m2>5)
    { 
              printf("GameOver blue win.");
              closegraph();
    }
    //蓝方右上至左下判断
 //红方右上至左下判断
    m1=0;
     m2=0;
    //向右上方数
    for(j=ChessManOrder_x,k=ChessManOrder_y;(j<=18)&&(k>=1);j++,k--)
    {
              if(status[j][k]==1)
              m1++;
             else
             break;
    }
    //向左下方数
    for(j=ChessManOrder_x,k=ChessManOrder_y;(j>=1)&&(k<=18);j--,k++)
    {
             if(status[j][k]==1)
            m2++;
            else
            break; 
    }
        if(m1+m2>5)
      { 
             printf("GameOver.red win.");
             closegraph();
       }
    //红方右上至左下判断
    }
   //if(kbhit())结束。
  }
    getch();
    closegraph();
}


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值