三子棋又叫井字棋,规则为在一个3*3的棋盘里对弈,最后三子一线则为赢。而接下来我们将用C语言来简单实现它。实现结果展示大概为这样,具体实现请看下文
博主使用的是VS2019进行编译,有对该编译器感兴趣或想要下载链接的可以私信博主
首先呢我们先创建一个工程,在此工程中创建三个文件为
game.h 为我们所创建的头文件,里面有我们所需要的所有函数声明
game.c 为我们三子棋游戏的具体实现
test.c 为我们的主函数所在,和实现
写一个代码,我们从它的主函数开始写起,那么我们这个主函数该怎么写呢;我们写一个游戏,首先是不是得有一个游戏界面,得让使用者知道要干些什么;而且得让他有的选择;其次呢万一玩家完了之后还要继续玩呢?当我们知道这些后就可开始test.c的实现了;
void menu() { printf("******** 三子棋游戏 ********\n"); printf("******** 1 . 玩游戏 *******\n"); printf("******** 2 . 退出游戏 *******\n"); printf("**规则:一次一子,三子相连为赢\n"); printf("******************************\n"); }
首先我们创建一个menu()的函数来实现菜单的打印
int main() { int input = 0; srand((unsigned int)time(NULL));//产生随机数,与rand()搭配使用,在game()中会用到 do { menu(); printf("请选择:>"); scanf("%d", &input);//进行选择 switch (input) { case 1: game();//game()的实现后续会讲到 break; case 0: printf("退出游戏\n"); break; default: printf("选择错误,重新选择!\n"); break; } getchar();//两个getchar(),是为了吃掉回车,后续会讲到具体用处 getchar(); system("cls");//清空前面输出的棋盘,使页面更加整洁(每一局结束后清理) } while (input); return 0; }
这就是我们的主函数,因为博主觉得菜单不算game()函数的具体实现,便放在了test.c里
我们来看一下博主写的test.c
#include "game.h"//我们自己创建的头文件 void menu() { printf("******** 三子棋游戏 ********\n"); printf("******** 1 . 玩游戏 *******\n"); printf("******** 2 . 退出游戏 *******\n"); printf("**规则:一次一子,三子相连为赢\n"); 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 0: printf("退出游戏\n"); break; default: printf("选择错误,重新选择!\n"); break; } getchar(); getchar(); system("cls"); } while (input); return 0; }
接下来我们来到最难的game()函数的实现了,这里我们采用二维数组来实现
首先我们得对数组初始化,其次呢我们得有个棋盘,然后呢就是下棋过程,分为玩家下棋,和电脑下棋,而每一轮下完棋后,又需要进行判断输赢情况。
那么我们就有了思路,可分为以下几个模块来写:
1.数组的初始化
2.打印棋盘
3.选手输入
4.电脑输入
5.判断输赢
在函数篇讲到函数:先声明后使用
则在头文件game.h里的函数声明如下
#pragma once #include<stdio.h> #include<time.h> #include<windows.h> #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 PlayerMove(char board[ROW][COL], int row, int col); //电脑输入 void ComputerMove(char board[ROW][COL], int row, int col); //判断输赢 char IsWin(char board[ROW][COL], int row, int col);
那接下来我们就开始game()函数的实现部分;
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] = ' '; } } }
2.打印棋盘
我们先来看一下我们所需要得棋盘长什么样子?
接下来我们看一下具体得代码实现
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("|");//因为最后一个字符不用打印'|',所一只用打印col-1次 } printf("\n"); for (j = 0; j < row; j++) { if (i < row - 1)//同理,后一行不打印 { printf("---");//产生棋盘的分割线 if (j < col - 1)//与上面相同,最后一个不用打印 printf("|"); } } printf("\n"); } }
关于每一步得思路和注释已经写在了代码里,有需要得宝子可以看一下
3.选手输入
选手输入时不但要做出提示,还得对输入的位置进行判断,此处是否能落子,实现代码如下
void PlayerMove(char board[ROW][COL], int row, int col) { printf("玩家输入\n"); printf("请输入一个坐标,中间用空格隔开>:"); int x = 0; int y = 0; while (1)//若不对可循环输入 { scanf("%d%d", &x, &y); if ((x<1 && x>row) || (x<1 && x>col)) printf("非法输入,请重新输入\n"); if (board[x - 1][y - 1] == ' ')//玩家输入的坐标都是从一开始的,而数组的下标是从0开始的, { //所以需要减一 board[x - 1][y - 1] = '*';//我们让玩家下的棋子为'*'; break;//输入正确跳出循环 } else printf("此处已被占用,请重新输入\n"); } }
测试一下,实现成功