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

news2024/12/23 8:42:34

作者前言

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

   🎂      作者介绍:                              🎂🎂

       🎂 🎉🎉🎉🎉🎉🎉🎉              🎂

          🎂作者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.coloradmin.cn/o/850923.html

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

相关文章

从0到1搭建uniapp

一、什么是uniapp UniApp是一款基于Vue.js框架的全端开发工具&#xff0c;可以实现同时开发多个平台&#xff08;包括H5、小程序、APP等&#xff09;应用的能力。使用UniApp&#xff0c;开发者只需要编写一份代码就可以快速地发布到多个平台&#xff0c;极大地提高了开发效率和…

java实现当前系统时间格式化

import java.text.SimpleDateFormat; import java.util.Date;public class DateTest {public static void main(String[] args) {Date date new Date();System.out.println("当前系统时间&#xff1a;" date);SimpleDateFormat simpleDateFormat new SimpleDateFo…

MySQL 查询语句大全

目录 基础查询 直接查询 AS起别名 去重&#xff08;复&#xff09;查询 条件查询 算术运算符查询 逻辑运算符查询 正则表达式查询⭐ 模糊查询 范围查询 是否非空判断查询 排序查询 限制查询&#xff08;分页查询&#xff09; 随机查询 分组查询 HAVING 高级查询…

数据结构和算法三(排序)

列表排序 排序类型&#xff1a; 一、冒泡排序&#xff1a; 屏幕录制2023-07-25 13.05.12 def bubble_sort(li):exchangeFalseif len(li)<1:return lifor i in range(len(li)-1):for j in range(len(li)-i-1):if li[j]>li[j1]:li[j],li[j1]li[j1],li[j]print(li)exchangeT…

【数理知识】奇异值分解,从数据的线性变换角度来理解

序号内容1【数理知识】自由度 degree of freedom 及自由度的计算方法2【数理知识】刚体 rigid body 及刚体的运动3【数理知识】刚体基本运动&#xff0c;平动&#xff0c;转动4【数理知识】向量数乘&#xff0c;内积&#xff0c;外积&#xff0c;matlab代码实现5【数理知识】协…

学习电气工程的关键要点

基础知识&#xff1a;学习电路原理、电子器件、电机原理等基础知识。可以通过自学、培训或相关专业课程来学习。 编程技能&#xff1a;掌握一门编程语言&#xff0c;如C语言或MATLAB。电气工程常需要编程来设计和实现控制系统。 自动化控制理论&#xff1a;了解自动化控制系…

Python web实战之Django 的 RESTful API 设计详解

关键词: Python, Web 开发, Django, RESTful API 1 API的一些事儿 1.1 什么是API&#xff1f; API是应用程序编程接口&#xff08;Application Programming Interface&#xff09;的缩写。它是一种定义了不同软件组件之间交互方式的规范。API允许不同的应用程序之间进行通信和…

【LeetCode】数据结构题解(10)[有效的括号]

有效的括号 &#x1f609; 1.题目来源&#x1f440;2.题目描述&#x1f914;3.解题思路&#x1f973;4.代码展示 &#x1f618;&#x1f618;&#x1f618;&#x1f618;&#x1f618;&#x1f618;&#x1f618;&#x1f618;&#x1f618;&#x1f618;&#x1f618;&#x1…

机器学习笔记:李宏毅ChatGPT Finetune VS Prompt

1 两种大语言模型&#xff1a;GPT VS BERT 2 对于大语言模型的两种不同期待 2.1 “专才” 2.1.1 成为专才的好处 Is ChatGPT A Good Translator? A Preliminary Study 2023 Arxiv 箭头方向指的是从哪个方向往哪个方向翻译 表格里面的数值越大表示翻译的越好 可以发现专门做翻…

vue3 table动态合并,自定义参数合并单元格

<template><div><el-table :data"tableData" :span-method"objectSpanMethod" border:header-cell-style"{ textAlign: center}"><el-table-column prop"area" label"区域" align"center"&g…

如何在页面中嵌入音频和视频?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 嵌入音频⭐ 嵌入视频⭐ 写在最后 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦 几何带你启航前端之旅 欢迎来到前端入门之旅&#xff01;这个专栏是为那些对Web开发感兴趣、刚刚踏…

《合成孔径雷达成像算法与实现》Figure3.2

代码参数说明&#xff1a;Sf1为书中公式3.19&#xff0c;Sf2为时域信号快速傅里叶表达式&#xff0c;两种频谱表达式所做出的图可看出其区别 代码如下&#xff1a; clc clear all close all%参数设置 TBP 720; %时间带宽积 T 10e-6; %脉冲持续时间%参数计…

20.5 HTML 媒体

1. video视频标签 video视频标签: 是HTML中用于在网页上嵌入视频的元素.常用的视频标签属性: - src属性: 指定视频文件的URL地址. - controls属性: 用于显示视频播放控件(如播放按钮, 进度条等), 使用户能够控制视频的播放. - width和height: 指定视频的宽度和高度. - autopla…

ESP32 Max30102 (3)修复心率误差

1. 运行效果 2. 新建修复心率误差.py 代码如下: from machine import sleep, SoftI2C, Pin, Timer from utime import ticks_diff, ticks_us from max30102 import MAX30102, MAX30105_PULSE_AMP_MEDIUM from hrcalc import calc_hr_and_spo2BEATS = 0 # 存储心率 FINGER_F…

MATLAB详细安装教程(亲测有效!!)

1.复制以下链接&#xff0c;用百度网盘打开&#xff0c;下载 链接&#xff1a;https://pan.baidu.com/s/19AwQeCRYofGAV8sfDIm5PQ 提取码&#xff1a;mads 我是下载到D盘自己创建的文件中 2.下载完毕后打开此文件夹&#xff0c;点击最后一项 3.点击右上角高级选项&#xff0…

ESP32 Max30102 (2)检测 血氧、温度

1. 运行效果 thonny终端打印的信息如下 注意: 上述的心率值是有很大的误差的,会在下一节课解决这个问题2. 新模块hrcalc.py 在Micorpython端,新建文件hrcalc.py,内容如下 这个文件的作用,可以计算出 【血氧值】 # -*-coding:utf-8# 25 samples

基于身份的安全威胁正在迅速增长

根据端点安全和威胁情报供应商 CrowdStrike 发布的一份报告&#xff0c;目前最危险的网络安全威胁是能够访问给定系统合法身份信息的攻击者。 根据该报告&#xff0c;交互式入侵&#xff08;该公司将其定义为攻击者积极工作以在受害者系统上实现某种非法目的的入侵&#xff09;…

做接口测试如何上次文件

在日常工作中&#xff0c;经常有上传文件功能的测试场景&#xff0c;因此&#xff0c;本文介绍两种主流编写上传文件接口测试脚本的方法。 首先&#xff0c;要知道文件上传的一般原理&#xff1a;客户端根据文件路径读取文件内容&#xff0c;将文件内容转换成二进制文件流的格式…

FOHEART H1数据手套:连接虚拟与现实,塑造智能交互新未来

在全新交互时代背景中&#xff0c;数据手套无疑是一种重要的科技产物。它不仅彻底改变了我们与虚拟世界的互动方式&#xff0c;更为我们提供了一种全新、更为直观的交互形式。 FOHEART H1数据手套结合了虚拟现实、手势识别等高新技术&#xff0c;用先进的传感技术和精准的数据…

DDR4信号仿完整性仿真

在硬件电路设计中&#xff0c;DDR一直是电路设计中的难点。目前正在进行DDR4的电路设计&#xff0c;将基本的仿真设计过程进行一下记录。 主流的仿真工具都是支持DDR4的仿真的&#xff0c;目前使用的主力工具为Sigrity及Hyperlynx&#xff0c;下面以Sigrity系统软件为例说明一…