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';

相关文章
|
1月前
|
存储 编译器 C语言
爱上C语言:函数递归,青蛙跳台阶图文详解
爱上C语言:函数递归,青蛙跳台阶图文详解
|
2月前
|
机器学习/深度学习 存储 C语言
c语言从入门到实战——函数递归
函数递归是指一个函数直接或间接地调用自身,以解决问题的一种方法。在C语言中,函数递归可以用来计算阶乘、斐波那契数列等数学问题。 函数递归是一种编程技术,其中函数直接或间接地调用自身来解决问题。它常用于处理可以分解为更小同类问题的复杂问题,如排序、搜索树等。递归的基本思想是将问题分解为更简单的子问题,然后组合子问题的解来得到原问题的解。然而,递归需要小心处理终止条件,否则可能导致无限循环。此外,递归可能消耗大量内存,因为它需要存储每个递归调用的状态。因此,在使用递归时,应仔细考虑其效率和适用性。
33 0
|
2月前
|
C语言
C语言递归问题【青蛙跳台阶】和【汉诺塔】
C语言递归问题【青蛙跳台阶】和【汉诺塔】
|
7天前
|
C语言
【C语言/数据结构】排序(快速排序及多种优化|递归及非递归版本)
【C语言/数据结构】排序(快速排序及多种优化|递归及非递归版本)
9 0
|
18天前
|
机器学习/深度学习 C语言
函数递归深入解析(C语言)
函数递归深入解析(C语言)
|
21天前
|
C语言 索引
c语言的函数与递归
c语言的函数与递归
15 1
|
1月前
|
搜索推荐 C语言 C++
【排序算法】C语言实现归并排序,包括递归和迭代两个版本
【排序算法】C语言实现归并排序,包括递归和迭代两个版本
|
1月前
|
C语言 索引
【C语言】C语言⻘蛙跳台阶问题--递归问题
【C语言】C语言⻘蛙跳台阶问题--递归问题
|
2月前
|
C语言
C语言第十四弹---函数递归
C语言第十四弹---函数递归
|
2月前
|
算法 大数据 Serverless
C语言递归
C语言递归
11 0