目录
打印界面
初始化数组的值
玩家下棋
判断是否胜利
电脑下棋
今天为大家带来的是一款非常简单的小游戏“三子棋”
首先规则很简单,一行或者一列或者正负对角线都为同子就赢了,管你听没听懂,看就完了~
我们先来分析思路 然后整体来拼接思路 先将需要的模块都搞出来
打印界面
首先我们需要先来搞一个界面
那么也是灰常的简单 直接上代码 这个乜有任何难度 我们把它封装到一个函数中
void menu() {
printf("开始游戏n");
printf("***********************************n");
printf("********** 1.play **********n");
printf("********** 0.txit **********n");
printf("***********************************n");
printf("请选择>>n");
}
初始化数组的值
首先我们是要打印出一个界面
而我们用到这种矩形的都是首先考虑使用二维数组,所以我们要先来定义一个二位数组并将二维数组初始化 ,而这个网格我们可以分为几部分来查看
首先我们将红色区域块分开考虑
void display_board(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");
for (j = 0; j < col; j++) {
printf("---");
if (j < col - 1) {
printf("|");
}
}
printf("n");
}
}
可以得到我们的效果 但是数组没有进行初始化是比较丑的
所以我们要将数组中全部初始化为空格
void init_board(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] = ' ';
}
}
}
那么再打印的话就可以得到我们的方格啦
玩家下棋
然后我们来制作模拟玩家下棋 首先我们可以考虑到 玩家对应输入的下标应为1-3区间 ,所以我们第一步是要判断一下玩家输入的值是否合法 并且也要考虑到 玩家下棋的地方 是否已经存在棋子
而且我们使用数组中下标对应是从0开始的 所以我们要将其做一下处理
void player_move(char board[ROW][COL], int row, int col) {
int x = 0;
int y = 0;
while (1) {
scanf("%d %d", &x, &y);
getchar();
if ((x >= 1 && x <= 3 && y >= 1 && y <= 3)&& board[x - 1][y - 1]==' ') {
board[x - 1][y - 1] = '*';
break;
}
else {
printf("输入错误 请重新输入n");
continue;
}
}
}
判断是否胜利
然后我们需要考虑到 每一次下棋之后是需要判断是否已经胜利 所以我们来构造一个判断胜利的函数
char is_win(char board[ROW][COL], int row, int col) {
int i = 0;
int t = 1;
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];
}
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[i][0];
}
if (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[0][2] != ' ') {
return board[i][2];
}
for (i = 0; i < row; i++) {
int j = 0;
for (j = 0; j < col; j++) {
if (board[i][j] == ' ') {
t = 0;
}
}
}
if (t) {
return 'p';
}
return 'c';
}
电脑下棋
然后我们来考虑一下电脑下棋,首先我们需要先构造一个笨笨的电脑,然后再给他注入一些智商 ,首先我们来构造一下随机数
srand((unsigned int)time(NULL));
void computer_move(char board[ROW][COL], int row, int col) {
printf("电脑下棋n");
while (!(computer_ai(board, row, col))) {
int x = rand() % row;
int y = rand() % col;
if (board[x][y] == ' ') {
board[x][y] = '#';
break;
}
}
}
有细心的同学已经发现其中调用了computer_ai函数啦,那么这个就是机器人的智商啦
我们来构造一下
char computer_ai(char board[ROW][COL], int row, int col)
{
int i = 0;
int j = 0;
int k = 0;
while (0 == k)
{
for (i = 0; i < row; i++)
{
if (board[i][0] == board[i][1] && board[i][1] == '*' && board[i][2] == ' ')
{
board[i][2] = '#';
k = 1;
break;
}
if (board[i][0] == board[i][2] && board[i][0] == '*' && board[i][1] == ' ')
{
board[i][1] = '#';
k = 1;
break;
}
if (board[i][1] == board[i][2] && board[i][1] == '*' && board[i][0] == ' ')
{
board[i][0] = '#';
k = 1;
break;
}
}
if (k != 0)
break;
for (j = 0; j < col; j++)
{
if (board[0][j] == board[1][j] && board[1][j] == '*' && board[2][j] == ' ')
{
board[2][j] = '#';
k = 1;
break;
}
if (board[0][j] == board[2][j] && board[2][j] == '*' && board[1][j] == ' ')
{
board[1][j] = '#';
k = 1;
break;
}
if (board[1][j] == board[2][j] && board[2][j] == '*' && board[0][j] == ' ')
{
board[0][j] = '#';
k = 1;
break;
}
}
break;
}
if (board[0][0] == board[1][1] && board[1][1] == '*' && board[2][2] == ' ')
{
board[2][2] = '#';
return 1;
}
if (board[0][0] == board[2][2] && board[2][2] == '*' && board[1][1] == ' ')
{
board[1][1] = '#';
return 1;
}
if (board[1][1] == board[2][2] && board[1][1] == '*' && board[0][0] == ' ')
{
board[0][0] = '#';
return 1;
}
if (board[0][2] == board[1][1] && board[0][2] == '*' && board[2][0] == ' ')
{
board[2][0] = '#';
return 1;
}
if (board[0][2] == board[2][0] && board[2][0] == '*' && board[1][1] == ' ')
{
board[1][1] = '#';
return 1;
}
if (board[1][1] == board[2][0] && board[2][0] == '*' && board[0][2] == ' ')
{
board[0][2] = '#';
return 1;
}
return k;
}
那么以上就是我们所需要的所有函数 我们直接附上完整代码
#define _CRT_SECURE_NO_WARNINGS 1 #include#include #include #define ROW 3 #define COL 3 //打印界面 void menu(); //初始化数组的值 void init_board(char board[ROW][COL],int row,int col); //打印数组的值 void display_board(char board[ROW][COL], int row, int col); //玩家下棋 void player_move(char board[ROW][COL], int row, int col); //判断是否胜利 如果玩家胜利返回* 如果电脑胜利返回# 如果继续返回c 如果平局返回p char is_win(char board[ROW][COL], int row, int col); //电脑下棋 void computer_move(char board[ROW][COL], int row, int col); //电脑ai优化 char computer_ai(char board[ROW][COL], int row, int col); #define _CRT_SECURE_NO_WARNINGS 1 #include"game.h" void menu() { printf("开始游戏n"); printf("***********************************n"); printf("********** 1.play **********n"); printf("********** 0.txit **********n"); printf("***********************************n"); printf("请选择>>n"); } void init_board(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 display_board(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"); for (j = 0; j < col; j++) { printf("---"); if (j < col - 1) { printf("|"); } } printf("n"); } } void player_move(char board[ROW][COL], int row, int col) { int x = 0; int y = 0; while (1) { scanf("%d %d", &x, &y); getchar(); if ((x >= 1 && x <= 3 && y >= 1 && y <= 3)&& board[x - 1][y - 1]==' ') { board[x - 1][y - 1] = '*'; break; } else { printf("输入错误 请重新输入n"); continue; } } } void computer_move(char board[ROW][COL], int row, int col) { printf("电脑下棋n"); while (!(computer_ai(board, row, col))) { int x = rand() % row; int y = rand() % col; if (board[x][y] == ' ') { board[x][y] = '#'; break; } } } char is_win(char board[ROW][COL], int row, int col) { int i = 0; int t = 1; 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]; } 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[i][0]; } if (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[0][2] != ' ') { return board[i][2]; } for (i = 0; i < row; i++) { int j = 0; for (j = 0; j < col; j++) { if (board[i][j] == ' ') { t = 0; } } } if (t) { return 'p'; } return 'c'; } char computer_ai(char board[ROW][COL], int row, int col) { int i = 0; int j = 0; int k = 0; while (0 == k) { for (i = 0; i < row; i++) { if (board[i][0] == board[i][1] && board[i][1] == '*' && board[i][2] == ' ') { board[i][2] = '#'; k = 1; break; } if (board[i][0] == board[i][2] && board[i][0] == '*' && board[i][1] == ' ') { board[i][1] = '#'; k = 1; break; } if (board[i][1] == board[i][2] && board[i][1] == '*' && board[i][0] == ' ') { board[i][0] = '#'; k = 1; break; } } if (k != 0) break; for (j = 0; j < col; j++) { if (board[0][j] == board[1][j] && board[1][j] == '*' && board[2][j] == ' ') { board[2][j] = '#'; k = 1; break; } if (board[0][j] == board[2][j] && board[2][j] == '*' && board[1][j] == ' ') { board[1][j] = '#'; k = 1; break; } if (board[1][j] == board[2][j] && board[2][j] == '*' && board[0][j] == ' ') { board[0][j] = '#'; k = 1; break; } } break; } if (board[0][0] == board[1][1] && board[1][1] == '*' && board[2][2] == ' ') { board[2][2] = '#'; return 1; } if (board[0][0] == board[2][2] && board[2][2] == '*' && board[1][1] == ' ') { board[1][1] = '#'; return 1; } if (board[1][1] == board[2][2] && board[1][1] == '*' && board[0][0] == ' ') { board[0][0] = '#'; return 1; } if (board[0][2] == board[1][1] && board[0][2] == '*' && board[2][0] == ' ') { board[2][0] = '#'; return 1; } if (board[0][2] == board[2][0] && board[2][0] == '*' && board[1][1] == ' ') { board[1][1] = '#'; return 1; } if (board[1][1] == board[2][0] && board[2][0] == '*' && board[0][2] == ' ') { board[0][2] = '#'; return 1; } return k; } #define _CRT_SECURE_NO_WARNINGS 1 //三子棋游戏 #include #include"game.h" void game() { char ret = 'c'; char board[ROW][COL] = { 0 }; init_board(board,ROW,COL);//初始化数组 display_board(board, ROW, COL);//打印数组 //玩家下棋 while (1) { printf("请输入你要下棋的坐标 示例:1 1(中间间隔空格)n"); player_move(board, ROW, COL); display_board(board, ROW, COL); ret = is_win(board, ROW, COL); if (ret != 'c') { break; } computer_move(board, ROW, COL); display_board(board, ROW, COL); ret = is_win(board, ROW, COL); if (ret != 'c') { break; } } switch (ret) { case '*':printf("恭喜玩家获得胜利,奖励一个摸摸哒n"); break; case '#':printf("很遗憾 电脑获得胜利n"); break; case 'p':printf("本次游戏平局n"); break; } } int main() { srand((unsigned int)time(NULL)); int input = 0; do { menu(); scanf("%d", &input); getchar(); switch (input) { case 0: printf("退出游戏n");//如果为0 则退出游戏 break; case 1: game();//如果为1 则开始游戏 break; default: printf("输入错误,请重新输入n"); break; } } while ((int)input); return 0; }
那么我们就可以完成一个简单的三子棋啦 下面我们看下效果图把
赢不了呢当然不是我菜(我可不会承认) 因为我们给机器人加入了智商,所以最高就是可以玩到平局啦 看看有没有小伙伴能赢了我这个机器人的



