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

简介: C语言实现递归版多子棋的设计
C语言实现递归版多子棋的设计(上)https://developer.aliyun.com/article/new#8%EF%BC%89%E6%9C%80%E5%90%8E%E4%B8%B2%E8%81%94%E5%9C%A8%E4%B8%80%E8%B5%B7
8)最后串联在一起
void game() {
  char c='C';
  int result = 1;
  char arr[Row][Col];
  init(arr, Row, Col);
  menu1(arr, Row, Col);
  while (c=='C') {
    playmove(arr, Row, Col);
    menu1(arr, Row, Col);
    c = iswin(arr, Row, Col, Times);
    if (c != 'C')break;
    computermove(arr, Row, Col);
    menu1(arr, Row, Col,Times);
    c = iswin(arr, Row, Col, Times);
  }
  if (c == '*')printf("玩家胜利\n");
  else if (c == '#')printf("电脑胜利\n");
  else printf("平局\n");
}

二.展示源码

#include<time.h>
#include<stdlib.h>
#include<stdio.h>
#define Row 10//改变棋盘行数
#define Col 10//改变棋盘列数
#define Times 5//改变胜利棋子数
void menu();
void game();
void init(char arr[Row][Col], int row, int col);
void menu1(char arr[Row][Col], int row, int col);
void playmove(char arr[Row][Col], int row, int col);
void computermove(char arr[Row][Col], int row, int col);
char iswin(char arr[Row][Col], int row, int col,int times);
int main() {
  srand((unsigned int)time(NULL));
  int choose;
  do {
    menu();
    scanf("%d", &choose);
    switch (choose) {
    case 0:
      printf("正在退出\n");
      break;
    case 1:game();
      break;
    default:
      printf("没有这个输入选项,请重新输入\n");
    }
  } while (choose);
  return 0;
}
void menu() {
  printf("******************\n");
  printf("***** 1.开始 *****\n");
  printf("***** 0.退出 *****\n");
  printf("******************\n");
}
void game() {
  char c='C';
  int result = 1;
  char arr[Row][Col];
  init(arr, Row, Col);
  menu1(arr, Row, Col);
  while (c=='C') {
    playmove(arr, Row, Col);
    menu1(arr, Row, Col);
    c = iswin(arr, Row, Col, Times);
    if (c != 'C')break;
    computermove(arr, Row, Col);
    menu1(arr, Row, Col,Times);
    c = iswin(arr, Row, Col, Times);
  }
  if (c == '*')printf("玩家胜利\n");
  else if (c == '#')printf("电脑胜利\n");
  else printf("平局\n");
}
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] = ' ';
}
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");
  }
}
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");
  }
}
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;
    }
  }
}
char iswin(char arr[Row][Col], int row, int col, int times) {
  int i, flag = 0, j, count = 0, k, count1;
  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];
    }
    count = 0;
    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++;
    }
  }
  count = 0;
  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语言的阶乘和斐波那契数列递归实现。递归需满足:问题可转化为规模更小的同类问题,存在结束条件以防止无限循环,并可能消耗大量时间和栈空间。栈用于存储函数调用信息,过多递归可能导致栈溢出。递归虽简洁,但非最优效率选择,递推算法通常是更好的替代方案。