纯C语言实现五子棋_C 语言

正在考虑增加一个MFC界面。不是人机对战的。

五子棋.c

//date 2014年7月7日09:53:24
//willows
//五子棋

#define _CRT_SECURE_NO_WARNINGS

#include <stdio.h>
#include <stdlib.h>
#include <assert.h>

//棋盘初始化函数
//Chessboard棋盘数组,ln=棋盘大小,成功返回Chessboard,不成功NULL
void init_Chessboard(char Chessboard[][7], int ln)
{
  if ((Chessboard != NULL) && (ln>0)){
    int i = 0, j = 0;
    for (i = 0; i<ln; ++i){
      for (j = 0; j<ln; ++j){
        Chessboard[i][j] = '\t';
      }
    }
  // return Chessboard;
  }
// return NULL;
}

//显示棋盘函数
void show_Chessboard(char Chessboard[][7], int ln)
{
  assert((Chessboard != NULL) && (ln > 0));

  int i = 0, j = 0;
  for (i = 0; i<ln; ++i){
    putchar('\t');
    putchar(i + '0');
  }//end for1
  putchar('\n');
  putchar('\n');

  for (i = 0; i<ln; ++i){
    putchar(i + '0');
    for (j = 0; j<ln; ++j){
      if ('\t' == Chessboard[i][j]){
        putchar(Chessboard[i][j]);
      }
      else
      {
        putchar('\t');
        putchar(Chessboard[i][j]);
      }

    }
    putchar('\n');
    putchar('\n');
  }//end for2
}

//棋子下子函数
//下子成功返回1,不成功返回0
int play(char Chessboard[][7], int ln, int x, int y, char ChessPieces)
{
  assert(Chessboard); //ChessPieces=NULL跳出
  if ((x<ln) && (y<ln) && (x >= 0) && (y >= 0)){
    if ('\t' == Chessboard[x][y]){

      Chessboard[x][y] = ChessPieces;
      return 1;  //成功
    }
    else
    {
      return 0;
    }//end if2
  }//end if1
  return 0;
}

//满盘判断
//棋盘满了判断//满了就返回-1
int full_Chess(char Chessboard[][7], int ln)
{
  int i = 0, j = 0;
  for (i = 0; i<ln; ++i){
    for (j = 0; j<ln; ++j){
      if ('\t' == Chessboard[i][j]){
        return 0;  //棋盘未满
      }//end if
    }//end for j
  }//end for i

  return 1;//棋盘满了

}

//是否连成五子线判断函数
//Chessboard=棋盘数组,ln=棋盘宽度,(XS,YS)方向判断起点坐标,(dx,dy)方向增量标记
//连成线返回1,没有返回0
int judga_line(char Chessboard[][7], int ln, int XS, int YS, int dx, int dy)
{
  assert((Chessboard != NULL) && (ln > 0));
  if((XS <ln) && (YS<ln)  //起点坐标在棋盘内
    && (XS >=0) && (YS >=0)
    && (dx != 0 || dy != 0))        //坐标增量不为同时0
  {

    if (((XS + dx * 4) > ln) || ((XS + dx * 4)<0) || //判断终点坐标
      ((YS + dy * 4)>ln) || ((YS + dy * 4) < 0) || //在棋盘外
      ('\t' == Chessboard[XS][YS]))
    {
        return 0;  //不在棋盘内,或者起点是没下子
    }
    else
    {
      int i = 0;
      for (i = 1; i < 5; ++i){
        if (Chessboard[XS][YS] != Chessboard[XS + (dx * i)][YS + (dy * i)])
        {
          return 0;  //如果不是连续5个一样的
        }//end if3
      }//end for1
      return 1;  //五个都一样,且都在棋盘内
    }//end if 2
  }
  return 0;  //其他情况
}

//裁判函数
//Chessboard 棋盘数组,ln=棋盘宽度
//赢了返回1,否则返回0
int judga(char Chessboard[][7], int ln)
{
  assert((NULL != Chessboard) && (ln>0));
  int i = 0, j = 0;
  //纵向成五子连线判断
  for (i = 0; i<(ln - 4); ++i){
    for (j = 0; j<ln; ++j){
      if (judga_line(Chessboard, ln, i, j, 1, 0)){
        return 1;
      }
    }//end for_j
  }//end for_i

    //横向成五子连线判断
  for (i = 0; i<ln; ++i){
    for (j = 0; j<(ln - 4); ++j){
      if (judga_line(Chessboard, ln, i, j, 0, 1)){
        return 1;
      }
    }//end for_j
  }//end for_i

    //左上到右下成五子连线判断
  for (i = 0; i<(ln - 4); ++i){
    for (j = 0; j<(ln - 4); ++j){
      if (judga_line(Chessboard, ln, i, j, 1, 1)){
        return 1;
      }
    }//end for_j
  }//end for_i

    //左下到右上成五子连线判断
  for (i = ln-1; i>(ln-4); --i){
    for (j = 0; j <(ln - 4); ++j){
      if (judga_line(Chessboard, ln, i, j, -1, 1)){
        return 1;
      }
    }//end for_j
  }//end for_i

  return 0;  //没能赢
}

//主函数

int main()
{
  char CB[7][7];
  char nameA[50] = "玩家A";
  char nameB[50] = "玩家B";
  int x = -1, y = -1;
  //初始化
  init_Chessboard(CB, 7);

  printf("请输入玩家A的名字:");
  scanf("%s", nameA);

  printf("请输入玩家B的名字:");
  scanf("%s", nameB);

  //显示棋盘
  show_Chessboard(CB, 7);

  while (1){
    //判断是否棋盘已满
    if (full_Chess(CB, 7)){
      puts("\n棋盘已满,下次再战!");
      break; //跳出最外层while
    }//end if

    //玩家A下子
    while (1){
      printf("\n请玩家 %s 下子 @\n", nameA);
      printf("棋子行坐标X=");
      scanf("%d", &x);
      printf("棋子列坐标Y=");
      scanf("%d", &y);

      if (play(CB, 7, x, y, '@')){  //@ ascii=64
        break;   //下子成功
      }
      else
      {
        puts("下子失败,请重新选定位置下子");
        continue;  //下子不成功,重新下子
      }//end if
    }//end while A

    //显示棋盘
    show_Chessboard(CB, 7);

    //判断玩家A是否胜利
    if (judga(CB, 7)){
      printf("\n恭喜玩家 %s 成功取得胜利!!鲜花\n", nameA);
      getchar();
      getchar();
      break; //跳出最外层while
    }//不用下了

    //玩家B下子
    while (1){
      printf("\n请玩家 %s 下子 O\n", nameB);
      printf("棋子行坐标X=");
      scanf("%d", &x);
      printf("棋子列坐标Y=");
      scanf("%d", &y);

      if ((play(CB, 7, x, y, 'O'))){ //O ascii=79
        break;   //下子成功
      }
      else
      {
        puts("下子失败,请重新选定位置下子");
        continue;  //下子不成功,重新下子
      }//end if

    }//end while B

    //显示棋盘
    show_Chessboard(CB, 7);

    //判断玩家B是否胜利
    if (judga(CB, 7)){
      printf("\n恭喜玩家 %s 成功取得胜利!! 鲜花\n", nameA);
      getchar();
      getchar();
      break; //跳出最外层while
    }//不用下了

  }

  return 0;

}

以上所述就是本文的全部内容了,希望大家能够喜欢。

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索c语言
五子棋
c语言实现五子棋、五子棋c语言代码、c语言五子棋、c语言五子棋人机对战、五子棋c语言源代码,以便于您获取更多的相关知识。

时间: 2025-01-19 09:11:25

纯C语言实现五子棋_C 语言的相关文章

排列和组合算法的实现方法_C语言经典案例_C 语言

排列和组合算法是考查递归的常见算法,这两种算法能用递归简洁地实现. 本人在经过多次摸索和思考之后,总结如下,以供参考. 程序代码如下: #include <stdio.h> #include <stdlib.h> char array[] = "abcd"; #define N 4 #define M 3 int queue[N] = {0}; int top = 0; int flag[N] = {0}; void perm(int s, int n) { i

深入理解C语言的逻辑控制_C 语言

本文对C语言的逻辑控制做一番较为深入的探讨,一般来说C语言的逻辑控制语句主要有如下的7种: 1. goto 最强大,但一般只在特殊环境下使用. 2. if else 3. ?: 4. switch case 5. for 6. while 7. do while 自从dijkstra的论文Go To Statement Considered Harmful以后,C语言代码很少看到goto了.(一般用在多次资源分配的错误处理上) 但,从计算机的角度来说,缺少goto(jmp指令)还真没法干活.其实

如何优雅地使用c语言编写爬虫_C 语言

大家在平时或多或少地都会有编写网络爬虫的需求.一般来说,编写爬虫的首选自然非python莫属,除此之外,java等语言也是不错的选择.选择上述语言的原因不仅仅在于它们均有非常不错的网络请求库和字符串处理库,还在于基于上述语言的爬虫框架非常之多和完善.良好的爬虫框架可以确保爬虫程序的稳定性,以及编写程序的便捷性.所以,这个cspider爬虫库的使命在于,我们能够使用c语言,依然能够优雅地编写爬虫程序. 1.爬虫的特性 配置方便.使用一句设置函数,即可定义user agent,cookie,time

C语言实现双向链表_C 语言

这个小代码是我凭自己对指针和链表的理解和认识,自己实现的,没有参考其他人的代码,如果有相同的地方,那真的只是巧合,代码我在ubuntu 15.04下测试通过,可能存在很多错误和漏洞. doublelist.c /************************************************************************* > File Name: doublelist.c > Author: ChenYiLiang > Mail: chenyilian

MySQL的C语言API接口_C 语言

1.首先当然是连接数据库,函数原型如下: MYSQL * STDCALL mysql_real_connect(MYSQL *mysql, const char *host, const char *user, const char *passwd, const char *db, unsigned int port, const char *unix_socket, unsigned long clientflag); 第一个参数 MYSQL是 C api中一个非常重要的变量,里面内存非常丰富

socket多人聊天程序C语言版(一)_C 语言

首先,不要一步登天直接解决多人聊天这个问题,先把问题化简. 1.多人聊天的核心问题是服务器如何标识不同的客户端,如何根据客户端的需求转发消息给指定客户端. 2.多人聊天转化为C-C聊天,但是不再是直接C-C,而是通过server转发消息,所以变成==>C-S-C. 3.server如何允许2个client同时连接,设置listen函数的第二个参数,最大连接数. 4.server如何标识两个client,用一个结构体数组来存放两个client的信息. 5.server如何转发消息给client,很

socket多人聊天程序C语言版(二)_C 语言

socket多人聊天程序C语言版(一)地址: http://www.jb51.net/article/94938.htm 1V1实现了,1V多也就容易了.不过相对于1V1的程序,我经过大改,采用链表来动态管理.这样效率真的提升不少,至少CPU使用率稳稳的在20以下,不会飙到100了.用C语言写这个还是挺费时间的,因为什么功能函数都要自己写,不像C++有STL库可以用,MFC写就更简单了,接下来我还会更新MFC版本的多人聊天程序.好了,废话少说,进入主题. 这个程序要解决的问题如下: 1.CPU使

C语言编写多功能日历_C 语言

我分享的第一个代码 希望大家给予我改进的建议 我的3和4的功能是空着的我还没有想好要些啥功能...  第一次上传代码······  ***还有为啥我上传的代码这么就对不齐了,在vc++6.0里就很好啊??比如说有些代码上传上来就成了在其他代码后面了对不齐 不规格了 . #include<stdio.h> #include<stdlib.h> #include<string.h> #include<windows.h> #define H "%d&q

马尔可夫链算法(markov算法)的awk、C++、C语言实现代码_C 语言

1. 问题描述 马尔可夫链算法用于生成一段随机的英文,其思想非常简单.首先读入数据,然后将读入的数据分成前缀和后缀两部分,通过前缀来随机获取后缀,籍此产生一段可读的随机英文. 为了说明方便,假设我们有如下一段话:   复制代码 代码如下:    Show your flowcharts and conceal your tables and I will be mystified. Show your tables and your flowcharts will be obvious.   假