广告位联系
返回顶部
分享到

C语言实现三子棋的代码

C语言 来源:互联网 作者:佚名 发布时间:2023-01-10 21:38:58 人浏览
摘要

一、问题描述 用 c 语言实现三子棋。 二、基本流程 在写三子棋的代码之前,我们来看看实现这个游戏的逻辑: 1.菜单界面选择开始或者退出游戏。 2.创建棋盘并初始化。 3.打印棋盘。

一、问题描述

用 c 语言实现三子棋。

二、基本流程

在写三子棋的代码之前,我们来看看实现这个游戏的逻辑:

1.菜单界面选择开始或者退出游戏。

2.创建棋盘并初始化。

3.打印棋盘。

4.玩家落子(玩家输入行列坐标的方式来落子),'x’表示玩家落子。

5.判定胜负关系(输,赢,和棋),'q’表示和棋。

6.电脑落子(随机位置落子) ,'o’表示电脑落子。

7.判定胜负关系。

8.回到 步骤 2 继续执行。

三、步骤

1. 菜单界面

1.开始游戏 0.退出游戏

1

2

3

4

5

6

7

8

9

10

int menu(){

printf("**************************\n");

printf("********1.开始游戏*********\n");

printf("********0.退出游戏*********\n");

printf("**************************\n");

int choice = 0;

printf("请输入你的选择:");

scanf("%d", &choice);

return choice;

}

2. 创建棋盘

棋盘:使用 3 行 3 列的二维数组来表示,元素类型是 char。

使用宏定义的原因:

1.推高代码可读性,后续代码中遇到方便理解含义。

2.提高扩展性,如果将来要修改棋盘尺寸,代码修改会很方便。

1

2

3

#define MAX_ROW 3

#define MAX_COL 3

char chessBoard[MAX_ROW][max_col] = { 0 };

3. 棋盘初始化

’ '表示棋盘上的空白区域

1

2

3

4

5

6

7

void init(char chessBoard[MAX_ROW][max_col]){

   for (int row = 0; row < MAX_ROW; row++){

     for (int col = 0; col < MAX_COL; col++){

       chessBoard[row][col] = ' ';

     }

   }

}

4.打印棋盘

(1)简陋棋盘:

1

2

3

4

5

6

7

8

void print_chessBoard(char chessBoard[MAX_ROW][MAX_COL]){

   for (int row = 0; row <MAX_ROW; row++){

      for (int col = 0; col < MAX_COL; col++){

        printf("%c",chessBoard[row][col]) ;

      }

      printf("\n");

   }

}

结果:

注意:

这里不是棋盘没打印出来,而是我们使用’ '表示空白区域,所以我们看到的棋盘是一片黑色。

这样看的不是很清楚,所以我们选用更加美观的方法打印。

(2)自己打印棋盘:

1

2

3

4

5

6

7

8

void print_chessBoard(char chessBoard[MAX_ROW][MAX_COL]){

    printf("+---+---+---+\n");

    for (int row = 0; row <MAX_ROW; row++) {

        printf("| %c | %c | %c |\n", chessBoard[row][0],

            chessBoard[row][1], chessBoard[row][2]);

        printf("+---+---+---+\n");

    }

}

结果:

5.玩家落子

玩家输入行列坐标表示落子,使用’x’表示玩家落子。

注意:

1. 玩家落子需要在棋盘范围内。

2. 玩家要在棋盘上空的地方落子。

3. 如果输入的坐标不满足要重新输入。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

void playerMove(char chessBoard[MAX_ROW][MAX_COL]){

   while (1){

   int row = 0;

   int col = 0;

   printf("请输入坐标(row col):");

   scanf("%d %d", &row, &col);

   if (row < 0 || row >= MAX_ROW || col < 0 || col >= MAX_COL){

    printf("您的坐标不在合法范围内 [0, 2],请重新输入:\n");

    continue;

   }

   if (chessBoard[row][col] != ' '){

    printf("您的坐标位置已经有子了!\n");

    continue;

   }

   chessBoard[row][col] = 'x';

   break;

   }

}

6.电脑落子

电脑随机产生行列坐标,'o’表示电脑落子。

注意:

1. 要在主函数中使用 srand((unsigned int)time(0))将时间作为随机数种子,确保得到的行列坐标是真随机。

2. 要在棋盘上空的地方下棋。

1

2

3

4

5

6

7

8

9

10

11

void computerMove(char chessBoard[MAX_ROW][MAX_COL]){

   while (1){

   int row = rand() % MAX_ROW;

   int col = rand() % MAX_COL;

   if (chessBoard[row][col] != ' ') {

    continue;

   }

   chessBoard[row][col] = 'o';

   break;

   }

}

7.判断胜负

此处约定返回结果的含义:

(1)‘x’ 表示玩家获胜

(2)‘o’ 表示电脑获胜

(3)’ ’ 表示胜负未分

(4) ‘q’ 表示和棋

1) 判定是否和棋

(1)调用 isFull 函数。

(2)如果数组中有元素为’ ‘,那么没满,返回 0。如果全不为’ ',满了,返回 1。

(3)如果棋盘满了未分出胜负,和棋。

2) 判定电脑玩家胜利

(1)判定所有的行

(2)判定所有的列

(3)判定两条对角线

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

int isFull(char chessBoard[MAX_ROW][MAX_COL]){

  for (int row = 0; row < MAX_ROW; row++){

    for (int col = 0; col < MAX_COL; col++){

      if (chessBoard[row][col] == ' '){

        return 0;

      }

    }

  }

  return 1;

}

 

char isWin(char chessBoard[MAX_ROW][MAX_COL]){

  for (int row = 0; row < MAX_ROW; row++) {

      if (chessBoard[row][0] != ' ' && chessBoard[row][0] == chessBoard[row][1] && chessBoard[row][0] == chessBoard[row][2]) {

        return chessBoard[row][0];

      }

  }

   for (int col = 0; col < MAX_COL; col++) {

    if (chessBoard[0][col] != ' ' && chessBoard[0][col] == chessBoard[1][col] && chessBoard[0][col] == chessBoard[2][col]) {

      return chessBoard[0][col];

    }

   }

   if (chessBoard[0][0] != ' ' && chessBoard[0][0] == chessBoard[1][1] && chessBoard[0][0] == chessBoard[2][2]) {

    return chessBoard[0][0];

   }

   if (chessBoard[2][0] != ' ' && chessBoard[2][0] == chessBoard[1][1] && chessBoard[2][0] == chessBoard[0][2]) {

    return chessBoard[2][0];

   }

   if (isFull(chessBoard)) {

    return 'q';

   }

   return ' ';

}

四、结果演示

1.玩家胜利

2.电脑胜利

3.和棋

五、代码实现

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

138

139

140

141

142

143

144

145

146

147

148

149

150

151

#define _CRT_SECURE_NO_WARNINGS

#define MAX_ROW 3

#define MAX_COL 3

#include <stdio.h>

#include <stdlib.h>

#include <time.h>

void init(char chessBoard[MAX_ROW][MAX_COL]){

  for (int row = 0; row < MAX_ROW; row++){

    for (int col = 0; col < MAX_COL; col++){

      chessBoard[row][col] = ' ';

    }

  }

}

void print_chessBoard(char chessBoard[MAX_ROW][MAX_COL]){

  printf("+---+---+---+\n");

  for (int row = 0; row <MAX_ROW; row++) {

    printf("| %c | %c | %c |\n", chessBoard[row][0],

      chessBoard[row][1], chessBoard[row][2]);

    printf("+---+---+---+\n");

  }

}

void playerMove(char chessBoard[MAX_ROW][MAX_COL]){

  while (1){

    int row = 0;

    int col = 0;

    printf("请输入坐标(row col):");

    scanf("%d %d", &row, &col);

    if (row < 0 || row >= MAX_ROW || col < 0 || col >= MAX_COL){

      printf("您的坐标不在合法范围内 [0, 2],请重新输入:\n");

      continue;

    }

    if (chessBoard[row][col] != ' '){

      printf("您的坐标位置已经有子了!\n");

      continue;

    }

    chessBoard[row][col] = 'x';

    break;

  }

}

void computerMove(char chessBoard[MAX_ROW][MAX_COL]){

  while (1){

    int row = rand() % MAX_ROW;

    int col = rand() % MAX_COL;

    if (chessBoard[row][col] != ' ') {

      continue;

    }

    chessBoard[row][col] = 'o';

    break;

  }

}

int isFull(char chessBoard[MAX_ROW][MAX_COL]){

  for (int row = 0; row < MAX_ROW; row++){

    for (int col = 0; col < MAX_COL; col++){

      if (chessBoard[row][col] == ' '){

        return 0;

      }

 

    }

  }

  return 1;

}

char isWin(char chessBoard[MAX_ROW][MAX_COL]){

  for (int row = 0; row < MAX_ROW; row++) {

    if (chessBoard[row][0] != ' '

      && chessBoard[row][0] == chessBoard[row][1]

      && chessBoard[row][0] == chessBoard[row][2]) {

      return chessBoard[row][0];

    }

  }

  for (int col = 0; col < MAX_COL; col++) {

    if (chessBoard[0][col] != ' '

      && chessBoard[0][col] == chessBoard[1][col]

      && chessBoard[0][col] == chessBoard[2][col]) {

      return chessBoard[0][col];

    }

  }

  if (chessBoard[0][0] != ' '

    && chessBoard[0][0] == chessBoard[1][1]

    && chessBoard[0][0] == chessBoard[2][2]) {

    return chessBoard[0][0];

  }

  if (chessBoard[2][0] != ' '

    && chessBoard[2][0] == chessBoard[1][1]

    && chessBoard[2][0] == chessBoard[0][2]) {

    return chessBoard[2][0];

  }

  if (isFull(chessBoard)) {

    return 'q';

  }

  return ' ';

}

void game(){

  char chessBoard[MAX_ROW][MAX_COL] = { 0 };

  init(chessBoard);

  char winner = ' ';

  while (1){

    system("cls");

    print_chessBoard(chessBoard);

    playerMove(chessBoard);

    winner = isWin(chessBoard);

    if (winner != ' ') {

      break;

    }

    computerMove(chessBoard);

    winner = isWin(chessBoard);

    if (winner != ' ') {

      break;

    }

  }

  print_chessBoard(chessBoard);

  if (winner == 'x') {

    printf("恭喜您, 您赢了!\n");

  }

  else if (winner == 'o') {

    printf("哈哈,您连人工智障都下不过!\n");

  }

  else {

    printf("您只能和人工智障打平手!!\n");

  }

}

 

int menu(){

   printf("**************************\n");

   printf("********1.开始游戏*********\n");

   printf("********0.退出游戏*********\n");

   printf("**************************\n");

  int choice = 0;

  printf("请输入你的选择:");

  scanf("%d", &choice);

  return choice;

}

int main()

{

  srand((unsigned int)time(0));

  while (1){

    int choice = menu();

    if (choice == 1){

      game();

    }

    else if (choice == 0){

      printf("退出游戏,GOODBYE!!!!!\n");

      break;

    }

    else{

      printf("输入错误!请重新输入!\n");

      continue;

    }

  }

  system("pause");

  return 0;

}


版权声明 : 本文内容来源于互联网或用户自行发布贡献,该文观点仅代表原作者本人。本站仅提供信息存储空间服务和不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权, 违法违规的内容, 请发送邮件至2530232025#qq.cn(#换@)举报,一经查实,本站将立刻删除。
原文链接 : https://blog.csdn.net/weixin_64933233/article/details/128583544
相关文章
  • 本站所有内容来源于互联网或用户自行发布,本站仅提供信息存储空间服务,不拥有版权,不承担法律责任。如有侵犯您的权益,请您联系站长处理!
  • Copyright © 2017-2022 F11.CN All Rights Reserved. F11站长开发者网 版权所有 | 苏ICP备2022031554号-1 | 51LA统计