C语言实现递归版多子棋的设计(上)

简介: C语言实现递归版多子棋的设计



一.思路分享(源码在最后)

首先从main函数开始

1)我们首先要打印菜单,可以参考我的菜单
void menu() {
  printf("******************\n");
  printf("***** 1.开始 *****\n");
  printf("***** 0.退出 *****\n");
  printf("******************\n");
}

因为我们可能要玩多局,所以,我们需要循坏报括它

2)之后就是做选择了,我们需要switch来帮助判断,if也可以
int choose;
  do {
    menu();
    scanf("%d", &choose);
    switch (choose) {
    case 0:
      printf("正在退出\n");
      break;
    case 1:game();
      break;
    default:
      printf("没有这个输入选项,请重新输入\n");
    }
  } while (choose);
3)选择游戏之后我们就要开始写游戏的细节了

游戏首先需要棋盘,和棋子,棋子我建议用二维数组代替,一开始用空白格填充,那我们就需要一个函数初始化函数,初始化函数只要一个循坏嵌套就行了,参数需要数组和数组大小就能实现

void init(char arr[Row][Col], int row, int col) {
  int i, j;
  for (i = 0; i < row; i++)
    for (j = 0; j < col; j++)
      arr[i][j] = ' ';
}
4)接下来就是打印棋盘了,棋盘格式自定,行,列和胜利时的棋子数的定义建议用宏定义,可以参考我的
#define Row 10//改变棋盘行数
#define Col 10//改变棋盘列数
#define Times 5//改变胜利棋子数
void menu1(char arr[Row][Col], int row, int col) {
  int i, j;
  for (j = 0; j < row; j++) {
    for (i = 0; i < col; i++) {
      printf(" %c ", arr[j][i]);
      if (i < row - 1)
        printf("|");
    }
    printf("\n");
    if(j<row-1)
      for (i = 0; i < col; i++) {
        printf("---");
        if (i < col - 1)
          printf("|");
      }
    printf("\n");
  }
}

效果如下

5) 接下来实现人下棋,实际就是给数组赋值(不为空,并且位于数组里面)
void playmove(char arr[Row][Col], int row, int col) {
  int x, y;
  while (1) {
    printf("玩家下棋->");
    scanf("%d%d", &x, &y);
    printf("\n");
    if (x < row + 1 && y < col + 1 && arr[x-1][y-1] == ' ') {
      arr[x-1][y-1] = '*';
      break;
    }
    else printf("输入错误或者输入的位置已经被下过,请重新下棋\n");
  }
}
6)然后就是电脑下棋,用随机值赋值(要为空并且属于数组里面),随机值的设定可以参考我的文章
void computermove(char arr[Row][Col], int row, int col) {
  while (1) {
    int x = rand() % row;
    int y = rand() % col;
    if (arr[x][y] == ' ') {
      arr[x][y] = '#';
      break;
    }
  }
}

因为每下一步棋电脑和人都可能赢了,所以我们每下一部棋多要判断并打印棋盘

判断代码:如果棋盘满了返回Q(平局),C(继续),*(人胜利),#(电脑胜利)

我分了六个部分判断是否有人赢

第一个部分判断是否每一行有足够相同字符

for (i = 0; i < row; i++) {
    for (j = 0, flag = 0; j < col; j++) {
      if (arr[i][j] == arr[i][count]&&arr[i][count]!=' ')
        flag++;
      else {
        flag = 0;
        count = j;
      }
      if (flag == times)return arr[i][j];
    }

第二个部分检查每一列

for (i = 0; i < col; i++) {
      for (j = 0, flag = 0; j < row; j++) {
        if (arr[j][i] == arr[count][j] && arr[j][i] != ' ')
          flag++;
        else {
          flag = 0;
          count = j;
        }
        if (flag == times)return arr[i][j];
      }
    }

第三个部分

for (i=0; i < row; i++) {
    flag = 0;
    j = 0;
    count = 0;
    count1 = i;
    k = i;
    while (k < row && j < col) {
      if (arr[k][j] == arr[count1][count]&& arr[count1][count]!=' ')
        flag++;
      else {
        flag = 0;
        count = j;
        count1 = k;
      }
      if (flag == times)return arr[count1][count];
      k++;
      j++;
    }
  }

第四个部分

for (i = 0; i < row; i++) {
    flag = 0;
    j = 0;
    count = col-1;
    count1 = i;
    k = i;
    while (k < row && j < col) {
      if (arr[k][j] == arr[count1][count]&&arr[k][j]!=' ')
        flag++;
      else {
        flag = 0;
        count = j;
        count1 = k;
      }
      if (flag == times)return arr[count1][count];
      k++;
      j--;
    }
  }

第五个部分

for (i = 0, j = col - 1; j > 0; j--) {
    flag = 0;
    i = 0;
    count = j;
    count1 = 0;
    k = j;
    while (k < col && i<row) {
      if (arr[i][k] == arr[count1][count]&& arr[count1][count]!=' ')
        flag++;
      else {
        flag = 0;
        count = k;
        count1 = i;
      }
      if (flag == times)return arr[count1][count];
      k--;
      i++;
    }
  }

第六个部分

for (i = 0,j=0; j < col; j++) {
    flag = 0;
    i = 0;
    count = j;
    count1 = i;
    k = j;
    while (i < row && k < col) {
      if (arr[i][k] == arr[count1][count]&&arr[i][k]!=' ')
        flag++;
      else {
        flag = 0;
        count = k;
        count1 = i;
      }
      if (flag == times)return arr[count1][count];
      k++;
      i++;
    }
  }
7)最后遍历一次即可判断完成
for (i = 0; i < row; i++)
    for (j = 0; j < col; j++)
      if (arr[i][j] != ' ')count++;
      else break;
  if (count == row * col)return 'Q';
  else return 'C';

相关文章
|
3月前
|
机器学习/深度学习 C语言
九/十:《初学C语言》— 扫雷游戏实现和函数递归基础
【8月更文挑战第5天】本篇文章用C语言采用多文件编写实现了一个基础的扫雷游戏(附源码),并讲解了关于函数递归的基础概念及其相对应的习题练习(附源码)
42 1
九/十:《初学C语言》— 扫雷游戏实现和函数递归基础
|
1月前
|
机器学习/深度学习 C语言
【c语言】一篇文章搞懂函数递归
本文详细介绍了函数递归的概念、思想及其限制条件,并通过求阶乘、打印整数每一位和求斐波那契数等实例,展示了递归的应用。递归的核心在于将大问题分解为小问题,但需注意递归可能导致效率低下和栈溢出的问题。文章最后总结了递归的优缺点,提醒读者在实际编程中合理使用递归。
61 7
|
1月前
|
C语言
c语言回顾-函数递归(上)
c语言回顾-函数递归(上)
34 2
|
1月前
|
C语言
c语言回顾-函数递归(下)
c语言回顾-函数递归(下)
39 0
|
3月前
|
机器学习/深度学习 C语言
【C语言篇】递归详细介绍(基础概念习题及汉诺塔等进阶问题)
要保持最小的步数,每一次汉诺塔问题(无论是最初还是递归过程中的),如果此时初始柱盘子数为偶数,我们第一步是把最上面的盘子移动到中转柱,如果为奇数,我们第一步则是将其移动到目标柱。
82 0
【C语言篇】递归详细介绍(基础概念习题及汉诺塔等进阶问题)
|
3月前
|
C语言
C语言中的递归
C语言中的递归
|
4月前
|
存储 编译器 C语言
|
4月前
|
存储 编译器 C语言
【C语言】三子棋及多子棋
C语言实现三子棋及多子棋
32 2
【C语言】三子棋及多子棋
|
3月前
|
算法 编译器 C语言
【C语言】递归
【C语言】递归
21 0
|
4月前
|
存储 算法 程序员
C语言编程—递归
递归是函数自我调用的编程技术,常用于解决分治问题,如计算阶乘和斐波那契数列。示例中展示了C语言的阶乘和斐波那契数列递归实现。递归需满足:问题可转化为规模更小的同类问题,存在结束条件以防止无限循环,并可能消耗大量时间和栈空间。栈用于存储函数调用信息,过多递归可能导致栈溢出。递归虽简洁,但非最优效率选择,递推算法通常是更好的替代方案。