让电脑赢才是胜利?带你领略不一样的C语言三子棋代码详解,小白

这是我参与11月更文挑战的第19天,活动详情查看:2021最后一次更文挑战」 @TOC

三子棋

在这里插入图片描述

在这里插入图片描述

三子棋游戏代码详解


@TOC


前言

想必大家都玩过五子棋,今天要讲解的三子棋也是一个道理,不管是行还是列,或者是对角线,只要连成一条线就能获得游戏胜利。与平常游戏不同的是,这次的电脑下棋是完全随机的,所以想让电脑赢才是需要技术的。以下将游戏代码简称为 CHESS。


一、代码框架

CHESS主要有三个文件,分别是test.c、game.c,game.h.

game.c:主要负责写具体的游戏函数,例如,Checkwin(检测游戏输赢),Initboard(初始化棋盘),PlayerMove(玩家移动),ComputerMove(电脑移动),DisplayBoard(打印棋盘)。

test.c:主要负责代码主题部分,包含主函数,菜单界面等等。

game.h:主要负责代码头文件,包含需要的game.c的各种函数,例如

Checkwin,InitBoard等等。

二、test.c

game 函数

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
c复制代码#include"game.h"//在这里引上头文件,game.h里包含游戏代码需要的头文件,所以这里就可以一劳永逸了。
void game()
{
char ret = 0;
char board[ROW][COL];// 初始化为空格
InitBoard(board,ROW,COL);//初始化棋盘
DisplayBoard(board, ROW, COL);//打印棋盘
while (1)//一直满足循环条件
{

//玩家走
PlayerMove(board,ROW,COL);
ret = CheckWin(board,ROW,COL);
if (ret != 'c')
{
break;
}
DisplayBoard(board,ROW,COL);
//电脑走
ComputerMove(board,ROW,COL);
ret = CheckWin(board,ROW,COL);
if (ret != 'c')
{
break;
}
DisplayBoard(board, ROW, COL);
//判断输赢 1:电脑赢-'#' 2:玩家赢-'*' 3:平局-'q' 4:继续呗-'c'

}
if (ret == '*')
{
printf("玩家赢\n");
}
else if (ret == '#')
{
printf("电脑赢\n");
}
else if (ret == 'q')
printf("平局\n");
DisplayBoard(board, ROW, COL);

}

三、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
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
c复制代码#include"game.h"
void InitBoard(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++)
{
board[i][j] =' ';
}
}
}
void DisplayBoard(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)
{
for (j = 0; j < col; j++)
{
printf("---");
if (j < col - 1)
printf("|");
}
printf("\n");
}

}
}
void PlayerMove(char board[ROW][COL],int row,int col)
{
int x = 0;
int y = 0;
while (1)
{
printf("玩家走:");
scanf_s("%d %d", &x, &y);
if (x >= 1 && x <= 3 && y >= 1 && y <= 3)
{

if (board[x-1][y-1] != ' ')
{
printf("坐标被占用,重新输入\n");
}
else
{
board[x-1][y-1] = '*';
break;
}

}
else
{
printf("坐标非法,重新输入\n");
}
}
}
void ComputerMove(char board[ROW][COL], int row, int col)
{
printf("电脑走\n");

while (1)//死循环,直到坐标合法为止
{
int x = rand() % row;
int y = rand() % col;
if (board[x][y] == ' ')
{
board[x][y] = '#';
break;
}
}
}
int is_full(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;
}
char CheckWin(char board[ROW][COL], int row,int col)
{
int i = 0;
//三行
for (i = 0; i < row; i++)
{
if (board[i][0] == board[i][1] && board[i][1] == board[i][2] && board[i][0] != ' ')
{
return board[i][0];
}
}
for(i=0;i<col;i++)
//三列
if (board[0][i] == board[1][i] && board[1][i] == board[2][i] && board[0][i] != ' ')
{
return board[0][i];
}
//对角线
if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[1][1] != ' ')
{
return board[1][1];
}
if (board[0][2] ==board[1][1] && board[1][1] == board[2][0] && board[1][1] != ' ')
{
return board[1][1];
}
//平局
if (is_full(board,row,col)==1)
{
return 'q';
}
//游戏继续
//前面没有赢,也没有平局就是继续
return 'c';
}

game.h

1
2
3
4
5
6
7
8
9
10
11
12
13
14
c复制代码#define _CRT_SECURE_NO_WARNNINGS
#include<stdio.h>
#include<stdlib.h>
#include<time.h>//引头文件,是电脑产生随机数,随机下棋
#define ROW 3 //在这里定义行和列,只要包含game.h。就可以直接使用,不需要在到函数里修改,非常方便。
#define COL 3
void InitBoard(char board[ROW][COL], int row, int col);
//玩家下棋
void PlayerMove(char board[ROW][COL], int row, int col);
void DisplayBoard(char board[ROW][COL], int row, int col);
//电脑下棋
void ComputerMove(char board[ROW][COL], int row, int col);
char CheckWin(char board[ROW][COL], int row, int col);
int is_full(char board[ROW][COL], int row, int col);

游戏演示

在这里插入图片描述

总结

提示:这里对文章进行总结:
例如:以上就是今天要讲的内容,本文仅仅简单介绍了pandas的使用,而pandas提供了大量能使我们快速便捷地处理数据的函数和方法。

本文转载自: 掘金

开发者博客 – 和开发相关的 这里全都有

0%