当前位置: 首页 > news >正文

C语言:三子棋小游戏

简介:

目标很简单:实现一个 三子棋小游戏。三子棋大家都玩过,规则就不提及了。本博文中实现的三子棋在对局中,电脑落子是随机的,不具有智能性,玩家的落子位置使用键盘输入坐标。下面开始详细介绍如何实现一个简单的三子棋游戏。

步骤一:制定框架

想要实现一个小游戏,第一件事就是制定框架,那么制定框架是什么意思?怎么制定框架?

#include"chess.h"
int main()
{int n = 0;do{menu();printf("input:\n");scanf("%d", &n);switch(n){case 1:game();break;case 0:printf("exit\n");break;default:printf("input error,input again:\n");break;}} while(n);return 0;
}

这里的menu函数只是一个打印函数,定义如下:

void menu()
{printf("**************\n");printf("*** 1.play ***\n");printf("*** 0.exit ***\n");printf("**************\n");
}

将main函数写全就是制定了一个完整的框架,只要我们输入1,就会进入game函数(之后实现)进行游戏,输入0就会退出游戏,结束程序,输入其他数会让我们重新输入。整个过程就是这么简单。我们只需要实现了game的过程,整个游戏就制作完成了。

那么game函数怎么实现呢?

步骤二:实现game函数

 我们在做一个项目的时候,需要把函数的声明放在头文件里,函数的定义放在源文件里,但是具体情况可以根据个人偏好来,我个人是喜欢把主函数里会用到的函数声明放进头文件里,定义放在源文件里。如果在函数的定义中需要实现另外一个函数,就在另外一个函数的声明和定义就都放在源文件里。

要实现game函数,我们需要先将game的流程想清楚:

我们默认玩家先下棋,玩家输入一个合法坐标,然后电脑在下棋。并且每当玩家或者电脑下棋之后需要判断对局是否结束,如果结束,那么最后落子的一方胜利。另外,在玩家或者电脑下棋之后我们需要将棋盘和棋子打印出来。

void game()
{char pieces[ROW][COL] = { 0 };piecesInit(pieces, ROW, COL);board(pieces, ROW, COL);while (1){system("cls");board(pieces, ROW, COL);printf("player move!\n");playerMove(pieces, ROW, COL);system("cls");board(pieces,ROW,COL);if (judge(pieces, ROW, COL)){printf("you win\n");break;}printf("computer move!\n");computerMove(pieces, ROW, COL);Sleep(1000);system("cls");board(pieces, ROW, COL);if (judge(pieces, ROW, COL)){printf("you lose\n");break;}}
}

pieces二维数组是用来储存棋子位置信息的,玩家的棋子是星号,电脑的棋子是井号

下面对game函数中用到的函数进行解释:

piecesInit:将pieces初始化,使得每一个元素都是空格,这样初始状态就不会打印出棋子

board:传入pieces数组,将棋盘和棋子一并打印

playerMove:玩家下棋,将pieces中的一个空格元素变为星号

computerMoe:电脑下棋,将pieces中的一个空格元素变为井号

judge:返回值是int,如果对局结束了就返回1,未结束返回0

这样整个game的流程就形成了

步骤三:实现game函数中的各个函数

void board(char pieces[ROW][COL], int row, int col)
{for (int i = 0; i < row; i++){printf(" %c | %c | %c \n",pieces[i][0],pieces[i][1],pieces[i][2]);if (i < row - 1){printf("---|---|---\n");}}
}//如果不理解,可以在自己的电脑上把棋盘敲出来,就会明白board函数的原理,不敲出来不可能搞明白
void playerMove(char pieces[ROW][COL],int row,int col)
{int x = 0;int y = 0;while (1){printf("x:\n");scanf("%d", &x);printf("y:\n");scanf("%d", &y);x--;//用户输入的起始位置是1,而数组下标起始位置是0y--;if (x < 0 || x>2 || y < 0 || y>2 || pieces[x][y] != ' ')//判断是否非法printf("error,again\n");elsebreak;//正确输入,退出循环}pieces[x][y] = '*';
}
void computerMove(char pieces[ROW][COL], int row, int col)
{int x = 0;int y = 0;while (1){x = rand() % 3;//取0到2的一个数y = rand() % 3;if (x >= 0 && x <= 2 && y >= 0 && y <= 2 && pieces[x][y] == ' ')//如果位置合法{pieces[x][y] = '#';break;}}
}
int judge(char pieces[ROW][COL], int row, int col)
{//判断是否有一行三个棋子一样for (int i = 0; i < row; i++){int sum = pieces[i][0] + pieces[i][1] + pieces[i][2];if (sum == 3 * '*' || sum == 3 * '#')return 1;}//判断是否有一列三个棋子一样for (int j = 0; j < col; j++){int sum = pieces[0][j] + pieces[1][j] + pieces[2][j];if (sum == 3 * '*' || sum == 3 * '#')return 1;}//判断两个对角线是否有三个棋子一样int sum1 = pieces[0][0] + pieces[1][1] + pieces[2][2];int sum2 = pieces[0][2] + pieces[1][1] + pieces[2][0];if (sum1 == 3 * '*' || sum1 == 3 * '#' || sum2 == 3 * '*' || sum2 == 3 * '#')return 1;return 0;
}

这样就实现了一个简单的三子棋,看看效果如何:

http://www.lryc.cn/news/150596.html

相关文章:

  • JAVA - PO DTO 生成器
  • tcpdump
  • 数据通信——传输层TCP(可靠传输原理的ARQ)
  • Compose - 交互组合项
  • 【发版公告】Virbox Protector 3.1.3.19051 发版- elf 文件支持导入表保护
  • 点云数据做简单的平面的分割 三维场景中有平面,杯子,和其他物体 实现欧式聚类提取 对三维点云组成的场景进行分割
  • C++之std::search应用实例(一百八十九)
  • 一文详解 requests 库中 json 参数和 data 参数的用法
  • Django学习笔记-AcApp端授权AcWing一键登录
  • 如何在小红书进行学习直播
  • F5服务器负载均衡能力如何?一文了解
  • Ubuntu18.04安装docker-io
  • 代码随想录笔记--栈与队列篇
  • 【力扣】55. 跳跃游戏 <贪心>
  • 在iPhone 15发布之前,iPhone在智能手机出货量上占据主导地位,这对安卓来说是个坏消息
  • 题目:2620.计数器
  • 【MySQL】MySQL系统变量(system variables)列表(SHOW VARIABLES 的结果例)
  • 【多AZ】浅述云计算多az
  • Element浅尝辄止13:Collapse 折叠面板
  • 51 单片机包含头文件 BIN51.H 直接写二进制数字
  • php环境搭建步骤(与资源配套使用版)
  • java 集合处理:
  • 算法训练第五十二天
  • LeetCode——回溯篇(三)
  • Python爬取京东商品评论
  • ROS机器人编程---------(一)安装ROS
  • Maven入门教程(一):安装Maven环境
  • CSS中可继承与不可继承属性
  • Vscode画流程图
  • 【K8S系列】深入解析k8s网络插件—Cilium