我是靠谱客的博主 体贴石头,这篇文章主要介绍C语言实现简易版三子棋游戏,现在分享给大家,希望可以做个参考。

本文实例为大家分享了C语言实现三子棋游戏的具体代码,供大家参考,具体内容如下

什么是多文件?

多数大型的工程的头文件和源文件非常多,我们也不可能把所有的代码都写在同一个文件里,这样也不方便代码的阅读与维护,通常都会根据不同的功能将代码分别书写到多个源文件与头文件中。 

游戏介绍

三子棋是个简单的双人游戏,双方在3X3的棋盘上轮流落子,当一条直线上出现三颗连续且相同的棋子时即获胜。此程序让玩家先落子,电脑在棋盘上随机落子。游戏结束时显示胜负,玩家可以选择是否继续玩游戏。

代码实现

chess.h

通常我们会在头文件中写一些类型的定义、结构体定义、宏定义、函数声明、include包含等内容。

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#ifndef _CHESS_H_ #define _CHESS_H_ #include<stdio.h> #include <stdlib.h> #include <string.h> #include <time.h> #include<windows.h> #pragma warning(disable:4996) #define ROW 3 #define COL 3 #define BLACK_PIECE 'X' #define WHITE_PIECE 'O' void InitBoard(char board[ROW][COL], int row, int col); void ShowBoard(char board[ROW][COL], int row, int col); void PlayerMove(char board[ROW][COL], int row, int col); int ComputerMove(char board[ROW][COL], int row, int col); char CheckWin(char board[ROW][COL], int row, int col); #endif

chess.c

源文件中包含了chess.h这个头文件,于是在这个chess.c文件中就可以使用这些在头文件中定义的内容,可以使用自定义类型、自定义函数、标准输入输出函数等。

include的路径问题,当使用< >来指定包含的头文件时,编译器会从系统头文件库中进行查找,而使用" "来包含的头文件,编译器将会从当前程序目录进行查找。在include时被包含文件可以是绝对路径,也可以是相对路径,总之,只要头文件的存放路径与当前源文件的关系正确即可。

复制代码
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
#include "chess.h" //打印棋盘 void InitBoard(char board[][COL], int row, int col) { for (int i = 0; i < row; i++){ for (int j = 0; j < col; j++){ board[i][j] = ' '; } } } void ShowBoard(char board[][COL], int row, int col) { printf(" | 1 | 2 | 3 |n"); int i = 0; for (; i < row; i++){ printf("----------------n"); printf(" %d | %c | %c | %c |n", i + 1, board[i][0], board[i][1], board[i][2]); } printf("----------------n"); } //玩家下棋 void PlayerMove(char board[][COL], int row, int col) { int x = 0; int y = 0; printf("n"); printf("----------玩家走----------n"); printf("n"); while (1){ printf("请输入走的坐标<x,y>:"); scanf("%d%d", &x, &y); if (x >= 1 && x <= row && y >= 1 && y <= col){ if (board[x - 1][y - 1] == ' '){ board[x - 1][y - 1] = 'X'; break; } else{ printf("坐标被占用,请重新输入!n"); } } else{ printf("坐标有误!n"); } } } //电脑下棋 int ComputerMove(char board[][COL], int row, int col) { int x = 0; int y = 0; printf("n"); printf("----------电脑走----------n"); printf("n"); while (1){ for (x = 0; x <= 2; x++){ //当玩家有两个子连成一条线时,堵! for (y = 0; y <= 2; y++){ if (board[x][y] == ' '){ board[x][y] = 'X'; if (CheckWin(board, ROW, COL) == 'X'){ board[x][y] = 'O'; //一旦落子,就直接跳出while循环,后面都一样 Sleep(500); return 0; } else{ board[x][y] = ' '; //还原 } } } } if (board[1][1] == ' '){ //如果中间可以落子,在中间落子 board[1][1] = 'O'; Sleep(500); return 0; } else{ //如果四个角可以落子,在四个角上落子。 for (x = 0; x <= 2; x += 2){ for (y = 0; y <= 2; y += 2){ if (board[x][y] == ' '){ board[x][y] = 'O'; Sleep(500); return 0; } } } } x = rand() % row; //四个边的中间随机落子,0—2 y = rand() % col; if (board[x][y] == ' '){ board[x][y] = 'O'; Sleep(1000); break; } printf("n"); } } static int IsFull(char board[ROW][COL], int row, int col) { int i = 0; int j = 0; for (i = 0; i < row; i++){ for (j = 0; j < col; j++){ if (board[i][j] == ' ') return 0; } } //已满 return 1; } //用户赢了 BLACK_PIECE 'X' //电脑赢了 WHITE_PIECE 'O' //平局, 'Q' //继续, 'C' //结果判断 玩家赢 or 电脑赢 or 平局 char CheckWin(char board[ROW][COL], int row, int col) { int i = 0; for (; i < row; i++){ //判断一行是否相同 if (board[i][0] != ' ' && board[i][0] == board[i][1] && board[i][1] == board[i][2]){ return board[i][0]; } } for (i = 0; i < col; i++){ //判断一列是否相同 if (board[0][i] != ' ' && board[0][i] == board[1][i] && board[1][i] == board[2][i]){ return board[0][i]; } } if (board[0][0] != ' ' && board[0][0] == board[1][1] && board[1][1] == board[2][2]){ return board[0][0]; } if (board[0][2] != ' ' && board[0][2] == board[1][1] && board[1][1] == board[2][0]){ return board[1][1]; } //平局 if (IsFull(board, row, col) == 1){ return 'Q'; } //继续 return 'C'; }

main.c

理清思路,搭建好运行的框架。

1.游戏菜单,选择玩/不玩
2.打印棋盘
3.玩家落子
4.打印棋盘
5.电脑落子
6.打印棋盘
7.…
8.显示胜负
9.返回游戏菜单,选择玩/不玩

复制代码
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
#include "chess.h" void Menu() { printf("n"); printf("----------三子棋游戏----------n"); printf("n"); printf("******************************n"); printf("* 1.Play *n"); printf("* 2.Exit *n"); printf("******************************n"); printf("n"); printf("Please Enter Select:"); } void Game() { char board[ROW][COL] = { 0 };//记录棋盘 char ret = 0; InitBoard(board, ROW, COL); ShowBoard(board, ROW, COL);//打印棋盘 while (1){ PlayerMove(board, ROW, COL);//玩家走 ShowBoard(board, ROW, COL);//打印棋盘 //判断输赢 ret = CheckWin(board, ROW, COL); if (ret != 'C'){ break; } ComputerMove(board, ROW, COL);//电脑走 ShowBoard(board, ROW, COL);//打印棋盘 //判断输赢 ret = CheckWin(board, ROW, COL); if (ret != 'C'){ break; } } if (ret == 'X'){ printf("----------玩家赢!----------n"); } else if (ret == 'O'){ printf("----------电脑赢!----------n"); } else if (ret == 'Q'){ printf("----------平局!----------n"); } } int main() { int select = 0; int quit = 0; srand((unsigned int)time(NULL)); while (!quit){ Menu(); scanf("%d", &select); switch (select){ case 1: Game(); while (!select); break; case 2: printf("Game Over!n"); break; default: printf("Enter Error!n"); break; } } system("pause"); return 0; }

测试结果

更多有趣的经典小游戏实现专题,分享给大家:

C++经典小游戏汇总

python经典小游戏汇总

python俄罗斯方块游戏集合

JavaScript经典游戏 玩不停

java经典小游戏汇总

javascript经典小游戏汇总

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持靠谱客。

最后

以上就是体贴石头最近收集整理的关于C语言实现简易版三子棋游戏的全部内容,更多相关C语言实现简易版三子棋游戏内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(123)

评论列表共有 0 条评论

立即
投稿
返回
顶部