C语言猜数字小游戏(也包含python实现的用法)

news2024/9/27 5:46:52

猜数字小游戏

  • 前言
  • 1. C语言中随机数生成
    • 1.1 rand
    • 1.2 srand
    • 1.3 time
    • 1.4 设置随机数的范围
  • 2. 猜数字游戏实现
    • C语言实现猜数字小游戏
    • python方法实现猜数字小游戏


前言

本文基于VS2022、pycharm和前面的知识,写一个凭借分支与循环的小游戏,比如: 写一个猜数字游戏
游戏要求:

  1. 电脑自动生成1~100的随机数
  2. 玩家猜数字,猜数的过程中,根据猜测数据的大小给出大了或小了的反馈,直到猜对,游戏结束

在pyhton中生成随机数是比较简单的,可以直接导入random的包,直接生成随机数,导致写猜数字小游戏变成了判读语句和循环语句嵌套就能写出来,所以我不做过多的介绍了,可以直接看后面的代码展示,想了解更多的python可看python的基础知识,这里面有我在学习python的过程中写的笔记

小编想说:不要害怕追随你的梦想,因为成功只会往那些敢于梦想并且敢于去追求梦想的人身上涌来。只有不停奋斗,才能拥有更美好的未来。希望读者可以在编程这条路上走得越来越远。


1. C语言中随机数生成

要想完成猜数字游戏,首先得产生随机数,那怎么产生随机数呢?

1.1 rand

C语言提供了一个函数叫 rand,这函数是可以生成随机数的,函数原型如下所示:

 int rand (void);

rand函数会返回一个伪随机数,这个随机数的范围是在0~RAND_MAX之间,这个RAND_MAX的大小是依赖编译器上实现的,但是大部分编译器上是32767。
rand函数的使用需要包含一个头文件是:stdlib.h
那我们就测试一下rand函数,这里多调用几次,产生5个随机数:

#include <stdio.h>
#include <stdlib.h>
int main()
{
	printf("%d\n", rand());
	printf("%d\n", rand());
	printf("%d\n", rand());
	printf("%d\n", rand());
	printf("%d\n", rand());
	return 0;
}

我们先运行一次,看看结果,再运行一次再看看结果,多运行几次呢?
在这里插入图片描述
我们可以看到虽然一次运行中产生的5个数字是相对随机的,但是下一次运行程序生成的结果和上一次一模一样,这就说明有点问题。
如果再深入了解一下,我们就不难发现,其实rand函数生成的随机数是伪随机的,伪随机数不是真正的随机数,是通过某种算法生成的随机数。真正的随机数的是无法预测下一个值是多少的。而rand函数是对一个叫“种子”的基准值进行运算生成的随机数。
之所以前面每次运行程序产生的随机数序列是一样的,那是因为rand函数生成随机数的默认种子是1。 如果要生成不同的随机数,就要让种子是变化的。

1.2 srand

C语言中又提供了一个函数叫 srand,用来初始化随机数的生成器的,srand的原型如下:

 void srand (unsigned int seed);

程序中在调用 rand 函数之前先调用 srand 函数,通过 srand 函数的参数seed来设置rand函数生成随机数的时候的种子,只要种子在变化,每次生成的随机数序列也就变化起来了。 那也就是说给srand的种子是如果是随机的,rand就能生成随机数;在生成随机数的时候又需要一个随机数,这就矛盾了。

1.3 time

在程序中我们一般是使用程序运行的时间作为种子的,因为时间时刻在发生变化的。 在C语言中有一个函数叫 time ,就可以获得这个时间,time函数原型如下:

 time_t time (time_t* timer);

time 函数会返回当前的日历时间,其实返回的是1970年1⽉1⽇0时0分0秒到现在程序运⾏时间之间的差值,单位是秒。返回的类型是time_t类型的,time_t 类型本质上其实就是32位或者64位的整型类型。
time函数的参数 timer 如果是非NULL的指针的话,函数也会将这个返回的差值放在timer指向的内存中带回去。
如果 timer 是NULL,就只返回这个时间的差值。
time函数返回的这个时间差也被叫做:时间戳。
time函数的时候需要包含头⽂件:time.h

//VS2022 上time_t类型的说明
#ifndef _CRT_NO_TIME_T
#ifdef _USE_32BIT_TIME_T
typedef __time32_t time_t;
#else
typedef __time64_t time_t;
#endif
#endif


typedef long			__time32_t;
typedef __int64			__time64_t;

如果只是让time函数返回时间戳,我们就可以这样写

 time(NULL);//调⽤time函数返回时间戳,这⾥没有接收返回值

那我们就可以让生成随机数的代码改写成如下:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main()
{
//使⽤time函数的返回值设置种⼦
//因为srand的参数是unsigned int类型,我们将time函数的返回值强制类型转换
    srand((unsigned int)time(NULL));
	printf("%d\n", rand());
	printf("%d\n", rand());
	printf("%d\n", rand());
	printf("%d\n", rand());
	printf("%d\n", rand());
	return 0;
}

多运行几次看看,每次的运行就有差异了。

在这里插入图片描述

注:截图只是我当时程序运行的结果,你的运行结果不一定和这个一样

srand函数是不需要频繁调用的,一次运行的程序中调用一次就够了。

1.4 设置随机数的范围

如果我们要生成0~99之间的随机数,方法如下:

 rand() %100;//余数的范围是0~99

如果要生成1~100之间的随机数,方法如下:

 rand()%100+1;//%100的余数是0~99,0~99的数字+1,范围是1~100

如果要生成100~200的随机数,方法如下:

100 + rand()%(200-100+1)//余数的范围是0~100,加100后就是100~200

所以如果要生成a~b的随机数,方法如下:

 a + rand()%(b-a+1)

2. 猜数字游戏实现

C语言实现猜数字小游戏

head.h

#pragma once//防止声明函数被多次引用
#define _CRT_SECURE_NO_WARNINGS 1 //解决VS2022出现的不安全问题
#include <stdio.h>
#include <time.h> 
#include <Windows.h> //实现屏幕停止3s

#define RANGE 5 //设置猜的数字的范围


void menu();//菜单函数
void game();//游戏函数

text.c

#include "head.h"

void menu()
{
	printf("******************************************\n");
	printf("******************************************\n");
	printf("******1. 开始游戏****0..退出游戏**********\n");
	printf("******************************************\n");
	printf("******************************************\n");
}

void game()
{
	int range = rand() % RANGE + 1,input = 0;
	int count = 0;
	while(++count)
	{
		printf("请输入需要猜的数字\n");
		scanf("%d", &input);
	if (range == input)
	{
		printf("猜对了\n"); printf("共猜了%d步\n",count); break;
	}
	else if (range < input)
	{
		printf("猜大了\n"); 
	}
	else
	{
		printf("猜小了\n"); 
	}
	}
	Sleep(3000);//使屏幕停止3秒
}

main.c

#include "head.h"

int main()
{
	int input;
	srand((unsigned int)time(NULL));//生成随机数的种子
	do
	{
		menu();
		scanf("%d", &input);
		switch (input)
		{
		case 1:game(); break;
		case 0:exit(0);
		default: continue;
		}
	} while (1);
	system("pasue");
	return 0;
}

还可以加上猜数字的次数限制,如果5次猜不出来,就算失败

#include "head.h"

void menu()
{
	printf("******************************************\n");
	printf("******************************************\n");
	printf("******1. 开始游戏****0..退出游戏**********\n");
	printf("******************************************\n");
	printf("******************************************\n");
}

void game()
{
	int range = rand() % RANGE + 1,input = 0;
	int count = 0;
	while(++count)
	{
		printf("请输入需要猜的数字\n");
		scanf("%d", &input);
	if (range == input)
	{
		printf("猜对了\n"); break;
	}
	else if (range < input)
	{
		printf("猜大了\n"); 
	}
	else
	{
		printf("猜小了\n"); 
	}
	if (count == 5)
	{
		printf("失败\n"); break;
	}
	}
	Sleep(3000);
}

python方法实现猜数字小游戏

import random


def menu():
    print('***********************************\n')
    print('******1.开始游戏**2.退出游戏**********\n')
    print('***********************************\n')
    print('***********************************\n')


def game():
    count = 1
    data = random.randint(1, 5)
    print('输入要猜的数字')
    while count:
        count +=1
        a = int(input())
        if a == data:
            print("猜对了\n")
            break
        elif a > data:
            print('太大了')
        else:
            print('太小了')
    print(f'一共猜了{count}步')

menu()
while True:
    b = int(input())
    if(b == 1):
        game()
    else:
        print('游戏结束\n')
        break

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

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

相关文章

C# 使用using报错CS1674解决办法

Severity Code Description Project File Line Suppression State Error CS1674 ‘MutipleThreadResetEvent’: type used in a using statement must be implicitly convertible to ‘System.IDisposable’. 第一种解决方法&#xff1a;工具 -.NuGet下载EntityFramework是否能…

C++设计模式_12_Singleton 单件模式

在之前的博文C57个入门知识点_44&#xff1a;单例的实现与理解中&#xff0c;已经详细介绍了单例模式&#xff0c;并且根据其中内容&#xff0c;单例模式已经可以在日常编码中被使用&#xff0c;本文将会再做梳理。 Singleton 单件模式可以说是最简单的设计模式&#xff0c;但由…

力扣第1005题 K 次取反后最大化的数组和 c++ 贪心 双思维

题目 1005. K 次取反后最大化的数组和 简单 相关标签 贪心 数组 排序 给你一个整数数组 nums 和一个整数 k &#xff0c;按以下方法修改该数组&#xff1a; 选择某个下标 i 并将 nums[i] 替换为 -nums[i] 。 重复这个过程恰好 k 次。可以多次选择同一个下标 i 。 以…

【Javascript】通过浏览器书签构建与执行自动刷新脚本

0x00 前言 日常工作中&#xff0c;经常遇到需要时不时点一下刷新这样的事情&#xff08;怪前端想不到写一个自动刷新&#xff09; 但是…… 没有自动刷新按钮&#xff0c;在这页面手动点刷新还是太浪费时间了。 有时候懒得等了去做别的事情&#xff0c;过一小时回来刷新一下&a…

k8s之Flannel网络插件安装提示forbidden无权限

一、问题描述 在安装k8s的网络插件时&#xff0c;提示如下信息&#xff0c;各种forbidden无权限 [rootzzyk8s01 scripts]# kubectl apply -f kube-flannel.yml Error from server (Forbidden): error when retrieving current configuration of: Resource: "policy/v1b…

Vue中使用Web Serial API连接串口,实现通信交互

Vue中使用Web Serial API连接串口&#xff0c;实现通信交互 Web Serial API&#xff0c;web端通过串口与硬件通信; 该API是JS本身 navigator 对象上就独有的&#xff0c;所以与Vue和React框架开发都没有太大的关系&#xff0c; 串口是一个双向通信接口&#xff0c;允许字节发送…

ES6 模块化编程 详解

目录 一、基本介绍 二、基本原理示意图 三、传统CommonJS实现模块化编程 1.介绍 : 2.实例 : 四、ES6新特性实现模块化编程 1.介绍 : 2.实例 : 一、基本介绍 (1) ES6新特性——模块化编程&#xff0c;用于解决传统非模块化开发中出现的"命名冲突", "文件…

LDAP和Kerberos疑难问题诊断方法

不同的工具和方法总能给问题的解决带来希望。本文使用SSSD工具诊断Kerberos和LDAP登录问题诊断。后端&#xff08;通常也称为数据提供程序&#xff09;是管理和创建缓存的 SSSD 子进程。此过程与LDAP服务器通信&#xff0c;执行不同的查找查询并将结果存储在缓存中。它还针对 L…

PY32F002A系列单片机:高性价比、低功耗,满足多样化应用需求

PY32F002A系列微控制器是一款高性能、低功耗的MCU&#xff0c;它采用32位ARM Cortex-M0内核&#xff0c;最高工作频率达到24MHz&#xff0c;提供了强大的计算能力。此外&#xff0c;PY32F002A拥有最大20Kbytes的flash存储器和3Kbytes的SRAM&#xff0c;为简单的数据处理提供了充…

一文速通Nginx网关与gateway网关区分

目录 API网关介绍 gateway基本介绍 Nginx基本介绍 Nginx与API gateway网关 API网关介绍 网关的角色是作为一个 API 架构&#xff0c;用来保护、增强和控制对于 API 服务的访问。API 网关是一个处于应用程序或服务&#xff08;提供 REST API 接口服务&#xff09;之前的系…

创建 Edge 浏览器扩展教程(上)

创建 Edge 浏览器扩展教程&#xff08;上&#xff09; 介绍开始之前后续步骤开始之前1&#xff1a;创建清单 .json 文件2 &#xff1a;添加图标3&#xff1a;打开默认弹出对话框 介绍 在如今日益数字化的时代&#xff0c;浏览器插件在提升用户体验、增加功能以及改善工作流程方…

Spring Authorization Server 1.1 扩展 OAuth2 密码模式与 Spring Cloud Gateway 整合实战

目录 前言无图无真相创建数据库授权服务器maven 依赖application.yml授权服务器配置AuthorizationServierConfigDefaultSecutiryConfig 密码模式扩展PasswordAuthenticationTokenPasswordAuthenticationConverterPasswordAuthenticationProvider JWT 自定义字段自定义认证响应认…

【AI视野·今日Robot 机器人论文速览 第五十八期】Thu, 19 Oct 2023

AI视野今日CS.Robotics 机器人学论文速览 Thu, 19 Oct 2023 Totally 25 papers &#x1f449;上期速览✈更多精彩请移步主页 Daily Robotics Papers InViG: Benchmarking Interactive Visual Grounding with 500K Human-Robot Interactions Authors Hanbo Zhang, Jie Xu, Yuch…

『heqingchun-Qt的艺术-优雅界面设计开发』

Qt的艺术-优雅界面设计开发 效果图 一、新建Qt窗口工程 二、准备资源文件 1.图标资源 链接: 图标资源 2.Qss资源 链接: Qss资源 三、设计开发 项目源码链接: CSDN资源

随机生成一个指定边数多边形

随机生成一个指定边数多边形 算法背景&#xff1a;我们想完成一个可以随机生成指定边数多边形的算法。在生成过程中&#xff0c;需要避免随机点连接过程中交叉的问题。 算法步骤   1、为了随机生成一个n边形&#xff0c;我们先随机生成n个点。例如下图&#xff0c;我们随机生…

AI Chatbot 对企业降低人力成本和提高竞争力的作用

随着人工智能技术的发展&#xff0c;越来越多的企业开始尝试将AI ChatBot引入到业务中。AI Chatbot是一种基于人工智能技术的智能对话机器人。它可以模拟人类对话&#xff0c;通过自然语言处理和机器学习算法来理解和回答用户的问题&#xff0c;可以帮助企业降低成本和提高效率…

ExoPlayer架构详解与源码分析(7)——SampleQueue

系列文章目录 ExoPlayer架构详解与源码分析&#xff08;1&#xff09;——前言 ExoPlayer架构详解与源码分析&#xff08;2&#xff09;——Player ExoPlayer架构详解与源码分析&#xff08;3&#xff09;——Timeline ExoPlayer架构详解与源码分析&#xff08;4&#xff09;—…

上海亚商投顾:沪指放量反弹 两市超4500股飘红

上海亚商投顾前言&#xff1a;无惧大盘涨跌&#xff0c;解密龙虎榜资金&#xff0c;跟踪一线游资和机构资金动向&#xff0c;识别短期热点和强势个股。 一.市场情绪 三大指数昨日集体反弹&#xff0c;深成指、创业板指盘中涨超1%&#xff0c;黄白二线大幅分化&#xff0c;题材…

视频配音软件有哪些?推荐几款好用的视频配音软件

视频配音软件有哪些&#xff1f;推荐几款好用的视频配音软件 不知道大家有没有这样的体会&#xff0c;我们在观看视频作品的时候&#xff0c;如果没有声音&#xff0c;就会少了很多韵味和可供思索的空间&#xff0c;相反&#xff0c;好的配音可以为作品增色&#xff0c;一句台…

docker 搭建 flink 并上传任务

文章目录 一、docker 搭建 flink1、选择合适的 flink 版本2、重新创建 JobManager、TaskManager 容器并挂载配置文件 二、flink 简单示例1、创建项目架构2、批处理简单示例3、流处理简单示例4、上传 flink 集群①、UI 界面提交任务②、命令提交任务 5、web-ui 提交查看撤销任务…