C语言数组第十课---------------三子棋-------数组经典练手题

作者前言

🎂        ✨✨✨✨✨✨🍧🍧🍧🍧🍧🍧🍧🎂

   🎂      作者介绍:                              🎂🎂

       🎂 🎉🎉🎉🎉🎉🎉🎉              🎂

          🎂作者id:老秦包你会,         🎂

简单介绍:🎂🎂🎂🎂🎂🎂🎂🎂🎂🎂🎂🎂🎂🎂🎂

             喜欢学习C语言和python等编程语言,是一位爱分享的博主,有兴趣的小可爱可以来互讨         🎂🎂🎂🎂🎂🎂🎂🎂

                 🎂个人主页::小小页面🎂

                  🎂gitee页面:秦大大🎂

                   🎂🎂🎂🎂🎂🎂🎂🎂
        🎂  一个爱分享的小博主 欢迎小可爱们前来借鉴🎂

_______________________________________________________

______________________________________________________________________

目录

        三子棋

                分析

                代码

   

_________________________________________________________

知识小插曲

1.sizeof 是操作符,计算占用内存的大小,单位是字节,计算的是,计算的对象是什么类型都行,

2.strlen是库函数,统计字符串的个数,计算的是\0之前出现的字符个数

小小解说

在上一篇博文中我简单的介绍了数组的创建和使用,也大概的介绍了数组名的作用,下面我们就来写一写这个数组的经典练习,

三子棋

分析

首先,我们玩游戏的时候都会有一个游戏界面,界面里面有菜单,那么我们玩三子棋也必须有菜单,

void meun()
{printf("********   三子棋  *******\n");printf("**************************\n");printf("********   0.exit  *******\n");printf("********   1.play  *******\n");printf("**************************\n");}

这里就是菜单函数.

然后初始化一个数组,默认设计成空格

void my_initialization(char arr1[][COL], int row, int col)
{int i = 0;for (i = 0; i < row; i++){int j = 0;for (j = 0; j < col; j++){arr1[i][j] = ' ';}}
}

下面我们就要打印一下九空格

我们可以分为几步,进行打印

void my_Carving_a_chessboard(char arr1[][COL], int row, int col)
{int i = 0;printf("-------------\n");for (i = 0; i < row; i++){int j = 0;for (j = 0; j < col; j++){printf("| ");printf("%c ", arr1[i][j]);}printf("|\n");printf("-------------\n");}
}

当我们设计好这些后,就是玩家该下棋了,下棋要注意坐标,数组的范围,以及玩家的所想,下面我来代码演示

玩家和电脑下棋:

在这个过程中我们要知道玩家下过的地方电脑和玩家不能再下,电脑下给地方也一样,如果小可爱熟悉下棋,机会发现下棋者赢最快至少总共要下5个棋子,但为了让小可啊明白我这里就不做出这个判断了,

代码如下:

//电脑下棋
void comp_paly_chess(char arr1[][COL], int row, int col)
{while (1){int x = rand() % 3;int y = rand() % 3;if (arr1[x][y] == ' '){arr1[x][y] = '*';break;}}}void paly_chess(char arr1[][COL], int row, int col)
{//玩家下棋int x ;int y ;int num = 0;while (1){printf("玩家请输入坐标:>");scanf("%d %d", &x, &y);if (arr1[x - 1][y - 1] = ' ' && (x >= 1 && x <= 3) && (y >= 1 && y <= 3)){arr1[x - 1][y - 1] = '#';//判断谁赢了num = is_win(arr1, ROW, COL);if (num){break;}int flat = 0;// 判断是否是平局for (x = 0; x < row; x++){for (y = 0; y < col; y++){if (arr1[x][y] == ' '){flat++;}}}if (!flat){printf("平局\n");break;}//电脑下棋comp_paly_chess(arr1, ROW, COL);my_Carving_a_chessboard(arr1, ROW, COL);//判断谁赢了is_win(arr1, ROW, COL);if (num){break;}}else{printf("输入不符合要求,请重新输入\n");}}}

每下一步我都会判断一次,这样的效率很低,这里为了让大家理解就不做判断了

判断谁赢

代码:

int  is_win(char arr1[][COL], int row, int col)
{//行胜int i = 0;for (i = 0; i < row; i++){int count = 0;int count1 = 0;int j = 0;for (j = 0; j < col; j++){if (arr1[i][j] == '#')count++;else if (arr1[i][j] == '*')count1++;}if (count == 3){printf("玩家胜利\n");return 1;}else if (count1 == 3){printf("电脑胜利\n");return 2;}}//列胜for (i = 0; i < row; i++){int count = 0;int count1 = 0;int j = 0;for (j = 0; j < col; j++){if (arr1[j][i] == '#')count++;else if (arr1[j][i] == '*')count1++;}if (count == 3){printf("玩家胜利\n");return 1;}else if (count1 == 3){printf("电脑胜利\n");return 2;}}//对角for (i = 0; i < row; i++){int count = 0;int count1 = 0;int j = 0;if (arr1[i][i] == '#')count++;else if (arr1[i][i] == '*')count1++;if (count == 3){printf("玩家胜利\n");return 1;}else if (count1 == 3){printf("电脑胜利\n");return 2;}}//斜角for (i = 0; i < row; i++){int count = 0;int count1 = 0;int j = 0;for (j = col - 1; j >= 0; j--){if (arr1[i][j] == '#')count++;else if (arr1[i][j] == '*')count1++;}if (count == 3){printf("玩家胜利\n");return 1;}else if (count1 == 3){printf("电脑胜利\n");return 2;}}return 0;
}

这里我是根据上图是行和列对角一一判断的,有很多重复的代码,但这样可以让小可爱们能理解,

 下面我分享一下全部代码

头文件.h:

#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define ROW 3
#define COL 3//游戏
void game();
//数组初始化
void my_initialization(char arr1[][COL], int row, int col);
//雕刻棋盘
void my_Carving_a_chessboard(char arr1[][COL], int row, int col);
//玩家和电脑下棋
void paly_chess(char arr1[][COL], int row, int col);
//电脑下棋
void comp_paly_chess(char arr1[][COL], int row, int col);

三子棋函数.c

#include "三子棋.h"
void game()
{char arr1[ROW][COL];//数组初始化my_initialization(arr1, ROW, COL);// 雕刻棋盘my_Carving_a_chessboard(arr1, ROW, COL);//打印棋盘//my_print_chess(arr1, ROW, COL);//电脑下棋//comp_paly_chess(arr1, ROW, COL);//玩家下棋和电脑下棋paly_chess(arr1, ROW, COL);}void my_initialization(char arr1[][COL], int row, int col)
{int i = 0;for (i = 0; i < row; i++){int j = 0;for (j = 0; j < col; j++){arr1[i][j] = ' ';}}
}void my_Carving_a_chessboard(char arr1[][COL], int row, int col)
{int i = 0;printf("-------------\n");for (i = 0; i < row; i++){int j = 0;for (j = 0; j < col; j++){printf("| ");printf("%c ", arr1[i][j]);}printf("|\n");printf("-------------\n");}
}
//电脑下棋
void comp_paly_chess(char arr1[][COL], int row, int col)
{while (1){int x = rand() % 3;int y = rand() % 3;if (arr1[x][y] == ' '){arr1[x][y] = '*';break;}}}void paly_chess(char arr1[][COL], int row, int col)
{//玩家下棋int x ;int y ;int num = 0;while (1){printf("玩家请输入坐标:>");scanf("%d %d", &x, &y);if (arr1[x - 1][y - 1] = ' ' && (x >= 1 && x <= 3) && (y >= 1 && y <= 3)){arr1[x - 1][y - 1] = '#';//判断谁赢了num = is_win(arr1, ROW, COL);if (num){break;}int flat = 0;// 判断是否是平局for (x = 0; x < row; x++){for (y = 0; y < col; y++){if (arr1[x][y] == ' '){flat++;}}}if (!flat){printf("平局\n");break;}//电脑下棋comp_paly_chess(arr1, ROW, COL);my_Carving_a_chessboard(arr1, ROW, COL);//判断谁赢了is_win(arr1, ROW, COL);if (num){break;}}else{printf("输入不符合要求,请重新输入\n");}}}
int  is_win(char arr1[][COL], int row, int col)
{//行胜int i = 0;for (i = 0; i < row; i++){int count = 0;int count1 = 0;int j = 0;for (j = 0; j < col; j++){if (arr1[i][j] == '#')count++;else if (arr1[i][j] == '*')count1++;}if (count == 3){printf("玩家胜利\n");return 1;}else if (count1 == 3){printf("电脑胜利\n");return 2;}}//列胜for (i = 0; i < row; i++){int count = 0;int count1 = 0;int j = 0;for (j = 0; j < col; j++){if (arr1[j][i] == '#')count++;else if (arr1[j][i] == '*')count1++;}if (count == 3){printf("玩家胜利\n");return 1;}else if (count1 == 3){printf("电脑胜利\n");return 2;}}//对角for (i = 0; i < row; i++){int count = 0;int count1 = 0;int j = 0;if (arr1[i][i] == '#')count++;else if (arr1[i][i] == '*')count1++;if (count == 3){printf("玩家胜利\n");return 1;}else if (count1 == 3){printf("电脑胜利\n");return 2;}}//斜角for (i = 0; i < row; i++){int count = 0;int count1 = 0;int j = 0;for (j = col - 1; j >= 0; j--){if (arr1[i][j] == '#')count++;else if (arr1[i][j] == '*')count1++;}if (count == 3){printf("玩家胜利\n");return 1;}else if (count1 == 3){printf("电脑胜利\n");return 2;}}return 0;
}

三子棋模板

#include "三子棋.h"
void menu(void)
{printf("********      三子棋       ******\n");printf("*********************************\n");printf("********      0.exit       ******\n");printf("********      1.paly       ******\n");printf("*********************************\n");}
int main()
{srand((unsigned)time(NULL));int input = 0;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;
}

总结:

三子棋的思路:

第一步游戏界面

第二步:打印棋盘

第三步:玩家和电脑对弈

这三步概纳了三子棋的主要思路,有不懂的小可爱可以私聊我

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

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

相关文章

根据数组中各值是否满足指定条件决定是否将其按指定规则计算更新numpy.putmask()

【小白从小学Python、C、Java】 【计算机等考500强证书考研】 【Python-数据分析】 根据数组中各值是否满足指定条件 决定是否将其按指定规则计算更新 numpy.putmask() 选择题 以下程序的运行结果是? import numpy as np xnp.array([1,2,3,4,5]) print("【显示】x:\n&quo…

SolidUI社区-从开源社区角度思考苹果下架多款ChatGPT应用

文章目录 背景下架背景下架原因趋势SolidUI社区的未来规划结语如果成为贡献者 背景 随着文本生成图像的语言模型兴起&#xff0c;SolidUI想帮人们快速构建可视化工具&#xff0c;可视化内容包括2D,3D,3D场景&#xff0c;从而快速构三维数据演示场景。SolidUI 是一个创新的项目…

使用Openoffice或LibreOffice实现World、Excel、PPTX在线预览

使用Openoffice或LibreOffice实现World、Excel、PPTX在线预览 预览方案使用第三方服务使用前端库转换格式 jodconverterjodconverter概述主要特性OpenOfficeLibreOffice jodconverter的基本使用添加依赖配置创建DocumentConverter实例上传与转换预览启动上传与预览World 与Spri…

arcgis栅格数据之最佳路径分析

1、打开arcmap&#xff0c;加载数据&#xff0c;需要对影像进行监督分类&#xff0c;如下&#xff1a; 这里任选一种监督分类的方法&#xff08;最大似然法&#xff09;&#xff0c;如下&#xff1a; 这里会先生成一个.ecd文件&#xff0c;然后再利用.ecd文件对影像进行分类。如…

linux (platform driver)平台设备驱动匹配方法

Table of Contents 一、匹配函数platform_match 1.1、设备树匹配方法 1.2、id_table匹配方法 1.3、dev-name和platform_driver->drv->name匹配方法 一、匹配函数platform_match 平台设备驱动分为设备层和驱动层&#xff0c;每当有新的设备或者新的设备驱动注册时都要…

“构建高级自定义MVC框架实现CRUD功能的完整指南“

目录 前言1. 导入罐2. 导入工具类3. 配置框架配置文件以及web.xml4. 创建实体类、DAO、Service和Controller5. 配置框架的配置文件6. 页面前端开发 总结 前言 在现代的Web开发中&#xff0c;MVC&#xff08;Model-View-Controller&#xff09;架构模式被广泛应用。它将应用程序…

汽车维修保养记录查询API:实现车辆健康状况一手掌握

在当今的数字化世界中&#xff0c;汽车维修保养记录的查询和管理变得前所未有地简单和便捷。通过API&#xff0c;我们可以轻松地获取车辆的维修和保养记录&#xff0c;从而实现对手中车辆健康状况的实时掌握。 API&#xff08;应用程序接口&#xff09;是进行数据交换和通信的标…

常用 JVM 调优工具

点击下方关注我&#xff0c;然后右上角点击...“设为星标”&#xff0c;就能第一时间收到更新推送啦~~~ JVM 日常调优总结起来就是&#xff1a;首先通过 jps 命令查看当前进程&#xff0c;然后根据 pid 通过 jinfo 命令查看和修改 jvm 参数&#xff0c;通过 jstat 命令查看 cla…

Disruptor-源码解读

前言 Disruptor的高性能&#xff0c;是多种技术结合以及本身架构的结果。本文主要讲源码&#xff0c;涉及到的相关知识点需要读者自行去了解&#xff0c;以下列出&#xff1a; 锁和CAS伪共享和缓存行volatile和内存屏障 原理 添加了中文注释的源码&#xff1a;Disruptor 下…

Databend 开源周报第 105 期

Databend 是一款现代云数仓。专为弹性和高效设计&#xff0c;为您的大规模分析需求保驾护航。自由且开源。即刻体验云服务&#xff1a;https://app.databend.cn 。 Whats On In Databend 探索 Databend 本周新进展&#xff0c;遇到更贴近你心意的 Databend 。 Databend 轻量级…

深入理解负载均衡原理及算法

1. 前言 在互联网早期,网络还不是很发达,上网用户少,流量相对较小,系统架构以单体架构为主。但如今在互联网发达的今天,流量请求动辄百亿、甚至上千亿,单台服务器或者实例已完全不能满足需求,这就有了集群。不论是为了实现高可用还是高性能,都需要用到多台机器来扩展服…

Jupyter Notebook 500 : Internal Server Error

1. 这个问题的根本原因在于&#xff1a; pygments 包 版本过高。 安装pygments 2.6.1 2.jupyter版本如下 如果某个版本有冲突&#xff0c;卸载了重新安装一下就行。 安装命令&#xff1a; pip install pygments 2.6.1 -i https://pypi.tuna.tsinghua.edu.cn/simple 另外…

嘉楠勘智k230开发板上手记录(三)--K230_RVV实战

按照K230_RVV实战.md操作 在k230_sdk目录下运行&#xff0c;Makefile里默认的toolchain路径是在/opt下的&#xff0c;需要拷贝过去 cp -r toolchain /opt/ make rt-smart-apps 进入目录 src/big/rt-smart 运行脚本 source smart-env.sh riscv64 配置环境变量 source smart-e…

git教程(第一次使用)

一、gitee和github区别 二、git使用 下载地址 windows&#xff1a;https://gitforwindows.org/ mac&#xff1a;http://sourceforge.net/projects/git-osx-installer/ 1.git初次运行前的配置 &#xff08;1&#xff09;配置用户信息 git config --global user.name "…

【模型预测控制MPC】使用离散、连续、线性或非线性模型对预测控制进行建模(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

AP51656 电流采样降压恒流驱动IC RGB PWM深度调光 LED电源驱动

产品描述 AP51656是一款连续电感电流导通模式的降压恒流源&#xff0c;用于驱动一颗或多颗串联LED 输入电压范围从 5 V 到 60V&#xff0c;输出电流 可达 1.5A 。根据不同的输入电压和 外部器件&#xff0c; 可以驱动高达数十瓦的 LED。 内置功率开关&#xff0c;采用电流采样…

我的Python教程:使用Pyecharts画柱状图

Pyecharts是一个用于生成 Echarts 图表的 Python 库。Echarts 是一个基于 JavaScript 的数据可视化库&#xff0c;提供了丰富的图表类型和交互功能。通过 Pyecharts&#xff0c;你可以使用 Python 代码生成各种类型的 Echarts 图表&#xff0c;例如折线图、柱状图、饼图、散点图…

网络安全--mysql中事务锁以及事务隔离解析

一、事务锁 1、个人理解&#xff1a; 专一性和历史性&#xff0c;例如一个男人历史上是花心的&#xff0c;但当他成长后开启begin和update后变的专一了&#xff0c;多项事务也影响不到他了&#xff0c;直到水泥封心&#xff0c;只可被一个人查询在此我们进入正题&#xff1a;…

面试热题(前中序遍历构建树)

给定两个整数数组 preorder 和 inorder &#xff0c;其中 preorder 是二叉树的先序遍历&#xff0c; inorder 是同一棵树的中序遍历&#xff0c;请构造二叉树并返回其根节点。 题目中是给定两个数组&#xff0c;一个是存放这颗树的前序遍历的数组&#xff0c;一个是存放这棵树的…

让三驾马车奔腾:华为如何推动空间智能化发展?

上个月&#xff0c;国务院常务会议审议通过了《关于促进家居消费的若干措施》&#xff0c;其中明确提出了“推动单品智能向全屋智能发展创新培育智能消费”“开展数字家庭建设试点”等推动全屋智能拼配发展的建议与方案。 可以说&#xff0c;以整屋为单位的空间智能品类&#x…