用C语言实现三子棋

简介: 用C语言实现三子棋

1 创建文件

test.c (游戏的测试逻辑)game.c(游戏的实现逻辑)gane.h(游戏实现函数的声明)

game.c 和game.h属于游戏实现 test.c属于游戏测试

test.c 源文件(源文件添加)——game.c 源文件(源文件添加)——game.h(头文件添加)

三个文件

2 首先在test.c文件写一个主函数,主函数里面有一个测试函数,测试函数里面写菜单、进入游戏、退出游戏

代码展示:

1. void menu()
2. {
3.  printf("***************************\n");
4.  printf("********  1.play   ********\n");
5.  printf("********  0.exit   ********\n");
6.  printf("***************************\n");
7. }
8. 
9. void test()
10. {
11.   int input = 0;
12.   do
13.   {
14.     menu();
15.     printf("请选择:->");
16.     scanf("%d", &input);
17.     switch (input)
18.     {
19.     case 1:
20.       printf("三子棋\n");
21.       break;
22.     case 0:
23.       printf("退出游戏\n");
24.       break;
25.     default:
26.       printf("选择错误\n");
27.       break;
28.     }
29.   } while (input);
30. }
31. 
32. #include <stdio.h>
33. int main()
34. {
35.   test();
36.   return 0;
37. }

注意:

(1)一般用do while (游戏可能会玩很多次,最少一次)

(2)先打印一个菜单

(3)switch语句,要记得break,要记得default

接下来 把printf("三子棋\n")  改成 game(); 然后开始写游戏部分。

3 三子棋代码

思路:(\n 不要忘记写)

(1)棋盘用数组

(2)假设玩家走用' * ',电脑走用' # ',所以用字符类型的数组(3*3的)

        row 中文意思是行 column 中文意思是列   init 英文最初的简写

        引用自己写的文件 把#include < >改成 #include " "

(3)棋盘初始化

函数的声明在头文件里

(4)打印棋盘 (打印数据、分割行),把数据行和分割行看做一大部分,最后一部分没有分割行而已。

(5)玩家下棋,打印棋盘,电脑下棋,打印棋盘。

(6)每下一步棋后,会有四种结果 玩家赢,电脑赢,平局,继续玩 。所以要进行判断。

玩家赢 ‘*’,电脑赢‘#’,平局‘Q’,继续 ‘C’

game.h 部分代码展示

1. #pragma once
2. #include <stdio.h>
3. #include <time.h>
4. #include <stdlib.h>
5. 
6. #define ROW 3
7. #define COL 3
8. 
9. //初始化棋盘
10. void Initboard(char board[ROW][COL], int row, int col);//define 定义的ROW,COL是常量,而这里的row,col都是变量,所以不能替代
11. void Displayboard(char board[ROW][COL], int row, int col);//打印棋盘
12. void player_move(char board[ROW][COL], int row, int col);//玩家下棋
13. void computer_move(char board[ROW][COL], int row, int col);//电脑下棋
14. 
15. char is_win(char board[ROW][COL], int row, int col);//判断输赢以及平局和继续玩

game.c代码展示

1. #include "game.h"
2. 
3. 
4. void Initboard(char board[ROW][COL], int row, int col)
5. {
6.  int i = 0;
7.  int j = 0;
8.  for (i = 0; i < row; i++)
9.  {
10.     for (j = 0; j < col; j++)
11.     {
12.       board[i][j] = ' ';
13.     }
14.   }
15. }
16. 
17. void Displayboard(char board[ROW][COL], int row, int col)
18. {
19.   int i = 0;
20.   int j = 0;
21.   for (i = 0; i < row; i++)
22.   {
23.     //打印数据
24.     //printf(" %c | %c | %c \n", board[i][0], board[i][1], board[i][2]);//固定的数字0,1,2 会把棋盘给固定住,所以不能这样写
25.     for (j = 0; j < col; j++)
26.     {
27.       printf(" %c ", board[i][j]);
28.       if (j < col - 1)
29.         printf("|");
30.     }
31.     printf("\n");
32.     //打印分割行
33.     if (i < row - 1)
34.     {
35.       for (j = 0; j < col; j++)
36.       {
37.         printf("---");
38.         if (j < col - 1)
39.         {
40.           printf("|");
41.         }
42.       }
43.       printf("\n");
44.     }
45.   }
46. 
47. }
48. 
49. int is_full(char board[ROW][COL], int row, int col)
50. {
51.   int i = 0;
52.   int j = 0;
53.   for (i = 0; i < row; i++)
54.   {
55.     for (j = 0; j < col; j++)
56.     {
57.       if (board[i][j] == ' ')
58.       {
59.         return 0;
60.       }
61.     }
62.   }
63.   return 1;
64. }
65. 
66. void player_move(char board[ROW][COL], int row, int col)
67. {
68.   int x = 0;
69.   int y = 0;
70.   printf("请输入坐标:->");
71.   while (1)
72.   {
73.     scanf("%d %d", &x, &y);
74.     //判断坐标是否在棋盘范围
75.     if ((x >= 1 && x <= row) && (y >= 1 && y <= col))
76.     {
77.       if (board[x - 1][y - 1] == ' ')
78.       {
79.         board[x - 1][y - 1] = '*';
80.         break;
81.       }
82.       else
83.       {
84.         printf("该坐标被占用,请重新输入!\n");
85.       }
86.     }
87.     else
88.     {
89.       printf("坐标非法\n");
90.     }
91.   }
92. }
93. 
94. //电脑下棋
95. void computer_move(char board[ROW][COL], int row, int col)
96. {
97.   int x = 0;
98.   int y = 0;
99.   printf("电脑下棋\n");
100.  while (1)
101.  {
102.    x = rand() % row;
103.    y = rand() % col;
104.    if (board[x][y] == ' ')
105.    {
106.      board[x][y] = '#';
107.      break;
108.    }
109.  }
110. }
111. //判断每一步棋后是输赢,还是平局,还是继续玩
112. char is_win(char board[ROW][COL], int row, int col)
113. {
114.  int i = 0;
115.  for (i = 0; i < row; i++)
116.  {
117.    if (board[i][0] == board[i][1] && board[i][1] == board[i][2] && board[i][0] != ' ')
118.    {
119.      return board[i][0];
120.    }
121.  }
122.  for (i = 0; i < col; i++)
123.  {
124.    if (board[0][i] == board[1][i] && board[1][i] == board[2][i] && board[0][i] != ' ')
125.    {
126.      return board[0][i];
127.    }
128.  }
129.  if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[1][1] != ' ')
130.  {
131.    return board[0][0];
132.  }
133.  if (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[1][1] != ' ')
134.  {
135.    return board[1][1];
136.  }
137.  int a = is_full(board, row, col);
138.  if (1 == a)
139.  {
140.    return 'Q';
141.  }
142.  return 'C';
143. }

test.c 部分代码展示

1. #include "game.h"
2. 
3. void menu()
4. {
5.  printf("***************************\n");
6.  printf("********  1.play   ********\n");
7.  printf("********  0.exit   ********\n");
8.  printf("***************************\n");
9. }
10. 
11. void game()
12. {
13.   char board[ROW][COL] = { 0 };
14.   Initboard(board, ROW, COL);//棋盘初始化,内容为空格
15.   Displayboard(board, ROW, COL);//打印棋盘
16.   char ret = 0;
17.   //下棋
18.   while (1)
19.   {
20.     player_move(board, ROW, COL);
21.     Displayboard(board, ROW, COL);
22.     ret = is_win(board, ROW, COL);
23.     if (ret != 'C')
24.     {
25.       break;
26.     }
27.     computer_move(board, ROW, COL);
28.     Displayboard(board, ROW, COL);
29.     ret = is_win(board, ROW, COL);
30.     if (ret != 'C')
31.     {
32.       break;
33.     }
34.   }
35.   if (ret == '*')
36.   {
37.     printf("恭喜你,取得胜利!\n");
38.   }
39.   else if (ret == 'Q')
40.   {
41.     printf("平局\n");
42.   }
43.   else
44.   {
45.     printf("你输了\n");
46.   }
47. }
48. 
49. void test()
50. {
51.   int input = 0;
52.   srand((unsigned int)time(NULL));
53.   do
54.   {
55.     menu();
56.     printf("请选择:->");
57.     scanf("%d", &input);
58.     switch (input)
59.     {
60.     case 1:
61.       game();
62.       break;
63.     case 0:
64.       printf("退出游戏\n");
65.       break;
66.     default:
67.       printf("选择错误\n");
68.       break;
69.     }
70.   } while (input);
71. }
72. 
73. 
74. int main()
75. {
76.   test();
77.   return 0;
78. }

三子棋就结束了!

相关文章
|
7月前
|
C语言
以c语言为基础实现的简易三子棋
以c语言为基础实现的简易三子棋
43 1
|
7月前
|
C语言
c语言简单三子棋
c语言简单三子棋
|
7月前
|
算法 C语言 C++
【C语言实战项目】三子棋游戏
【C语言实战项目】三子棋游戏
62 1
|
7月前
|
C语言
C语言之三子棋小游戏
C语言之三子棋小游戏
|
7月前
|
C语言
用c语言实现三子棋
用c语言实现三子棋
34 0
|
6月前
|
C语言
【海贼王编程冒险 - C语言海上篇】C语言如何实现简单的三子棋游戏?
【海贼王编程冒险 - C语言海上篇】C语言如何实现简单的三子棋游戏?
32 1
|
7月前
|
C语言
万字详解:C语言三子棋进阶 + N子棋递归动态判断输赢(二)
我们可以通过创建并定义符号常量NUMBER,来作为判断是否胜利的标准。如三子棋中,令NUMBER为3,则这八个方向中有任意一个方向达成3子连珠,则连珠的这个棋子所代表的玩家获胜。
83 1
|
7月前
|
算法 C语言 C++
万字详解:C语言三子棋进阶 + N子棋递归动态判断输赢(一)
三子棋游戏设计的核心是对二维数组的把握和运用。
98 1
|
7月前
|
编译器 C语言
【C语言入门小游戏】三子棋
【C语言入门小游戏】三子棋
56 0
【C语言入门小游戏】三子棋
|
7月前
|
C语言
【用C语言轻松搞定】三子棋(超详细教程)
【用C语言轻松搞定】三子棋(超详细教程)