| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 3372 人关注过本帖, 2 人收藏
标题:五子棋
只看楼主 加入收藏
烟雨晨曦
Rank: 7Rank: 7Rank: 7
等 级:黑侠
威 望:7
帖 子:150
专家分:599
注 册:2017-3-5
结帖率:100%
收藏(2)
 问题点数:0 回复次数:25 
五子棋
1.基本思路
    下一个棋子,先横向判断,向左判断,直到不为该颜色棋子,向右判断直到不为该颜色棋子,(也就是判断最多五次)
    其他方向类似
2.基本操作
    输入两个a-z的字符回车即可
3.异常处理
    输入错误,会重新录入
    输入棋子存在,会重新录入
    输入大小写均可
好久之前写的,今天用了下,有点bug调了下。
程序代码:
#include<stdio.h>
#include<string.h>
#include<conio.h>
#include<windows.h>
static char* chess[15][15];
bool q=true;
bool Q=true;
int count=0;
//绘制棋盘
void Full()
{
   for(int i=0;i<15;i++)
   {
       for(int j=0;j<15;j++)
       {
           if(i==0)
           {
               chess[i][j] = "";
           }
           if(i==14)
           {
               chess[i][j] = "";
           }
           if(j==0)
           {
               chess[i][j] = "";
           }
           if(j==14)
           {
               chess[i][j] = "";
           }
           if(i==0 && j==0 )
           {
               chess[i][j] = "";
           }
           if(i==0 && j==14)
           {
               chess[i][j] = "";
           }
           if(i==14 && j==0)
           {
               chess[i][j] = "";
           }
           if(i==14 && j==14)
           {
               chess[i][j] = "";
           }
           if(i>0 && i<14 && j>0 && j<14)
           {
               chess[i][j] = "";
           }
       }
   }
}

//显示棋盘
void Show()
{
   char c='A';
   for(int m=0;m<15;m++)
   {
      printf("%2c",c+m);
   }
   printf("\n");
   for(int k=0;k<15;k++)
   {
      if(k==0) printf("%c",c);
      for(int l=0;l<15;l++)
      {
         printf("%s",chess[k][l]);
      }
      printf("\n");
      if(k<14) printf("%c",c+k+1);
   }
}

//下棋合法性检测
bool Check(char* c)
{
  for(int i=0;i<2;i++)
  {
        c[i]=(((c[i]>='A')&&(c[i]<='Z'))?c[i]+32:c[i]);
        if(c[i]<'a'||c[i]>'o')
           return false;
  }

  int x=c[0]-'a';
  int y=c[1]-'a';

  if((strcmp(chess[x][y],"")==0)||(strcmp(chess[x][y],"")==0))
      return false;
  else
      return true;
}


//输赢判断
bool win(int x,int y,char* who)
{
    int i = 0;
    int j = 0;
    int nCount = 0;

    //横向检测
    i = x;
    while(1)
    {
        if(strcmp(chess[i][y],who)==0)
        {
            nCount++;
            if(nCount >= 5)
                    return true;
        }else {
            break;
        }
        i++;
        if(i > 14)
            break;
    }

    i = x;
    while(1)
    {
        if(strcmp(chess[i][y],who)==0)
        {
            nCount++;
            if(nCount > 5)
                    return true;
        }else {
            break;
        }
        i--;
        if(i < 0)
            break;
    }
    

    //纵向检测
    j = y;
    nCount = 0;
    while(1)
    {
        if(strcmp(chess[x][j],who)==0)
        {
            nCount++;
            if(nCount >= 5)
                    return true;
        }else {
            break;
        }
        j++;
        if(j > 14)
            break;
    }

    j = y;
    while(1)
    {
        if(strcmp(chess[x][j],who)==0)
        {
            nCount++;
            if(nCount > 5)
                    return true;
        }
        else
        {
            break;
        }
        j--;
        if(j < 0)
            break;
    }

    //左下至右上
        i = x;
    j = y;
    nCount = 0;
    while(1)
    {
        if(strcmp(chess[i][j],who)==0)
        {
            nCount++;
            if(nCount >= 5)
                    return true;
        }else {
            break;
        }
        i++;
        j--;
        if(i > 14 || j < 0)
            break;
    }

    i = x;
    j = y;
    while(1)
    {
        if(strcmp(chess[i][j],who)==0)
        {
            nCount++;
            if(nCount > 5)
                    return true;
        }
        else
        {
            break;
        }

        i--;
        j++;
        if(j > 14 || i < 0)
            break;
    }

    //左上右下
    i = x;
    j = y;
    nCount = 0;
    while(1)
    {
        if(strcmp(chess[i][j],who)==0)
        {
            nCount++;
            if(nCount >= 5)
                    return true;
        }else {
            break;
        }
        i++;
        j++;
        if(i > 14 || j > 14)
            break;
    }

    i = x;
    j = y;
    while(1)
    {
        if(strcmp(chess[i][j],who)==0)
        {
            nCount++;
            if(nCount > 5)
                    return true;
        }
        else
        {
            break;
        }
        i--;
        j--;
        if(i < 0 || j < 0)
            break;
    }
    return false;
}

//下棋
void Chess()
{
     q=!q;
     char c[100];
     int x,y;

     char* who=(q?"":"");

     printf("请%s下棋:",who);
     scanf("%s",c);

     while(!Check(c))
     {
          printf("请%s重新下棋:",who);
          scanf("%s",c);  
     }

     x=c[0]-'a';
     y=c[1]-'a';

     chess[x][y] = who;
     count++;

     system("cls");

     Show();

     if((win(x,y,who))&&(q==true))
     {
         printf("黑方胜利!!\n");
         Q=false;
     }
     if((win(x,y,who))&&(q==false))
     {
         printf("白方胜利!!\n");
         Q=false;
     }
     if(count==225)
     {
         printf("平局\n");
         Q=false;
     } 
}

int main()
{
    //绘制棋盘
    Full();

    //显示棋盘
    Show();

    while(Q)
    {
       Chess();
    }
    return 0;
}


         

[此贴子已经被作者于2017-5-17 00:44编辑过]

搜索更多相关主题的帖子: 五子棋 
2017-05-17 00:41
Emotiona
Rank: 7Rank: 7Rank: 7
等 级:黑侠
帖 子:311
专家分:581
注 册:2017-3-7
收藏
得分:0 
学习了
2017-05-17 00:50
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
之前曾经写过一个~这个可以~

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-05-17 02:24
丧钟
Rank: 2
来 自:哥谭市
等 级:论坛游民
帖 子:10
专家分:10
注 册:2017-5-9
收藏
得分:0 
厉害啦!!!

今天的菜鸟,明天的高手!!!
2017-05-17 10:05
yangfrancis
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:贵宾
威 望:141
帖 子:1510
专家分:7661
注 册:2014-5-19
收藏
得分:0 
回复 楼主 烟雨晨曦
请问你的那些特殊字符是怎么做出来的呢?
2017-05-17 10:34
烟雨晨曦
Rank: 7Rank: 7Rank: 7
等 级:黑侠
威 望:7
帖 子:150
专家分:599
注 册:2017-3-5
收藏
得分:0 
复制过来的
2017-05-17 13:05
renkejun1942
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:不是这样
等 级:贵宾
威 望:33
帖 子:1645
专家分:5297
注 册:2016-12-1
收藏
得分:0 
你的代码好奇怪,为什么要把c++写的跟标准c似的。

09:30 05/21 种下琵琶种子,能种活么?等待中……
21:50 05/27 没有发芽。
20:51 05/28 没有发芽。
23:03 05/29 没有发芽。
23:30 06/09 我有预感,要发芽了。
2017-05-17 14:13
烟雨晨曦
Rank: 7Rank: 7Rank: 7
等 级:黑侠
威 望:7
帖 子:150
专家分:599
注 册:2017-3-5
收藏
得分:0 
本来就是用C写的,c++的也写过,用win32 写的,发给大家看一下吧,只是完成了功能,没有做什么处理
程序代码:
#include<windows.h>
#include<iostream>
#include<stdio.h>
#include<vector>
using namespace std;

#define GRAD 30

struct Chess
{
   char nType;
   int x;
   int y;
};

char sz[15][15] = {0};

bool who = true;
vector<Chess> a;

LRESULT CALLBACK WinProc(HWND hwnd,UINT uMsg,WPARAM wParam, LPARAM lParam);

int WINAPI WinMain( HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow)
{
    //1.注册窗口类
    WNDCLASS winclass;
    winclass.cbClsExtra = 0;
    winclass.cbWndExtra = 0;
    winclass.hbrBackground = (HBRUSH)::CreateSolidBrush(0xffffff);
    winclass.hCursor = ::LoadCursor(NULL,IDC_ARROW);
    winclass.hIcon = ::LoadIcon(hInstance,IDI_APPLICATION);
    winclass.hInstance = hInstance;
    winclass.lpfnWndProc = WinProc;
    winclass.lpszClassName = "五子棋";
    winclass.lpszMenuName = NULL;
    winclass.style = CS_SAVEBITS | CS_DBLCLKS;
    if(0 == ::RegisterClass(&winclass)) return 0;

    //2.创建窗口
    HWND hWnd = ::CreateWindow(winclass.lpszClassName,"五子棋 by烟雨晨曦 QQ772535307", WS_OVERLAPPEDWINDOW,0,0,490,500,NULL,NULL,hInstance,NULL);

    //3.显示窗口
    ::ShowWindow(hWnd,SW_SHOW);

    //4.更新窗口
    ::UpdateWindow(hWnd);

    //5.消息循环
    MSG Msg;
    while(::GetMessage(&Msg,NULL,0,0))
    {
        ::DispatchMessage(&Msg);
    }

    return 0;

}

LRESULT CALLBACK WinProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    switch(uMsg)
    {
    case 0x000F:
        {
            PAINTSTRUCT pt;
            HDC hdc = ::BeginPaint(hwnd,&pt);

            //绘制棋盘

            for(int i = 0; i < 15; i++)
            {
                ::MoveToEx(hdc, GRAD, GRAD + i * GRAD, NULL);
                ::LineTo(hdc, GRAD + 14 * GRAD, GRAD + i * GRAD);

                ::MoveToEx(hdc, GRAD + i * GRAD, GRAD, NULL);
                ::LineTo(hdc, GRAD + i * GRAD, GRAD + 14 * GRAD);
            }

            //显示棋子

            for(int m = 0; m < 15; m++)
            {
               for(int n = 0; n< 15; n++)
               {
                    if(sz[m][n] == 0) continue;
                    HBRUSH hbr = ::CreateSolidBrush(sz[m][n] == 1 ? 0x00:0xffffff);
                    ::SelectObject(hdc,hbr);
                    int x = m * GRAD + GRAD;
                    int y = n * GRAD + GRAD;
                    ::Ellipse(hdc,x-GRAD/3, y-GRAD/3,x+GRAD/3, y+GRAD/3);
                    ::DeleteObject(hbr);
               }
            }

            ::EndPaint(hwnd,&pt);
        }
        break;
    case WM_LBUTTONUP:
       {
           //落子
           int x = LOWORD(lParam);
           int y = HIWORD(lParam);
           int m = (x - GRAD) / (float)GRAD + 0.5f;
           int n = (y - GRAD) / (float)GRAD + 0.5f;
           
           if (sz[m][n] != 0) break;
           sz[m][n] = who ? 1 : 2;
           struct Chess tem = {sz[m][n],m,n};
           a.push_back(tem);
           who = !who; 
           ::InvalidateRect(hwnd, NULL, TRUE);
           char* str = (!who?"黑方胜利":"白方胜利");
           x = m;
           y = n;
           //输赢判断

           int nCount = 1;
           m = x - 1;
           n = y;
           while(sz[m][n] == sz[x][y])
           {
               nCount ++;
               if(nCount == 5)
               {
                   ::MessageBox(hwnd,str,"GAME OVER",MB_OK);
               }
               m--;
           }

           m = x + 1;
           n = y;

           while(sz[m][n] == sz[x][y])
           {
               nCount ++;
               if(nCount == 5)
               {
                   ::MessageBox(hwnd,str,"GAME OVER",MB_OK);
               }
               m++;
           }

           //横向判断

           nCount = 1;
           m = x ;
           n = y - 1;
           while(sz[m][n] == sz[x][y])
           {
               nCount ++;
               if(nCount == 5)
               {
                   ::MessageBox(hwnd,str,"GAME OVER",MB_OK);
               }
               n--;
           }

           m = x;
           n = y + 1;

           while(sz[m][n] == sz[x][y])
           {
               nCount ++;
               if(nCount == 5)
               {
                   ::MessageBox(hwnd,str,"GAME OVER",MB_OK);
               }
               n++;
           }

           nCount = 1;
           m = x - 1;
           n = y - 1;
           while(sz[m][n] == sz[x][y])
           {
               nCount ++;
               if(nCount == 5)
               {
                   ::MessageBox(hwnd,str,"GAME OVER",MB_OK);
               }
               m--;
               n--;
           }

           m = x + 1;
           n = y + 1;

           while(sz[m][n] == sz[x][y])
           {
               nCount ++;
               if(nCount == 5)
               {
                   ::MessageBox(hwnd,str,"GAME OVER",MB_OK);
               }
               m++;
               n++;
           }

           nCount = 1;
           m = x - 1;
           n = y + 1;
           while(sz[m][n] == sz[x][y])
           {
               nCount ++;
               if(nCount == 5)
               {
                   ::MessageBox(hwnd,str,"GAME OVER",MB_OK);
               }
               m--;
               n++;
           }

           m = x + 1;
           n = y - 1;

           while(sz[m][n] == sz[x][y])
           {
               nCount ++;
               if(nCount == 5)
               {
                   ::MessageBox(hwnd,str,"GAME OVER",MB_OK);
               }
               m++;
               n--;
           }
       }
       break;
    case 0x0100://
        {
            if(27 == wParam) ::DestroyWindow(hwnd);
            if('A' == wParam) 
            {    
                if(a.size() == 0)
                {
                    ::MessageBox(hwnd,"没有棋子","ERROR",MB_OK);
                    return 0;
                }
                int n = a.size() - 1;
                int x = a[n].x;
                int y = a[n].y;

                sz[x][y] = 0;
                a.pop_back();
                who = !who;
            }
            ::InvalidateRect(hwnd,NULL,TRUE);
        }
        break;
    case 0x0010 ://VM_CLOSE
       int IOK;
       IOK = ::MessageBox(hwnd,"你确定关闭吗?","关闭",MB_YESNO);
       if(IOK == IDYES)
       {
           ::DestroyWindow(hwnd);
       }
       break;
    case 0x0002:
        ::KillTimer(hwnd,1);
        ::PostQuitMessage(0);
        break;
    default:
       return ::DefWindowProc(hwnd,uMsg,wParam,lParam);
       break;
    }
    return 0;
}


[此贴子已经被作者于2017-5-17 20:27编辑过]

2017-05-17 20:20
renkejun1942
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:不是这样
等 级:贵宾
威 望:33
帖 子:1645
专家分:5297
注 册:2016-12-1
收藏
得分:0 
回复 8楼 烟雨晨曦
C语言的bool类型是C99增加的,但是必须包含stdbool.h头文件,不包含这个头文件就能使用bool类型的是c++。
这点常识我还是有的。

09:30 05/21 种下琵琶种子,能种活么?等待中……
21:50 05/27 没有发芽。
20:51 05/28 没有发芽。
23:03 05/29 没有发芽。
23:30 06/09 我有预感,要发芽了。
2017-05-17 20:33
烟雨晨曦
Rank: 7Rank: 7Rank: 7
等 级:黑侠
威 望:7
帖 子:150
专家分:599
注 册:2017-3-5
收藏
得分:0 
c++用的方便一点不像c那样严格,就像你说的c没有bool类型,变量要先定义再使用之类的,一直都是这样编程的习惯了。
2017-05-17 20:47
快速回复:五子棋
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.023353 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved