今天我们用C语言来实现三子棋
目录
2.1 创建游戏初始界面(进入\退出)
2.2创建一个名为board的二维数组并初始化
4.实现页面
前言
三子棋是一款经典小游戏,用C语言实现它也是一个很奇妙的过程,下面就开始详细讲解具体步骤.
1.配置运行环境
main函数在test.c文件中,游戏实现的函数在test.c中被引用,而函数的定义主要是在game.c文件中完成。game.h文件中包含了程序所需的各种头文件并且包换对实现游戏功能的各种函数的声明。
三子棋的实现需要多个模块的功能相互串联,多个文件可以分别处理各自模块的功能,能更好处理各个模块之间的逻辑并且便于后期调试,也使得代码的可读性提高。
2.实现各种功能并处理逻辑关系
2.1实现游戏的初始界面
int main() { test(); return 0; }
打印主菜单
void menu()
{
printf("********************\n");
printf("***** 1.play *****\n");
printf("********************\n");
printf("***** 2.exit *****\n");
printf("********************\n");
}
玩家选择是否(1\0)是否进入游戏
int main() { int input = 0; srand((unsigned int)time(NULL)); do { menu(); printf("请输入:"); scanf("%d", &input); switch (input) { case 1: game(); break; case 2: printf("退出游戏\n"); break; default: printf("请输入正确的数字"); } } while (input); return 0; }
2.2创建一个名为board的二维数组并进行初始化
数组类型为char
char board[ ][ ] = { 0 };
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] = ' '; } }
2.3 搭建棋盘
在game.c文件中实现棋盘的搭建功能
void DisplayBoard(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++) { 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"); } } } }
然后在test.c文件中调用此函数
InitBoard(board, ROW,COL);
2.4 玩家下棋,打印新的棋盘
在game文件中实现对棋盘上空位的判断,防止一个位置多次下棋,并且显示出空位给玩家下棋,之后打印出新的棋盘
void PlayerMove(char board[ROW][COL], int row, int col) { int x = 0, y = 0; printf("玩家下棋:\n"); 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]= '*' ; break; } else { printf("已下,请重新输入:"); } } else { printf("非法输入,请重新输入:"); } } }
对对应函数进行调用
PlayerMove(board, ROW, COL); DisplayBoard(board, ROW, COL);
2.5 电脑下棋并打印新的棋盘
玩家选择一个位置打印后,电脑通过rand()函数产生一个在限定范围内的的随机值,并产生一个随机坐标并在相应坐标打印一个字符(电脑下棋过程),滞后打印新的棋盘。
void ComputerMove(char board[ROW][COL] ,int row, int col) { int x = 0; int y = 0; printf("电脑下棋:>\n"); while (1) { x = rand() % row; y = rand() % col; if (board[x][y] == ' ') { board[x][y] = '#'; break; } } }
2.6 判断最终的结果
在多次进行 玩家—>电脑—>玩家......的循环之后,产生最终的结果,这时候对结果进行分析,相同的3个字符相连(行 列 对角线)即为胜利,如果棋盘已满也为产生胜利者即为平局。
根据IsWin函数最终棋盘上的结果返回一个字符赋给ret并打印最后的结果
玩家赢:*
电脑萤:#
平局:Q
继续:C
char IsWin(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[0][0] != ' ') return board[1][1]; if (board[2][0] == board[1][1]&& board[1][1] == board[0][2] && board[0][2] != ' ') return board[1][1]; if (IsFull(board,row,col)==1) { return 'Q'; } return 'C'; }
if (ret == '*') { printf("玩家赢\n"); } else if (ret == '#') { printf("电脑赢\n"); } else printf("平局\n"); }
上面代码第一段判断棋盘是否满了,把结果返回给第二段代码中的函数,第二段代码中的函数判断最后的结果(玩家赢 \ 电脑赢 \ 平局)并把相应的字符返回到 test.c文件中判断并打印最后结果的函数中去。
#define _CRT_SECURE_NO_WARNINGS 1 #include "game.h" void menu() { printf("********************\n"); printf("***** 1.play *****\n"); printf("********************\n"); printf("***** 2.exit *****\n"); printf("********************\n"); } void game() { char board[ROW][COL] = { 0 }; InitBoard(board, ROW, COL); DisplayBoard(board, ROW, COL); char ret = 0; while (1) { PlayerMove(board, ROW, COL); DisplayBoard(board, ROW, COL); ret=IsWin(board,ROW,COL); if (ret != 'C') break; ComputerMove(board, ROW, COL); DisplayBoard(board, ROW, COL); ret = IsWin(board, ROW, COL); if (ret != 'C') break; } if (ret == '*') { printf("玩家赢\n"); } else if (ret == '#') { printf("电脑赢\n"); } else printf("平局\n"); } int main() { int input = 0; srand((unsigned int)time(NULL)); do { menu(); printf("请输入:"); scanf("%d", &input); switch (input) { case 1: game(); break; case 2: printf("退出游戏\n"); break; default: printf("请输入正确的数字"); } } while (input); return 0; }
3.2 创建存放头文件的文件game.h
存放各种定义函数
#pragma once #include<stdio.h> #include<stdlib.h> #include<time.h> #define ROW 3 #define COL 3 void InitBoard(char, int, int); void DisplayBoard(char, int, int); void PlayerMove(char, int, int); void ComputerMove(char, int, int); char IsWin(char, int, int);
3.3 创建游戏的实现文件game.c
存放定义函数的实现代码
#define _CRT_SECURE_NO_WARNINGS 1 #include "game.h" int IsFull(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++) { if (board[i][j] == ' ') { return 0; } } } return 1; } 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 DisplayBoard(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++) { 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, y = 0; printf("玩家下棋:\n"); 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]= '*' ; break; } else { printf("已下,请重新输入:"); } } else { printf("非法输入,请重新输入:"); } } } void ComputerMove(char board[ROW][COL] ,int row, int col) { int x = 0; int y = 0; printf("电脑下棋:>\n"); while (1) { x = rand() % row; y = rand() % col; if (board[x][y] == ' ') { board[x][y] = '#'; break; } } } char IsWin(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[0][0] != ' ') return board[1][1]; if (board[2][0] == board[1][1]&& board[1][1] == board[0][2] && board[0][2] != ' ') return board[1][1]; if (IsFull(board,row,col)==1) { return 'Q'; } return 'C'; }
4.实现页面
这就是三子棋的实现过程,欢迎大家改进和交流!