C语言从0到1之《三子棋》的实现
创始人
2024-04-05 07:15:53
0

 

🕺作者@启明星使

🎃专栏:《数据库》《C语言》

🏇分享一句话:

沉香:差一点,怎么总是差一点

杨戬:一定是练功的时候总是差不多,到了关键的时候就是差一点

大家一起加油🏄‍♂️🏄‍♂️🏄‍♂️

希望得到大家的支持,如果有帮助希望得到的大家三连~~~afbae359ff6c469aa4242bd6dcb5e558.jpeg

 

前言

新手小白想学好编程,一定要注重代码实现

所以今天我将带领大家写一个小游戏《三子棋》

需要具备的知识有循环·数组·函数

是不是都学过了呢?

那么我们来动手实操检验一下成果~~~

思路

  1. 首先我们要有个菜单,选择开始或者退出

  2. 我们要有个井字格来划分区域

  3. 我们要能下棋

  4. 电脑要和我们对局

  5. 要判断是否胜利

具体实现

菜单

void memu() {printf("********************************\n");printf("************* 1->开始 **********\n");printf("************* 0->退出 **********\n");printf("********************************\n");printf("->");
}

这里我们用到printf打印一个界面

接下来就要输入1或者0来选择

是不是非常简单,我们接着往下看~

主函数

一个switch语句进行选择

int main() {memu();srand((unsigned int)time(NULL));//电脑随机下棋,后续会有解释int input;scanf("%d", &input);switch(input) {case 0:exit(0);//强制退出程序break;case 1:game();//后续接着进入游戏break;default:printf("输入错误!");break;}
​
}
 

初始化数组

我们要使用一个char型数组来存储棋子

先将数组初始化

void Init(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] = ' ';}}
}

打印界面

我们定义一个函数专门打印界面

打印用数组存储下的棋

以及分割的符号

我们定义row为行,col为列

void print(char board[ROW][COL], int row, int col) {for (int i = 0; i < row; i++) {for (int j = 0; j < col; j++) {printf(" %c ", board[i][j]);if (j

接下来我们就要开始下棋了

tip:玩家为* 电脑为#

玩家先手

这里我们要考虑几个问题:

  1. 输入的坐标并不是数组的下标

  2. 输入坐标超过数组的界限怎么办

void player_move(char board[ROW][COL], int row, int col) {while (1){printf("请输入要下棋的坐标:>");int x = 0;int y = 0;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("坐标错误\n");}}else//如果不在数组内则位置错误,重新输入{printf("坐标错误\n");}}
}

判断棋盘是否满了

在对局中我们每次下棋都要判断棋盘是否满了

如果已经满了还未分出胜负,则为平局

void is_full(char board[ROW][COL], int row, int col) {int flag = 0;for (int i = 0; i < row; i++) {for (int j = 0; j < col; j++) {if (board[i][j] == ' ') {flag++;}}}if (flag == 0) {printf("平局\n");exit(0);}
}

电脑对局

在这里我们用随机数的方式实现电脑下棋

void computer_move(char board[ROW][COL], int row, int col) {printf("AI下棋:\n");while (1) {is_full(board, ROW, COL);int x = rand() % row;int y = rand() % col;//使用rand()函数//之前我们使用srand((unsigned int)time(NULL))//就是以时间来求随机数以求更随机if (board[x][y] == ' ') {board[x][y] = '#';break;}}
}

判断胜负

三子棋的规则是什么?

三个相同的棋在同行同列或者对角线上即为胜利

char is_win(char board[ROW][COL], int row, int col) {for (int 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 (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];}is_full(board, ROW, COL);
}

这里我们返回符合条件的*或者#,在game()函数中判断返回值,即可判断胜利

game()函数

使用一个循环,如果有一方胜利或者平局则打破循环结束游戏

void game() {char board[ROW][COL];char res = 0;Init(board, ROW, COL);print(board, ROW, COL);while (1) {player_move(board, ROW, COL);print(board, ROW, COL);is_win(board, ROW, COL);Sleep(1000);computer_move(board, ROW, COL);print(board, ROW, COL);is_win(board, ROW, COL);res= is_win(board, ROW, COL);if (res == '*') {printf("玩家胜!\n");break;}else if(res=='#') {printf("AI胜!\n");break;}}
}

 

总结

在写代码的过程中,遇到问题解决问题是提升最快的方式。

当你碰到不会的,不懂的,不要害怕,这正是你所能够进步的地方!

我是分模块写的,源码如下:

fun.c

#define _CRT_SECURE_NO_WARNINGS 1
#include "sanziqi.h"
void memu() {printf("********************************\n");printf("************* 1->开始 **********\n");printf("************* 0->退出 **********\n");printf("********************************\n");printf("->");
}void game() {char board[ROW][COL];char res = 0;Init(board, ROW, COL);print(board, ROW, COL);while (1) {player_move(board, ROW, COL);print(board, ROW, COL);is_win(board, ROW, COL);Sleep(1000);computer_move(board, ROW, COL);print(board, ROW, COL);is_win(board, ROW, COL);res= is_win(board, ROW, COL);if (res == '*') {printf("玩家胜!\n");break;}else if(res=='#') {printf("AI胜!\n");break;}}
}
void Init(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 print(char board[ROW][COL], int row, int col) {for (int i = 0; i < row; i++) {for (int j = 0; j < col; j++) {printf(" %c ", board[i][j]);if (j");int x = 0;int y = 0;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("坐标错误\n");}}else{printf("坐标错误\n");}}}
void computer_move(char board[ROW][COL], int row, int col) {printf("AI下棋:\n");while (1) {is_full(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) {for (int 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 (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];}is_full(board, ROW, COL);
}
void is_full(char board[ROW][COL], int row, int col) {int flag = 0;for (int i = 0; i < row; i++) {for (int j = 0; j < col; j++) {if (board[i][j] == ' ') {flag++;}}}if (flag == 0) {printf("平局\n");exit(0);}
}

main.c

#define _CRT_SECURE_NO_WARNINGS 1
#include "sanziqi.h"
int main() {memu();srand((unsigned int)time(NULL));int input;scanf("%d", &input);switch(input) {case 0:exit(0);break;case 1:game();break;default:printf("输入错误!");break;}}

sanziqi.h

#pragma once
#include
#include
#include
#include
#define ROW 3
#define COL 3
void memu();//菜单
void game();//进入游戏
void Init(char board[ROW][COL], int row, int col);//初始化
void print(char board[ROW][COL],int row,int col);//打印界面
void player_move(char board[ROW][COL], int row, int col);//玩家下棋
void computer_move(char board[ROW][COL], int row, int col);//AI下棋
char is_win(char board[ROW][COL], int row, int col);//判断胜利
void is_full(char board[ROW][COL], int row, int col);//判断是否填满,平局

 

 

相关内容

热门资讯

喜欢穿一身黑的男生性格(喜欢穿... 今天百科达人给各位分享喜欢穿一身黑的男生性格的知识,其中也会对喜欢穿一身黑衣服的男人人好相处吗进行解...
发春是什么意思(思春和发春是什... 本篇文章极速百科给大家谈谈发春是什么意思,以及思春和发春是什么意思对应的知识点,希望对各位有所帮助,...
网络用语zl是什么意思(zl是... 今天给各位分享网络用语zl是什么意思的知识,其中也会对zl是啥意思是什么网络用语进行解释,如果能碰巧...
为什么酷狗音乐自己唱的歌不能下... 本篇文章极速百科小编给大家谈谈为什么酷狗音乐自己唱的歌不能下载到本地?,以及为什么酷狗下载的歌曲不是...
家里可以做假山养金鱼吗(假山能... 今天百科达人给各位分享家里可以做假山养金鱼吗的知识,其中也会对假山能放鱼缸里吗进行解释,如果能碰巧解...
华为下载未安装的文件去哪找(华... 今天百科达人给各位分享华为下载未安装的文件去哪找的知识,其中也会对华为下载未安装的文件去哪找到进行解...
四分五裂是什么生肖什么动物(四... 本篇文章极速百科小编给大家谈谈四分五裂是什么生肖什么动物,以及四分五裂打一生肖是什么对应的知识点,希...
怎么往应用助手里添加应用(应用... 今天百科达人给各位分享怎么往应用助手里添加应用的知识,其中也会对应用助手怎么添加微信进行解释,如果能...
客厅放八骏马摆件可以吗(家里摆... 今天给各位分享客厅放八骏马摆件可以吗的知识,其中也会对家里摆八骏马摆件好吗进行解释,如果能碰巧解决你...
苏州离哪个飞机场近(苏州离哪个... 本篇文章极速百科小编给大家谈谈苏州离哪个飞机场近,以及苏州离哪个飞机场近点对应的知识点,希望对各位有...