送女朋友一个猜数字小游戏,猜对了会显示爱心(给你心爱的他或她一个惊喜)

        起因是我在学习C语言完成老师布置C语言写一个猜数字的作业,突发奇想,能不能在这个猜对了之后弹出一个不一样的页面,然后就试试看能不能实现。基本思路是这样的:

1:先写一个C语言的猜数字的小游戏,在我上个文章有思路代码如下:链接挂这了:C语言猜数字小游戏-CSDN博客

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
void menu()
{
	printf("****   猜数字游戏!   ****\n");
	printf("****   按1开始游戏   ****\n");
	printf("****   按0退出游戏   ****\n");
}
void game()
{
	int ret = rand()%100+1;
	//printf("%d\n", ret);
	int num = 0;
	int cnt = 10;
	int sum = cnt;
	while (1)
	{
		printf("你还有%d次机会\n", cnt);
		printf("请输入一个1-100之间的数:");
		scanf("%d", &num);
		if (num > ret)
		{
			printf("数字太大了!\n");
		}
		else if (num < ret)
		{
			printf("数字太小了!\n");
		}
		else
		{
			printf("恭喜你猜对了!\n");
			printf("猜对用了%d次\n", sum-cnt);
			break;
		}
		cnt--;
		if (cnt == 0)
		{
			printf("你的机会用完了,游戏结束!\n");
			printf("正确的数字是%d\n\n\n", ret);
			break;
		}
	}
}
int main()
{
	srand((unsigned int)time(NULL));
	int input = 0;
	do 
	{
		menu();
		printf("请选择你需要的操作:");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			game();
			break;
		case 0:
			printf("退出游戏!\n");
			break;
		default:
			printf("输入错误,请重新输入!\n");
			break;
		}

	} while (input);
	return 0;
}

2:在此代码的基础上添加一些函数,在game()函数完成后实现弹出动画心形的思路

        2.1:首先要定义出这个心形的基本参数

float f(float x, float y, float z) 
{
    float a = x * x + 9.0f / 4.0f * y * y + z * z - 1;
    return a * a * a - x * x * z * z * z - 9.0f / 80.0f * y * y * z * z * z;
}

float h(float x, float z) 
{
    for (float y = 1.0f; y >= 0.0f; y -= 0.001f)
        if (f(x, y, z) <= 0.0f)
            return y;
    return 0.0f;
}

void color() 
{
    system("color c");
}

 3:这三个函数就可以实现一个跳动的心,然后在心形的下面放置你想对他说的话,代码如下:

void sentance() 
{
    char title1[] = "============ 2021 12 05 ============";
    char title2[] = "============ 2023 12 05 ============";          //输入标题
    char word[] = "====== 两周年快乐,我爱你宝贝!======";  //输入想说的文字
    printf("\n\t      ");                                         //调整格式
    printf("%s", title1);
    printf("\n\t      ");                                         //调整格式
    printf("%s", title2);
    printf("\n\t      ");
    printf("%s", word);
}

4:文字都可以自己添加,你想再多加几行也可以,直接多写几个char字符串最后再打印出来就可以。然后就是函数调用的问题;

我们可以在设置一个函数,这个函数可以让你的心形具有跳动的功能,代码如下:

int langman() 
{
    HANDLE o = GetStdHandle(STD_OUTPUT_HANDLE);
    _TCHAR buffer[25][80] = { _T(' ') };
    _TCHAR ramp[] = _T(".:-=+*#%@");

    for (float t = 0.0f;; t += 0.1f) 
    {
        int sy = 0;
        float s = sinf(t);
        float a = s * s * s * s * 0.2f;
        for (float z = 1.3f; z > -1.2f; z -= 0.1f) 
        {
            _TCHAR* p = &buffer[sy++][0];
            float tz = z * (1.2f - a);
            for (float x = -1.5f; x < 1.5f; x += 0.05f) 
            {
                float tx = x * (1.2f + a);
                float v = f(tx, 0.0f, tz);
                if (v <= 0.0f) {
                    float y0 = h(tx, tz);
                    float ny = 0.01f;
                    float nx = h(tx + ny, tz) - y0;
                    float nz = h(tx, tz + ny) - y0;
                    float nd = 1.0f / sqrtf(nx * nx + ny * ny + nz * nz);
                    float d = (nx + ny - nz) * nd * 0.5f + 0.5f;
                    *p++ = ramp[(int)(d * 5.0f)];
                }
                else
                    *p++ = ' ';
            }
        }
        for (sy = 0; sy < 25; sy++) 
        {
            COORD coord = { 0, sy };
            SetConsoleCursorPosition(o, coord);
            WriteConsole(o, buffer[sy], 79, NULL, 0);

        }
        Sleep(33);
        color();
        sentance();
    }
}

5:写到这函数基本就成形了,只差一个主函数了,我们再把主函数给它加上

代码如下:

int main()
{
    srand((unsigned int)time(NULL));
    int input = 0;
    do
    {
        menu();
        printf("请选择你需要的操作->");
        if (scanf("%d", &input) != 1 || (input != 0 && input != 1))
        {
            printf("输入错误,请重新输入!\n");
            while (getchar() != '\n');
            continue;
        }
        switch (input)
        {
        case 1:
            game();
            break;
        case 0:
            printf("退出游戏!\n");
            break;
        default:
            /*printf("输入错误,请重新输入!\n");*/
            break;
        }

    } while (input != 0);
    return 0;
}

        当然还有猜数字游戏的主体函数以及菜单函数,这个我们先不着急,感兴趣的朋友可以直接复制下面的完整代码运行试试:

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include <math.h>
#include <windows.h>
#include <tchar.h>

void menu()
{
    printf("*********************************\n");
    printf("****   玩一个猜数字游戏吧!  ****\n");
    printf("****   规定步数内完成有惊喜  ****\n");
    printf("****   请按'1'可以开始游戏   ****\n");
    printf("****   请按'0'可以退出游戏   ****\n");
    printf("*********************************\n");
}

void game()
{
    int ret = rand() % 100 + 1;
    int num = 0;
    int cnt = 10;
    int sum = cnt;
    while (cnt > 0)
    {
        printf("你还有%d次机会\n", cnt);
        printf("请输入一个1-100之间的数:");
        if (scanf("%d", &num) != 1 || num < 1 || num > 100)
        {
            printf("输入错误,请重新输入一个1-100之间的数\n");
            while (getchar() != '\n');
            continue;
        }
        if (num > ret)
        {
            printf("\n数字太大了!\n\n");
        }
        else if (num < ret)
        {
            printf("\n数字太小了!\n\n");
        }
        else
        {
            printf("\n恭喜你猜对了!\n\n");
            langman();
            printf("\n猜对用了%d次\n\n\n", sum - cnt + 1);
            return;
        }
        cnt--;
    }
    printf("你的机会用完了,游戏结束!\n");
    printf("正确的数字是%d\n\n\n", ret);
}

float f(float x, float y, float z) 
{
    float a = x * x + 9.0f / 4.0f * y * y + z * z - 1;
    return a * a * a - x * x * z * z * z - 9.0f / 80.0f * y * y * z * z * z;
}

float h(float x, float z) 
{
    for (float y = 1.0f; y >= 0.0f; y -= 0.001f)
        if (f(x, y, z) <= 0.0f)
            return y;
    return 0.0f;
}

void color() 
{
    system("color c");
}

void sentance() 
{
    char title1[] = "============ 2021 12 05 ============";
    char title2[] = "============ 2023 12 05 ============";          //输入标题
    char word[] = "====== 两周年快乐,我爱你宝贝!======";  //输入想说的文字
    printf("\n\t      ");                                         //调整格式
    printf("%s", title1);
    printf("\n\t      ");                                         //调整格式
    printf("%s", title2);
    printf("\n\t      ");
    printf("%s", word);
}

int langman() 
{
    HANDLE o = GetStdHandle(STD_OUTPUT_HANDLE);
    _TCHAR buffer[25][80] = { _T(' ') };
    _TCHAR ramp[] = _T(".:-=+*#%@");

    for (float t = 0.0f;; t += 0.1f) 
    {
        int sy = 0;
        float s = sinf(t);
        float a = s * s * s * s * 0.2f;
        for (float z = 1.3f; z > -1.2f; z -= 0.1f) 
        {
            _TCHAR* p = &buffer[sy++][0];
            float tz = z * (1.2f - a);
            for (float x = -1.5f; x < 1.5f; x += 0.05f) 
            {
                float tx = x * (1.2f + a);
                float v = f(tx, 0.0f, tz);
                if (v <= 0.0f) {
                    float y0 = h(tx, tz);
                    float ny = 0.01f;
                    float nx = h(tx + ny, tz) - y0;
                    float nz = h(tx, tz + ny) - y0;
                    float nd = 1.0f / sqrtf(nx * nx + ny * ny + nz * nz);
                    float d = (nx + ny - nz) * nd * 0.5f + 0.5f;
                    *p++ = ramp[(int)(d * 5.0f)];
                }
                else
                    *p++ = ' ';
            }
        }
        for (sy = 0; sy < 25; sy++) 
        {
            COORD coord = { 0, sy };
            SetConsoleCursorPosition(o, coord);
            WriteConsole(o, buffer[sy], 79, NULL, 0);

        }
        Sleep(33);
        color();
        sentance();
    }
}

int main()
{
    srand((unsigned int)time(NULL));
    int input = 0;
    do
    {
        menu();
        printf("请选择你需要的操作->");
        if (scanf("%d", &input) != 1 || (input != 0 && input != 1))
        {
            printf("输入错误,请重新输入!\n");
            while (getchar() != '\n');
            continue;
        }
        switch (input)
        {
        case 1:
            game();
            break;
        case 0:
            printf("退出游戏!\n");
            break;
        default:
            /*printf("输入错误,请重新输入!\n");*/
            break;
        }

    } while (input != 0);
    return 0;
}


        

        试运行之后我们发现有一个问题,就是猜出来数字之后,图像立马就出现了,没有惊喜感,那我们就再加一个定时器函数,让猜对了之后屏幕上暂停几秒,最好能在暂停的时候屏幕上出现一些文字提示,说干就干,代码如下:

void settime(int seconds)
{
    for (int i = seconds; i > 0; i--)
    {
        system("cls"); // 清空屏幕
        printf("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n");
        printf("\t\t\t\t\t\t\t%d\n\n\n\n\n\n\n\n\n", i); // 放大居中显示倒计时数字
        Sleep(1000); // 暂停1秒
    }
    system("cls"); // 清空屏幕

}

        这样屏幕上会短暂的出现自定义秒数的倒计时,如果你想添加别的文字也可以直接在函数中printf,接下哎代码基本上就大功告成了。

完整代码如下:

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include <math.h>
#include <windows.h>
#include <tchar.h>

void menu()
{
    printf("*********************************\n");
    printf("****   玩一个猜数字游戏吧!  ****\n");
    printf("****   规定步数内完成有惊喜  ****\n");
    printf("****   请按'1'可以开始游戏   ****\n");
    printf("****   请按'0'可以退出游戏   ****\n");
    printf("*********************************\n");
}

void settime(int seconds)
{
    for (int i = seconds; i > 0; i--)
    {
        system("cls"); // 清空屏幕
        printf("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n");
        printf("\t\t\t\t\t\t\t%d\n\n\n\n\n\n\n\n\n", i); // 放大居中显示倒计时数字
        Sleep(1000); // 暂停1秒
    }
    system("cls"); // 清空屏幕

}

void game()
{
    int ret = rand() % 100 + 1;
    int num = 0;
    int cnt = 10;
    int sum = cnt;
    while (cnt > 0)
    {
        printf("你还有%d次机会\n", cnt);
        printf("请输入一个1-100之间的数:");
        if (scanf("%d", &num) != 1 || num < 1 || num > 100)
        {
            printf("输入错误,请重新输入一个1-100之间的数\n");
            while (getchar() != '\n');
            continue;
        }
        if (num > ret)
        {
            printf("\n数字太大了!\n\n");
        }
        else if (num < ret)
        {
            printf("\n数字太小了!\n\n");
        }
        else
        {
            printf("\n恭喜你猜对了!\n\n");
            settime(3);
            langman();
            printf("\n猜对用了%d次\n\n\n", sum - cnt + 1);
            return;
        }
        cnt--;
    }
    printf("你的机会用完了,游戏结束!\n");
    printf("正确的数字是%d\n\n\n", ret);
}

float f(float x, float y, float z) 
{
    float a = x * x + 9.0f / 4.0f * y * y + z * z - 1;
    return a * a * a - x * x * z * z * z - 9.0f / 80.0f * y * y * z * z * z;
}

float h(float x, float z) 
{
    for (float y = 1.0f; y >= 0.0f; y -= 0.001f)
        if (f(x, y, z) <= 0.0f)
            return y;
    return 0.0f;
}

void color() 
{
    system("color c");
}

void sentance() 
{
    char title1[] = "============ 2021 12 05 ============";
    char title2[] = "============ 2023 12 05 ============";          //输入标题
    char word[] = "====== 两周年快乐,我爱你宝贝!======";  //输入想说的文字
    printf("\n\t      ");                                         //调整格式
    printf("%s", title1);
    printf("\n\t      ");                                         //调整格式
    printf("%s", title2);
    printf("\n\t      ");
    printf("%s", word);
}

int langman() 
{
    HANDLE o = GetStdHandle(STD_OUTPUT_HANDLE);
    _TCHAR buffer[25][80] = { _T(' ') };
    _TCHAR ramp[] = _T(".:-=+*#%@");

    for (float t = 0.0f;; t += 0.1f) 
    {
        int sy = 0;
        float s = sinf(t);
        float a = s * s * s * s * 0.2f;
        for (float z = 1.3f; z > -1.2f; z -= 0.1f) 
        {
            _TCHAR* p = &buffer[sy++][0];
            float tz = z * (1.2f - a);
            for (float x = -1.5f; x < 1.5f; x += 0.05f) 
            {
                float tx = x * (1.2f + a);
                float v = f(tx, 0.0f, tz);
                if (v <= 0.0f) {
                    float y0 = h(tx, tz);
                    float ny = 0.01f;
                    float nx = h(tx + ny, tz) - y0;
                    float nz = h(tx, tz + ny) - y0;
                    float nd = 1.0f / sqrtf(nx * nx + ny * ny + nz * nz);
                    float d = (nx + ny - nz) * nd * 0.5f + 0.5f;
                    *p++ = ramp[(int)(d * 5.0f)];
                }
                else
                    *p++ = ' ';
            }
        }
        for (sy = 0; sy < 25; sy++) 
        {
            COORD coord = { 0, sy };
            SetConsoleCursorPosition(o, coord);
            WriteConsole(o, buffer[sy], 79, NULL, 0);

        }
        Sleep(33);
        color();
        sentance();
    }
}

int main()
{
    srand((unsigned int)time(NULL));
    int input = 0;
    do
    {
        menu();
        printf("请选择你需要的操作->");
        if (scanf("%d", &input) != 1 || (input != 0 && input != 1))
        {
            printf("输入错误,请重新输入!\n");
            while (getchar() != '\n');
            continue;
        }
        switch (input)
        {
        case 1:
            game();
            break;
        case 0:
            printf("退出游戏!\n");
            break;
        default:
            /*printf("输入错误,请重新输入!\n");*/
            break;
        }

    } while (input != 0);
    return 0;
}

运行兄弟们自己试试,绝对惊喜!!!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Unity Meta Quest 一体机开发(八):【手势追踪】实现 Hand Grab 扔物体功能

文章目录 &#x1f4d5;教程说明&#x1f4d5;设置刚体和碰撞体&#x1f4d5;给物体添加 Physics Grabbable 脚本&#x1f4d5;给手部添加 Hand Velocity Calculator 物体 此教程相关的详细教案&#xff0c;文档&#xff0c;思维导图和工程文件会放入 Spatial XR 社区。这是一…

基于springboot 学生学情预警系统-计算机毕设 附源码57567

springboot 学生学情预警系统 摘 要 科技进步的飞速发展引起人们日常生活的巨大变化&#xff0c;电子信息技术的飞速发展使得电子信息技术的各个领域的应用水平得到普及和应用。信息时代的到来已成为不可阻挡的时尚潮流&#xff0c;人类发展的历史正进入一个新时代。在现实运…

Xshell全局去除提示音

使用Xshell的时候经常会按TAB或者一些操作指令的时候的时候听到提示音&#xff0c;非常的烦 通常来说在Xshell中可以单独修改每一个会话的属性&#xff0c;将提示音关闭&#xff0c;但是新增的会话依然带有提示音&#xff0c;还得一个个的关闭&#xff0c;非常麻烦&#xff0c;…

NAND Flash和NOR Flash的异同

NAND Flash和NOR Flash是两种常见的闪存类型。 NOR Flash是Intel于1988年首先开发出来的存储技术&#xff0c;改变了原先由EPROM和EEPROM一统天下的局面。 NAND Flash是东芝公司于1989年发布的存储结构&#xff0c;强调降低每比特的成本&#xff0c;更高的性能&#xff0c;并…

ESP32-Web-Server编程综合项目1-结合 Web Server 实现 WiFi 配网和网页 OTA 更新

ESP32-Web-Server编程综合项目1-结合 Web Server 实现 WiFi 配网和网页 OTA 更新 概述 前述的内容多是一个个小功能的演示&#xff0c;本章节讲述一些实际项目中使用到的综合项目。 首先要讲述的案例是通过ESP32 上的 Web Server 实现对 ESP32 的 WiFi 配网和网页 OTA 更新功…

4R技术(AR、VR、MR、XR)傻傻分不清,看完这篇你就懂了!

在数字化革命的浪潮下&#xff0c;涌现了许多VR、AR和MR产品&#xff0c;尽管大家对VR比较熟悉&#xff0c;但对AR、MR和XR的了解相对较少&#xff0c;这几者同时存在会更令人困惑。下面我们就来了解一下这4种技术的区别。先用一张图来区分它们的区别&#xff1a; 1.虚拟现实技…

inux基础项目开发1:量产工具——业务系统(七)

前言&#xff1a; 前面我们已经构造出来显示系统、输入系统、文字系统、UI系统、页面系统&#xff0c;这个项目百分之八十需要实现的都已经构建出来了&#xff0c;最后让我们对这个项目进行最后一项系统的搭建&#xff0c;也就是业务系统&#xff0c;说到业务大家应该就知道我们…

Python安装步骤介绍

本文将介绍Python安装的详细步骤如下&#xff1a; 下载 python安装 python配置环境变量&#xff08;安装时勾选配置环境变量的则无需此步骤&#xff09; 一、python下载 官网&#xff1a;Download Python | Python.org 根据电脑位数下载所需的版本 二、Python安装 1.打开安…

31-WEB漏洞-文件操作之文件包含漏洞全解

31-WEB漏洞-文件操作之文件包含漏洞全解 一、本地包含1.1、无限制包含漏洞文件1.2、有限制包含漏洞文件1.2.1、绕过方法1.2.1.1、%00截断1.2.1.2、长度截断 二、远程包含2.1、无限制包含漏洞文件2.2、有限制包含漏洞文件 三、各种协议流提交流3.1、各协议的利用条件和方法3.1.1…

mysql的几种索引

mysql可以在表的一列、或者多列上创建索引&#xff0c;索引的类型可以选择&#xff0c;如下&#xff1a; 普通索引&#xff08;KEY&#xff09; 普通索引可以提高查询效率。在表的一列、或者多列上创建索引。 每个表可以创建多个普通索引。 例如&#xff0c;下面示例&#…

计算机网络TCP篇②

一、TCP 重传、滑动窗口、流量控制、拥塞控制 1.1、重传机制 在 TCP 中&#xff0c;当发送端的数据达到接受主机时&#xff0c;接收端主机会返回一个确认应答消息&#xff0c;表示已收到消息。但是在复杂的网络中&#xff0c;并一定能顺利正常的进行数据传输&#xff0c;&…

固态硬盘与机械硬盘的区别

盘、磁道、扇区、柱面&#xff0c;这些都是机械硬盘的概念&#xff0c;固态硬盘没有这些东西&#xff0c;固态硬盘和机械硬盘虽然都叫硬盘&#xff0c;但是在原理层面有着本质上的区别。 速印机&#xff08;理想、荣大等&#xff09;、复印机&#xff08;夏普、东芝、理光、佳能…

51爱心流水灯32灯炫酷代码

源代码摘自远眺883的文章&#xff0c;大佬是30个灯的&#xff0c;感兴趣的铁汁们可以去看看哦~&#xff08;已取得原作者的许可&#xff09;&#xff1a;基于STC89C51单片机设计的心形流水灯软件代码部分_单片机流水灯代码_远眺883的博客-CSDN博客 由于博主是个小菜鸡&#xff…

perl脚本批量处理代码中的中文注释乱码的问题

代码中统一使用utf-8编码是最好的&#xff0c;但是有一些多人合作的项目或者一些历史遗留代码&#xff0c;常见一些中文注释乱码的问题。这里以一个开源项目evpp为例子 evpp。以项目中的一个commit id为例&#xff1a; 477033f938fd47dfecde43c82257cd286d9fa38e &#xff0c; …

种群和种群之间连接的设计

我们知道神经元的创建方式是以种群为基础的&#xff0c;一个种群内的所有神经元的参数都一样&#xff0c;而种群与种群之间的连接也是随机概率的。所以我们首先应该设计一个Population的结构&#xff0c;考虑其需要的元素有神经元gid集合和种群好&#xff0c;所设计数据结构如下…

Python必备工具shelve与dbm全面解析!

更多资料获取 &#x1f4da; 个人网站&#xff1a;ipengtao.com 当涉及存储大量数据并且需要高效访问时&#xff0c;Python开发人员常常寻找适当的工具。shelve和dbm模块是Python中用于本地持久化存储数据的两个强大工具。它们允许开发人员以键值对的形式存储数据&#xff0c;…

【开源】基于JAVA的医院门诊预约挂号系统

项目编号&#xff1a; S 033 &#xff0c;文末获取源码。 \color{red}{项目编号&#xff1a;S033&#xff0c;文末获取源码。} 项目编号&#xff1a;S033&#xff0c;文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 功能性需求2.1.1 数据中心模块2.1.2…

Web前端JS如何控制 Video/Audio 视音频声道(左右声道|多声道)、视音频轨道、音频流数据

写在前面&#xff1a; 接上篇博文&#xff1a;Web前端JS如何获取 Video/Audio 视音频声道(左右声道|多声道)、视音频轨道、音频流数据 讲解了如何根据视频链接地址&#xff0c;实现在播放时实时的显示该视频的音频轨道情况&#xff0c;并实时的将各音频轨道数据以可视化&#x…

使用OpenMVS重建模型

1、数据格式转换 首先将生成的稠密点云以及图片信息转换成openmvs支持的.mvs文件。在openmvs_sample中的bin文件内打开终端 作者&#xff1a;舞曲的小水瓶 https://www.bilibili.com/read/cv25019877/ 出处&#xff1a;bilibili interfaceCOLMAP.exe -i D:\desktop\test\toy\…

28.线段树与树状数组基础

一、线段树 1.区间问题 线段树是一种在算法竞赛中常用来维护区间的数据结构。它思想非常简单&#xff0c;就是借助二叉树的结构进行分治&#xff0c;但它的功能却非常强大&#xff0c;因此在很多类型的题目中都有它的变种&#xff0c;很多题目都需要以线段树为基础进行发展。…