本文实例为大家分享了C语言实现三子棋游戏的具体代码,供大家参考,具体内容如下
先简单介绍一下我的三子棋小游戏是怎么玩的,就是自己跟电脑pk,只不过电脑没这么智能。自己输入想要下的坐标,电脑随机生成一个坐标,直到赢家产生。在这个过程中我觉得比较难的就是赢家的判定部分。在c语言中随机数的产生也就是调用srand()函数利用时间戳来获取随机值。算了游戏太简单,我想你们也都是冲着代码来的,直接上代码。
代码和实现
为了代码逻辑性更高,没那么繁杂,主要将代码分为三个部分,头文件game.h,和两个c文件,game.c放主程序,body.c放各种函数。
1.game.c
讲解:游戏开始要打印一个界面,然后选择要玩游戏还是退出,如果玩游戏就直接调用Game函数再调用各种花里胡哨的函数来实现游戏。game.c没什么可讲的,都是基本操作,有手就行。
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
|
#include "game.h"
void menu() {
printf ( "********************\n" );
printf ( "****** 1.play *****\n" );
printf ( "****** 0.exit *****\n" );
printf ( "********************\n" );
}
void Game() {
char ch;
char board[ROW][COL] = { 0 };
InitBoard(board, ROW, COL);
ShowBoard(board, ROW, COL);
while (1) {
PlayerMove(board, ROW, COL);
ShowBoard(board, ROW, COL);
ch=WhoWin(board, ROW, COL);
if (ch == '*' ) {
printf ( "玩家赢!\n" );
break ;
}
else if (ch == '#' ) {
printf ( "电脑赢!\n" );
break ;
}
else if (ch== 'a' ) {
printf ( "平局!\n" );
break ;
}
WindowPlay(board, ROW, COL);
ShowBoard(board, ROW, COL);
ch = WhoWin(board, ROW, COL);
if (ch == '*' ) {
printf ( "玩家赢!\n" );
break ;
}
else if (ch == '#' ) {
printf ( "电脑赢!\n" );
break ;
}
else if (ch== 'a' ) {
printf ( "平局!\n" );
break ;
}
}
}
int main() {
menu();
srand ((unsigned int ) time (NULL));
int input = 0;
do {
printf ( "请输入:" );
scanf ( "%d" , &input);
switch (input) {
case 1:
Game();
continue ;
case 0:
break ;
default :
printf ( "输入不合法,请从新输入\n" );
continue ;
}
} while (input);
return 0;
}
|
2.body.c
讲解:body.c里就是各种花里胡哨的函数,一个功能一个函数,不要一个函数搞太多功能,看起来比较繁杂,条理不清晰。这里的棋盘借用二维数组来实现,因为二维数组和一个棋盘的构造类似,用二维数组再合适不过,如果你够牛逼,你来个三维数组的。包含的功能有棋盘初始化,打印棋盘,玩家下,电脑下,最后就是判断输赢。判断输赢也是比较难的一个部分。这里我用了最粗暴的方法,就是分四种情况,行,列,对角线,还有棋盘满了。比较繁琐但是比较实用,也没什么可说的都是比较常用的语句。唯一可说的就是srand()函数获取随机值,srand()功能就是生成随机值,还需要一个种子seed为无符号整型数。可以用time(NULL)时间戳来作为这个种子,用rand()%n来获取你想要的数字。
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
|
#include "game.h"
//初始化棋盘
void InitBoard( char board[ROW][COL], int row, int col) {
int i = 0;
for (i = 0; i < row; i++) {
int j = 0;
for (j = 0; j < col; j++) {
board[i][j] = ' ' ;
}
}
}
//打印棋盘
void ShowBoard( char board[ROW][COL], int row, int col) {
int i = 0;
for (i = 0; i < row; i++) {
int j = 0;
for (j = 0; j < col; j++) {
printf ( " %c " , board[i][j]);
if (j < col - 1) {
printf ( "|" );
}
}
printf ( "\n" );
if (i < row - 1) {
printf ( "---|---|---\n" );
}
}
}
//玩家下
void PlayerMove( char board[ROW][COL], int row, int col) {
do {
int i;
int j;
printf ( "请玩家输入:" );
scanf ( "%d%d" , &i, &j);
if (i > row && j > col && i <= 0 && j<= 0) {
printf ( "坐标不合法,请从新输入\n" );
continue ;
}
else if (board[i-1][j-1] == ' ' ) {
board[i-1][j-1] = '*' ;
break ;
}
else {
printf ( "该处已被占请从新输入\n" );
continue ;
}
} while (1);
}
//电脑下
void WindowPlay( char board[ROW][COL], int row, int col) {
printf ( "等待电脑下!\n" );
do {
int i = rand () % 3;
int j = rand () % 3;
if (board[i][j] == ' ' ) {
board[i][j] = '#' ;
break ;
}
else {
continue ;
}
} while (1);
}
//判断输赢
char WhoWin( char board[ROW][COL], int row, int col) {
//判断行
for ( int i = 0; i < row; i++) {
int j = 0;
if (board[i][j] == board[i][j + 1] && board[i][j + 1] == board[i][j + 2] && board[i][j]!= ' ' ) {
if (board[i][j] == '*' ) {
return board[i][j];
}
else {
return board[i][j];
}
}
}
//判断列
for ( int j = 0; j < col; j++) {
int i = 0;
if (board[i][j] == board[i+1][j] && board[i+1][j] == board[i+2][j] && board[i][j] != ' ' ) {
if (board[i][j] == '*' ) {
return board[i][j];
}
else {
return board[i][j];
}
}
}
//判断对角线
int i = 0;
int j = 0;
if (board[i][j] == board[i + 1][j + 1] && board[i + 1][j + 1] == board[i + 2][j + 2] && board[i][j] != ' ' ) {
if (board[i][i] == '*' ) {
return board[i][j];
}
else {
return board[i][j];
}
}
if (board[i][j+2] == board[i + 1][j + 1] && board[i + 1][j + 1] == board[i + 2][j] && board[i][j+2] != ' ' ) {
if (board[i][i] == '*' ) {
return board[i][j+2];
}
else {
return board[i][j+2];
}
}
//判断棋盘是否满
int count = 0;
//char a=0;
for (i = 0; i < row; i++) {
int j = 0;
for (j = 0; j < col; j++) {
if (board[i][j] == ' ' ) {
count++;
}
}
}
if (count == 0) {
return 'a' ;
}
}
|
3.game.h
讲解:这里主要给大家说一下头文件,头文件可以把各个c语言文件联系起来,可以定义一些全局变量,宏,函数声明,引用一些内部库等。一次定义多处使用,其他c文件只要引用这个头文件就赋予了它调用某些函数的权限,调用某些变量,宏的权限。头文件只是声明不占用内存空间,可以不用,但是强烈建议用,因为当一个工程的代码量很大时,没有头文件就相当于没有了头。所以是很重要的。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#define ROW 3
#define COL 3
//初始化棋盘
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);
//电脑下
void WindowPlay( char board[ROW][COL], int row, int col);
//判断输赢
char WhoWin( char board[ROW][COL], int row, int col);
|
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。
原文链接:https://blog.csdn.net/weixin_47300000/article/details/119189369