- 一、三子棋
- 二、步骤
- 1.创建初始界面
- 2.创建棋盘并初始化
- 3.打印棋盘
- 4.玩家下棋
- 5.电脑下棋
- 6.判断胜负
- 7、代码实现
- 试玩一局
一、三子棋
三子棋是一款经典小游戏,用C语言实现它也是一个很奇妙的过程,下面就开始详细讲解具体步骤.。
- 创建初始界面
- 创建棋盘并初始化
- 打印棋盘
- 玩家下棋
- 电脑下棋
- 判断输赢
我们需要有三个文件如下:
- test.c —— 测试游戏
- game.h —— 游戏函数的声明
- game.c —— 游戏函数的实现
’
二、步骤 1.创建初始界面开始界面输入1进入游戏,而输入则退出游戏
代码如下(示例):
void initprint() {
printf("--------------------------n");
printf(" n");
printf(" 1.start n");
printf(" 0.exit n");
printf(" n");
printf("--------------------------n");
printf("n");
printf("n");
}
那么我们该如何实现这操作呢?
我们应该在主函数里面实现,通过do……while和switch简单实现。
int main() {
int input=0;
do {
initprint();//调用初始化界面
printf("请选择:> ");
scanf("%d", &input);//输入数据
switch (input)
{
case 1:
game();//进入游戏
break;
case 0:
printf("退出n");
break;
default:
printf("选择错误,重新选择n");
**加粗样式** break;
}
} while (input);
}
2.创建棋盘并初始化
三子棋想必大家都听过,棋盘为3x3的格子,那么我们就用一个char board【3】【3】的二维数组来实现。
代码如下(示例):
char board[ROW][COL] = { 0 };
这里我采用宏定义:
#define ROW 3 #define COL 3
使用宏定义的原因:
1.推高代码可读性,后续代码中遇到3,方便理解含义。
2.提高扩展性,如果将来要修改棋盘尺寸,代码修改会很方便。
如果在打印棋盘前未对数组进行初始化就会打印空字符(null),这就会对棋盘的美观程度造成影响。
所以我们在打印棋盘前首先要对数组进行初始化,在数组存入一个字符。存什么才不会影响呢,只有把空格存进去才行。
代码如下(示例):
void initboard(char board[ROW][COL], int row, int col) {
for (int i = 0; i < row; i++) {
for (int j = 0; j < col; j++)
board[i][j] = ' ';
}
}
3.打印棋盘
在完成棋盘的初始化操作后,我们需要将初始化后的棋盘展现出来,以便玩家知道棋盘上的棋子落点。
代码如下(示例):
void displayboard(char board[ROW][COL], int row, int col) {
printf("+---+---+---+n");
for (int i = 0; i < row; i++) {
printf("| %c | %c | %c |n", board[i][0], board[i][1], board[i][2]);
printf("+---+---+---+n");
}
4.玩家下棋
玩家下棋需要注意几点:
1.玩家不知道数组下标从零开始,所以要实现坐标减一操作
2.要判断数组是否有越界
3.要判段是否有坐标已被占用
代码如下(示例):
void player_move(char board[ROW][COL], int row, int col) {
int x=0, y=0;
while (1) {
printf("玩家下棋,请输入你想要下的坐标:>");
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] = 'O';
break;
}
else {
printf("输入坐标有误,该坐标已被占用n");
}
}
else
printf("输入坐标有误n");
}
}
5.电脑下棋
由于水平有限,电脑下棋是通过随机数来实现的。
srand((unsigned int)time(NULL));//随机种子,放在主函数里就行了
代码如下(示例):
void ai_move(char board[ROW][COL], int row, int col) {
while (1) {
int x = rand() % row;//%3-> 0~2的数字
int y = rand() % col;
if (board[x ][y ]==' ') {
board[x ][y ] = 'X';//电脑实现下棋
break;
}
}
}
6.判断胜负
1.判定玩家胜利
(1)一行中有三个棋子
(2)一列中有三个棋子
(3)对角线有三个棋子
2.判断是否平局
(1)‘x’ 表示玩家获胜
(2)‘o’ 表示电脑获胜
(3)’ C’ 表示胜负未分
(4) ‘Q’ 表示和棋
这个用static修饰,代表不可修改
static int is_full(char board[ROW][COL], int row, int col) {
for (int i = 0; i < row; i++) {
for (int j = 0; j < col; j++)
if (board[i][j]==' ') {
return 0;
}
}
return 1;
}
char is_win(char board[ROW][COL], int row, int col) {
for (int i = 0; i < row; i++) {
if (board[i][1] == board[i][2] && board[i][0] == board[i][1] && board[i][0] != ' ') //判定所有的行
{
return board[i][0];
}
}
for (int 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';
}
else return'C';
}
7、代码实现
//game.h头文件 #pragma once #include试玩一局#include #include #include #include #define ROW 3 #define COL 3 void initboard(char board[ROW][COL], int row, int col);//初始化棋盘 void displayboard(char board[ROW][COL], int row, int col);//打印棋盘 void player_move(char board[ROW][COL], int row, int col);//玩家下棋 void ai_move(char board[ROW][COL], int row, int col);//电脑下棋 char is_win(char board[ROW][COL], int row, int col);//判断输赢 //game.c #define _CRT_SECURE_NO_WARNINGS 1 #include"game.h" void initboard(char board[ROW][COL], int row, int col) { for (int i = 0; i < row; i++) { for (int j = 0; j < col; j++) board[i][j] = ' '; } } void displayboard(char board[ROW][COL], int row, int col) { printf("+---+---+---+n"); for (int i = 0; i < row; i++) { printf("| %c | %c | %c |n", board[i][0], board[i][1], board[i][2]); printf("+---+---+---+n"); } } void player_move(char board[ROW][COL], int row, int col) { int x=0, y=0; while (1) { printf("玩家下棋,请输入你想要下的坐标:>"); 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] = 'O'; break; } else { printf("输入坐标有误,该坐标已被占用n"); } } else printf("输入坐标有误n"); } } void ai_move(char board[ROW][COL], int row, int col) { while (1) { int x = rand() % row; int y = rand() % col; if (board[x ][y ]==' ') { board[x ][y ] = 'X'; break; } } } static int is_full(char board[ROW][COL], int row, int col) { for (int i = 0; i < row; i++) { for (int j = 0; j < col; j++) if (board[i][j]==' ') { return 0; } } return 1; } char is_win(char board[ROW][COL], int row, int col) { for (int i = 0; i < row; i++) { if (board[i][1] == board[i][2] && board[i][0] == board[i][1] && board[i][0] != ' ') { return board[i][0]; } } for (int 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'; } else return'C'; } //test.c #define _CRT_SECURE_NO_WARNINGS 1 #include"game.h" #include void initprint() { printf("--------------------------n"); printf(" n"); printf(" 1.start n"); printf(" 0.exit n"); printf(" n"); printf("--------------------------n"); printf("n"); printf("n"); } void game() { int ret; char board[ROW][COL] = { 0 }; initboard(board,ROW, COL); displayboard(board, ROW, COL); while (1) { player_move(board, ROW, COL); ret = is_win(board, ROW, COL); if (ret != 'C')break; Sleep(100); system("cls");//清空屏幕 ai_move(board, ROW, COL); displayboard(board, ROW, COL); ret = is_win(board, ROW, COL); if (ret != 'C')break; } Sleep(500); system("cls"); if (ret == 'O') { printf("玩家赢n"); } else if (ret == 'X') { printf("电脑赢n"); } else if (ret == 'Q') { printf("平局n"); } displayboard(board, ROW, COL); } int main() { int input=0; srand((unsigned int)time(NULL)); do { initprint(); printf("请选择:> "); scanf("%d", &input); switch (input) { case 1: game(); break; case 0: printf("退出n"); break; default: printf("选择错误,重新选择n"); break; } } while (input); } //



