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

相关文章
|
4天前
|
【C语言程序设计——函数】递归求斐波那契数列的前n项(头歌实践教学平台习题)【合集】
本关任务是编写递归函数求斐波那契数列的前n项。主要内容包括: 1. **递归的概念**:递归是一种函数直接或间接调用自身的编程技巧,通过“俄罗斯套娃”的方式解决问题。 2. **边界条件的确定**:边界条件是递归停止的条件,确保递归不会无限进行。例如,计算阶乘时,当n为0或1时返回1。 3. **循环控制与跳转语句**:介绍`for`、`while`循环及`break`、`continue`语句的使用方法。 编程要求是在右侧编辑器Begin--End之间补充代码,测试输入分别为3和5,预期输出为斐波那契数列的前几项。通关代码已给出,需确保正确实现递归逻辑并处理好边界条件,以避免栈溢出或结果
42 16
九/十:《初学C语言》— 扫雷游戏实现和函数递归基础
【8月更文挑战第5天】本篇文章用C语言采用多文件编写实现了一个基础的扫雷游戏(附源码),并讲解了关于函数递归的基础概念及其相对应的习题练习(附源码)
51 1
九/十:《初学C语言》— 扫雷游戏实现和函数递归基础
【c语言】一篇文章搞懂函数递归
本文详细介绍了函数递归的概念、思想及其限制条件,并通过求阶乘、打印整数每一位和求斐波那契数等实例,展示了递归的应用。递归的核心在于将大问题分解为小问题,但需注意递归可能导致效率低下和栈溢出的问题。文章最后总结了递归的优缺点,提醒读者在实际编程中合理使用递归。
95 7
|
3月前
|
c语言回顾-函数递归(上)
c语言回顾-函数递归(上)
56 2
|
3月前
|
c语言回顾-函数递归(下)
c语言回顾-函数递归(下)
60 0
【C语言篇】递归详细介绍(基础概念习题及汉诺塔等进阶问题)
要保持最小的步数,每一次汉诺塔问题(无论是最初还是递归过程中的),如果此时初始柱盘子数为偶数,我们第一步是把最上面的盘子移动到中转柱,如果为奇数,我们第一步则是将其移动到目标柱。
122 0
【C语言篇】递归详细介绍(基础概念习题及汉诺塔等进阶问题)
|
5月前
|
C语言中的递归
C语言中的递归
【C语言】三子棋及多子棋
C语言实现三子棋及多子棋
37 2
【C语言】三子棋及多子棋

热门文章

最新文章