当前位置:网站首页>《c语言小游戏》入门级三子棋游戏(机器人加强版)
《c语言小游戏》入门级三子棋游戏(机器人加强版)
2022-07-31 06:42:00 【郭郭学习之旅】
目录
今天为大家带来的是一款非常简单的小游戏“三子棋”
首先规则很简单,一行或者一列或者正负对角线都为同子就赢了,管你听没听懂,看就完了~
我们先来分析思路 然后整体来拼接思路 先将需要的模块都搞出来
打印界面
首先我们需要先来搞一个界面
那么也是灰常的简单 直接上代码 这个乜有任何难度 我们把它封装到一个函数中
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<stdio.h>
#include<stdlib.h>
#include<time.h>
#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<stdio.h>
#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;
}
那么我们就可以完成一个简单的三子棋啦 下面我们看下效果图把
赢不了呢当然不是我菜(我可不会承认) 因为我们给机器人加入了智商,所以最高就是可以玩到平局啦 看看有没有小伙伴能赢了我这个机器人的
边栏推荐
猜你喜欢
【科普向】5G核心网架构和关键技术
文件 - 04 下载文件: 根据文件下载链接下载文件
[Interview: Concurrency 38: Multithreading: Thread Pool] Basic concepts of the ThreadPoolExecutor class
Super detailed mysql database installation guide
Machine Learning - Notes and Implementation of Linear Regression, Logistic Regression Problems
Log4net 思维导图
SCI写作指南
MySQL installation to the last step in the write the configuration file failed?And after the installation steps
Titanic 预测问题
2022.07.18 _ a day
随机推荐
Postgresql source code learning (33) - transaction log ⑨ - see the overall process of log writing from the insert record
毫米波技术基础
Foreign trade website optimization - foreign trade website optimization tutorial - foreign trade website optimization software
进程调度的基本过程
《白帽子说Web安全》思维导图
链表实现及任务调度
多进程全局变量失效、变量共享问题
【微服务】 微服务学习笔记二:Eureka注册中心的介绍及搭建
LeetCode:952. 按公因数计算最大组件大小【欧拉筛 + 并查集】
MySQL table creation statement_Three commonly used MySQL table creation statements
2022.07.18 _ a day
2022.07.18_每日一题
2022.07.24_Daily Question
2022.07.26_Daily Question
熟悉而陌生的新朋友——IAsyncDisposable
bcos简介及自序
ros小乌龟画图
opencv、pil和from torchvision.transforms的Resize, Compose, ToTensor, Normalize等差别
MySQL安装到最后一步 write configuration file 失败 怎么办?及后安装步骤
【微服务】Nacos集群搭建以及加载文件配置