三子棋小程序

一.自定义头文件(game.h)

放入源文件需要用到的标准库头文件函数的声明

ROW 和COL为棋盘的行和列,三子棋嘛,肯定为3啦

#pragma once
#include<stdio.h>
#include<String.h>
#include<stdlib.h>
#include<time.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 ComputerBoard(char board[ROW][COL], int row, int col);
char IsWin(char board[ROW][COL], int row, int col);

二.源文件(test.c和game.c)

1.test.c

#define _CRT_SECURE_NO_WARNINGS 1
#include "game.h"void menu() {printf("***********************************\n");printf("************1.开始游戏*************\n");printf("************0.退出游戏*************\n");printf("***********************************\n");
}
void game() {char board[ROW][COL] = {0};InitBoard(board,ROW,COL);//初始化棋盘DisplayBoard(board, ROW, COL);//显示棋盘while (1) {PlayerMove(board, ROW, COL);//玩家输入坐标DisplayBoard(board, ROW, COL);//然后显示一边棋盘当前的情况if (IsWin(board, ROW, COL) != 'C') {//满了或者有一方赢了就breakbreak;}ComputerBoard(board, ROW, COL);//人机输入坐标DisplayBoard(board, ROW, COL);//再显示一边棋盘当前的情况if (IsWin(board, ROW, COL) != 'C') {//人机输入坐标后再判断一下满没满或者双方有没有赢的,满足就breakbreak;}}if (IsWin(board, ROW, COL) == '*') {printf("玩家赢\n");}else if (IsWin(board, ROW, COL) == '#') {printf("电脑玩家赢\n");}else if (IsWin(board, ROW, COL) == 'D') {printf("平局\n");}}
int main() {int input=0;srand((unsigned int)time(NULL));do {menu();printf("请输入:");scanf("%d", &input);switch(input){case 1:printf("进入游戏\n");game();break;case 0:printf("退出游戏\n");break;default:printf("输入错误,请重新输入:\n");}} while (input);return 0;
}

(1)void game()解释

1.先创建一个游戏面板二维数组

字符型的

char board[ROW][COL] = {0};
2.初始化棋盘
InitBoard(board,ROW,COL);
3.显示棋盘

在真正开始游戏之前肯定得先给玩家看一下棋盘滴啦

DisplayBoard(board, ROW, COL);//显示棋盘
4.while()循环

在玩家输入坐标之后

判断一下棋盘是否满了或者有一方赢了就break

同理,人机输入坐标后也是如此

(每次执行IsWin都会返回一个字符)

while (1) {PlayerMove(board, ROW, COL);//玩家输入坐标DisplayBoard(board, ROW, COL);//然后显示一边棋盘当前的情况if (IsWin(board, ROW, COL) != 'C') {break;}ComputerBoard(board, ROW, COL);//人机输入坐标DisplayBoard(board, ROW, COL);//再显示一边棋盘当前的情况if (IsWin(board, ROW, COL) != 'C') {break;}
}

注意:符号' C '说明没满并且没有一方赢

5.判赢

在while()循环出来后,肯定是有一方赢了或者满了

如果返回的符号为‘ * ’则玩家赢

如果返回的符号为‘ # ’则人机(电脑玩家)赢

如果返回的符号为‘ D ’则平局

具体可以看一下下文的IsWin函数具体实现,有注解

if (IsWin(board, ROW, COL) == '*') {printf("玩家赢\n");}
else if (IsWin(board, ROW, COL) == '#') {printf("电脑玩家赢\n");}
else if (IsWin(board, ROW, COL) == 'D') {printf("平局\n");}

2.game.c

(1)初始化棋盘(InitBoard)

void InitBoard(char board[ROW][COL], int row, int col) {//InitBoard(board,ROW,COL);//初始化棋盘for (int i = 0; i < row; i++) {for (int j = 0; j < col; j++) {board[i][j] = ' ';}}/*或者直接写这一行代码也可以memset(&board[0][0], ' ', row * col * sizeof(board[0][0]));*/
}

(2)显示棋盘(DisplayBoard)

void DisplayBoard(char board[ROW][COL], int row, int col) {//DisplayBoard(board, ROW, COL);//显示棋盘for (int i = 0; i < row; i++) {if (i < 2) {printf(" %c | %c | %c \n", board[i][0], board[i][1], board[i][2]);printf("---|---|---\n");}else {printf(" %c | %c | %c \n", board[i][0], board[i][1], board[i][2]);}}}

效果如图:

(3)玩家输入坐标(PlayerMove)

玩家的棋子是' * '号

void PlayerMove(char board[ROW][COL], int row, int col) {//PlayerMove(board, ROW, COL);//玩家输入坐标int x, y;printf("玩家下棋:>\n");printf("请输入棋子的坐标:");scanf("%d %d", &x, &y);while (1) {if (x <= 0 && x >= 4 && y <= 0 && y >= 4) {printf("坐标非法,请重新输入\n");}else if (board[x - 1][y - 1] == ' ') {board[x - 1][y - 1] = '*';break;}else {printf("坐标已经被占用,请重新输入坐标\n");break;}}
}

效果如图:

(4)人机下棋(ComputerBoard)

人机的棋子是' # '号

void ComputerBoard(char board[ROW][COL], int row, int col) {//ComputerBoard(board, ROW, COL);//人机输入坐标//DisplayBoard(board, ROW, COL);//然后显示一边棋盘当前的情况printf("电脑下棋:>\n");int x, y;while (1) {x = rand() % row;//模上一个3之后得到的数的范围肯定为0~2y = rand() % col;if (board[x][y] == ' ') {board[x][y] = '#';break;}}
}

效果如图:

可以看到我们在输入坐标后紧跟着人机也输入了坐标

(5)判定双方是否赢了(IsWin)

char IsWin(char board[ROW][COL], int row, int col) {//IsWin(board, ROW, COL) 判定双方是否赢了//判断行是否相等(注意不为空),相等的话就返回其对应的棋子,再下定论谁赢了for (int i = 0; i < row; i++) {if (board[i][0] == board[i][1] && board[i][1] == board[i][2]&&board[i][2]!=' ') {return board[i][0];//返回}}//判断列是否相等(注意不为空),相等的话就返回其对应的棋子,再下定论谁赢了for (int j = 0; j < col; j++) {if (board[0][j] == board[1][j] && board[1][j] == board[2][j] && board[2][j] != ' ') {return board[0][j];//返回}}//判断两对角线是否相等(注意不为空),相等的话就返回其对应的棋子,再下定论谁赢了if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[2][2] != ' ') {return board[0][0];//返回}if (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[2][0] != ' ') {return board[0][2];//返回}//判断是否满了,返回不同的字符执行不同的效果if (IsFull(board, ROW, COL)) {return 'D';//返回}else {return 'C';//返回}
}

大致效果:

(6)判满(对应(5)中的函数IsFull())

注意该函数写在IsWin()函数的上边,否则加上声明

int IsFull(char board[ROW][COL], int row, int col) {//IsFull(board, ROW, COL)判满for (int i = 0; i < row; i++) {for (int j = 0; j < col; j++) {if (board[i][j] == ' ') {return 0;//返回0说明没满,if(0)相当于false}}}return 1;//相当于true
}

一键三连哦,感谢大家的阅读!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/51372.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

《Java初阶数据结构》----10.<Map和Set---TreeSet和TreeMapHashSet和HashMap >

前言&#xff1a; 大家好&#xff0c;我目前在学习java。我准备利用这个暑假&#xff0c;来复习之前学过的内容&#xff0c;并整理好之前写过的博客进行发布。如果博客中有错误或者没有读懂的地方。热烈欢迎大家在评论区进行讨论&#xff01;&#xff01;&#xff01; 喜欢我文…

C/C++大雪纷飞代码

目录 写在前面 C语言简介 EasyX简介 大雪纷飞 运行结果 写在后面 写在前面 本期博主给大家带来了C/C实现的大雪纷飞代码&#xff0c;一起来看看吧&#xff01; 系列推荐 序号目录直达链接1爱心代码https://want595.blog.csdn.net/article/details/1363606842李峋同款跳…

【LeetCode】141.环形链表、142. 环形链表 II(算法 + 图解)

Hi~&#xff01;这里是奋斗的明志&#xff0c;很荣幸您能阅读我的文章&#xff0c;诚请评论指点&#xff0c;欢迎欢迎 ~~ &#x1f331;&#x1f331;个人主页&#xff1a;奋斗的明志 &#x1f331;&#x1f331;所属专栏&#xff1a;数据结构 &#x1f4da;本系列文章为个人学…

AI学习记录 - 本地知识库实现的相关知识

在公司内部实现了个知识库&#xff0c;但这里只介绍在实现知识库的过程中用到的知识。 1、分词器 先分词&#xff0c;中文可以使用jieba分词 2、构造数据集 将词汇向量化是自然语言处理中的重要任务&#xff0c;它可以将文本数据转化为计算机能够理解和处理的向量形式。以…

在react中如何计算本地存储体积

1.定义useLocalStorageSize钩子函数 // 计算localStorage大小 function useLocalStorageSize() {const [size, setSize] useState(0);useEffect(() > {const calculateSize () > {let totalSize 0;for (let key in localStorage) {//过滤掉继承自原型链的属性if (loc…

抄作业-跟着《React通关秘籍》捣鼓React-playground-上集

文章目录 前言1. 搭建react 开发环境2、react hooks 知识3. 目标&#xff1a;跟着小册实现 react-playground3.1 整体布局初始化项目使用Alloment 来实现左右分屏的拖拉功能 3.2 代码编辑器Monaco Editor 3.3 实现了多文件的切换用 useContext 来共享数据。优化 tab的样式&…

扫雷游戏小程序

目录 一.文件 1.头文件 2.源文件 二.游戏界面和执行(test.c) 三.函数实现(void game部分,源文件game.c) 1.定义雷二维数组和展示二维数组 2.初始化地雷数组 3.初始化显示的数组 4.显示当前的情况 5.随机放置地雷 6.排雷 ps:深度优先遍历数组 四.结束 一.文件 1.头…

《Single-Stage Extensive Semantic Fusion for multi-modal sarcasm detection》

系列论文研读目录 文章目录 系列论文研读目录文章题目含义ABSTRACTKeywords1. Introduction2. Related work3. Method3.1. Multi-modal projection 多模态投影3.2. Extensive Semantic Fusion Multiway Transformer 可拓语义融合多路Transformer3.3. Multi-objective optimizat…

LeetCode 热题 HOT 100 (011/100)【宇宙最简单版】

【图论】No. 0200 岛屿数量 【中等】&#x1f449;力扣对应题目指路 希望对你有帮助呀&#xff01;&#xff01;&#x1f49c;&#x1f49c; 如有更好理解的思路&#xff0c;欢迎大家留言补充 ~ 一起加油叭 &#x1f4a6; 欢迎关注、订阅专栏 【力扣详解】谢谢你的支持&#xf…

DjangoRF-10-过滤-django-filter

1、安装pip install django-filter https://pypi.org/ 搜索django-filter基础用法 2、进行配置 3、进行内容调试。 4、如果碰到没有关联的字段。interfaces和projects没有直接关联字段&#xff0c;但是interface和module有关联&#xff0c;而且module和projects关联&#x…

linux下使用yum安装mysql

本文使用常规方式手动安装mysql 第一步 下载mysql的repo源 wget http://repo.mysql.com/mysql-community-release-el7-5.noarch.rpm第二步 安装mysql-community-release-el7-5.noarch.rpm包 rpm -ivh mysql-community-release-el7-5.noarch.rpm第三步 安装mysql-server yum -y…

Esp_server 安卓嵌入壳子,原创! 2024/7/28 20:58

用到的软件: uni-app 思路: 让用户感觉是,一个完整的程序.实际上只是一个类浏览器壳子.轻便小巧. 由于是第一次用uni-app开发类软件,所以前前后后耗费7小时! 隔行如隔山,不是白讲的. 软件界面: 软件功能: 简化输入: 输入ip地址,例:http:// www.baidu.com 完整网址 前面…

Javaer 5分钟入门 Golang

文章目录 前言一个 go 文件长啥样&#xff1f;Go 语言的变量变量类型变量声明 Go 语言的函数&方法Go 语言没有的概念访问修饰符面向对象模型异常处理机制 Go 语言高效简洁的并发编程总结 前言 这两年主流的编程语言 Golang&#xff0c;想必大家或多或少都接触过。云原生领…

使用 Docker Compose 部署 RabbitMQ 的一些经验与踩坑记录

前言 RabbitMQ 是一个功能强大的开源消息队列系统&#xff0c;它实现了高效的消息通信和异步处理。 本文主要介绍其基于 Docker-Compose 的部署安装和一些使用的经验。 特点 成熟&#xff0c;稳定消息持久化灵活的消息路由高性能&#xff0c;高可用性&#xff0c;可扩展性高支…

【PYTHON】多进程运行示例含共享数据

运行结果 Python多进程调用示例 import multiprocessing import time import os import sys# 注册多个函数用于不同进程分别调用 def testcase0():time.sleep(1)return "case0_"get_time()def testcase1(timestamp):return "case1_"timestampdef testcase…

Python | TypeError: ‘float’ object is not subscriptable

Python | TypeError: ‘float’ object is not subscriptable 在Python编程中&#xff0c;遇到“TypeError: ‘float’ object is not subscriptable”这一错误通常意味着你尝试对浮点数&#xff08;float&#xff09;使用了下标访问&#xff08;如数组或列表那样的访问方式&a…

Mindspore框架循环神经网络RNN模型实现情感分类|(四)损失函数与优化器

Mindspore框架循环神经网络RNN模型实现情感分类 Mindspore框架循环神经网络RNN模型实现情感分类|&#xff08;一&#xff09;IMDB影评数据集准备 Mindspore框架循环神经网络RNN模型实现情感分类|&#xff08;二&#xff09;预训练词向量 Mindspore框架循环神经网络RNN模型实现…

探索 Blockly:自定义积木实例

3.实例 3.1.基础块 无输入 , 无输出 3.1.1.json var textOneJson {"type": "sql_test_text_one","message0": " one ","colour": 30,"tooltip": 无输入 , 无输出 };javascriptGenerator.forBlock[sql_test_te…

数据结构:二叉树(堆)的顺序存储

文章目录 1. 树1.1 树的概念和结构1.2 树的相关术语 2. 二叉树2.1 二叉树的概念和结构2.2 二叉树的特点2.3 特殊的二叉树2.3.1 满二叉树2.3.2 完全二叉树 2.4 二叉树的性质 3. 实现顺序结构二叉树3.1 堆的概念和结构3.2 初始化3.3 销毁3.4 插入数据3.5 向上调整算法3.6 删除数据…

【二叉树】—— 算法题

一、单值二叉树 题目要求&#xff1a;判断二叉树是不是单值二叉树&#xff08;就是所以节点的值都相等&#xff09;。 思路&#xff1a; 利用二叉树的递归思想&#xff0c;判断每一个节点值与其左右子节点的值是否相等&#xff0c;如果遇到空节点&#xff0c;就返回true&#…