C语言趣味小游戏开发《找方块》!测试你眼力见的时候到了~

2023-05-16

程序介绍

该程序是仿照最近网上流行的找方块游戏编写的,虽然没有仿照的一模一样,但是也实现了他的一些功能。个人觉得可玩性还是挺高的,是一个不错的娱乐放松的游戏。

编写简介

该游戏的编写还是挺容易的,可以大致分为三步。

第一步,生成一个界面。

第二步,使用鼠标获取不同颜色的方块。

第三步,刷新屏幕。需要注意的地方就是其中的细节与动态效果,都是些高中物理知识。

截图

源码

///
// 程序名称:找方块
// 编译环境:Visual Studio 2013, EasyX
//

#include<graphics.h>
#include<conio.h>
#include<stdio.h>
#include<time.h>

struct POS                                // 一个点的结构体
{
    int x;
    int y;
    COLORREF color;
};

void Interface(int Level, int Mark);    // 绘制界面 Level 为关卡数,Mark 为分数
POS InitColor(int Grade);                // 初始化颜色和方块的位置 Grade 难度等级 返回坐标
int GetNum(int Mark);                    // 判断一个数字是几位数
void GameOver();                        // 游戏结束
void AddMark(POS pos, int addMark);        // 加分显示以及方块与分数的平移
void ShowIips();                        // 显示提示

int main()
{
    initgraph(800, 600);
    int Level = 1;
    int Mark = 0;
    while (true)
    {
        int BeginTime = clock();
        int GameState = 0;    // 游戏状态

        Interface(Level, Mark);
        POS pos = InitColor(Level / 10);
        MOUSEMSG m;    
        while (true)
        {
            m = GetMouseMsg();
            switch (m.uMsg)
            {
            case WM_LBUTTONDOWN:
                if (pos.x - 35 < m.x && pos.x + 35 > m.x && pos.y - 35 < m.y && pos.y + 35 > m.y)
                {
                    GameState = 1;
                }
                else
                {
                    setlinecolor(WHITE);
                    setlinestyle(PS_SOLID | PS_ENDCAP_SQUARE, 4);
                    line(m.x - 10, m.y - 10, m.x + 10, m.y + 10);
                    line(m.x + 10, m.y - 10, m.x - 10, m.y + 10);
                    if (GameState == 2)
                    {
                        GameState = 3;
                    }
                    else
                    {
                        GameState = 2;
                    }
                }
                break;
            }
            if (GameState == 1)
            {
                int EndTime = clock();
                int Times = EndTime - BeginTime;
                int addMark = (int)(80000.0 / Times);
                AddMark(pos, addMark);
                Mark += addMark;
                Level++;
                break;
            }
            if (GameState == 2)
            {
                continue;
            }
            if (GameState == 3)
            {
                GameOver();
                Level = 1;
                Mark = 0;
                break;
            }
        }
    }
    _getch();
    return 0;
}

void Interface(int Level, int Mark)
{
    setfillcolor(BLACK);
    bar(0, 0, 800, 50);
    bar(0, 550, 800, 750);
    settextcolor(WHITE);
    settextstyle(30, 0, L"微软雅黑");
    TCHAR str[25];
    _stprintf_s(str, _T("第 %d 关"), Level);
    outtextxy(50, 10, str);
    _stprintf_s(str, _T("%d"), Mark);
    outtextxy(750 - GetNum(Mark) * 15, 10, str);
}

POS InitColor(int Grade)
{
    srand((unsigned int)time(NULL));
    float H = (float)(rand() % 360);            // 色相
    float S = (rand() % 100) / 100.f;            // 饱和度
    float L = (rand() % 70 + 30) / 100.f;        // 亮度
    double h = 0;                                // 高度
    double v = 0;                                // 速度(方向向下)
    double dv = 9.8 / 50;                        // 加速度(每 1/50 秒)
    BeginBatchDraw();
    int x1, y1, x2, y2;
    x1 = 800;
    y1 = 50;
    x2 = 1600;
    y2 = 550;
    while (true)
    {
        v += dv;                                // 根据加速度计算速度
        h -= (v - dv / 2);                        // 计算高度
        x1 = x1 + (int)h;
        x2 = x2 + (int)h;
        setfillcolor(HSVtoRGB(H, S, L));
        bar(x1, y1, x2, y2);
        ShowIips();
        FlushBatchDraw();
        Sleep(20);
        if (x1 <= 0)
        {
            break;
        }
    }
    EndBatchDraw();

    POS pos;
    pos.x = rand() % 730 + 35;
    pos.y = rand() % 430 + 85;
    pos.color = HSVtoRGB(H, S, L);

    if (Grade == 0)
    {
        setfillcolor(HSVtoRGB(H, S, (L - 0.1f) < 0 ? L = L + 0.1f : L = L - 0.1f));
    }
    if (Grade == 1)
    {
        setfillcolor(HSVtoRGB(H, (S - 0.1f) < 0 ? S = S + 0.1f : S = S - 0.1f, L));
    }
    if (Grade >= 2)
    {
        setfillcolor(HSVtoRGB((H - 20) < 0 ? H = H + 20 : H = H - 20, S, L));
    }

    bar(pos.x - 35, pos.y - 35, pos.x + 35, pos.y + 35);
    ShowIips();
    return pos;
}

int GetNum(int Mark)
{
    int sum = 0;
    while (Mark)
    {
        sum++;
        Mark /= 10;
    }
    return sum == 0 ? sum = 1 : sum;
}

void GameOver()
{
    settextstyle(60, 0, L"微软雅黑");
    RECT r = { 0, 0, 800, 600 };
    settextcolor(WHITE);
    drawtext(_T("游戏结束"), &r, DT_CENTER | DT_VCENTER | DT_SINGLELINE);
    Sleep(1000);
}

void AddMark(POS pos, int addMark)
{
    setfillcolor(WHITE);
    bar(pos.x - 35, pos.y - 35, pos.x + 35, pos.y + 35);
    setbkmode(TRANSPARENT);
    settextstyle(30, 0, L"微软雅黑");
    settextcolor(WHITE);
    TCHAR str[25];
    _stprintf_s(str, _T("+%d"), addMark);
    POS textpos;
    textpos.x = pos.x - 20;
    textpos.y = pos.y - 35 - 30;
    textpos.color = WHITE;
    outtextxy(textpos.x, textpos.y, str);

    double k = textpos.y / (textpos.x - 700.0);
    double b = (700 * textpos.y) / (textpos.x - 700.0);

    double h = 0;                            // 高度
    double v = 0;                            // 速度(方向向下)
    double dv = 9.8 / 50;                    // 加速度(每 1/50 秒)
    BeginBatchDraw();
    while (true)
    {
        v += dv;                            // 根据加速度计算速度
        h -= (v - dv / 2);                    // 计算高度
        pos.y = pos.y - (int)h;
        setfillcolor(WHITE);
        settextcolor(WHITE);
        bar(pos.x - 35, pos.y - 35, pos.x + 35, pos.y + 35);
        textpos.x = textpos.x - (int)h;
        textpos.y = (int)(k*textpos.x - b);
        outtextxy(textpos.x, textpos.y, str);
        FlushBatchDraw();
        Sleep(20);
        setfillcolor(pos.color);
        settextcolor(pos.color);
        outtextxy(textpos.x, textpos.y, str);
        bar(pos.x - 35, pos.y - 35, pos.x + 35, pos.y + 35);
        if (pos.y > 600 && textpos.x > 700)
        {
            break;
        }
    }
    EndBatchDraw();
}

void ShowIips()
{
    setbkmode(TRANSPARENT);
    settextstyle(30, 0, L"微软雅黑");
    RECT r = { 0, 50, 800, 100 };
    settextcolor(RGB(252, 203, 147));
    drawtext(_T("找出颜色不一样的小方块"), &r, DT_CENTER | DT_VCENTER | DT_SINGLELINE);
}

PS

非常有趣的一个小游戏,有点基础的小伙伴可以自己尝试着理解一下,再加入自己的元素应该会更有趣。

(记得去官网下载EasyX图形库哦)

喜欢这篇文章的观众老爷们可以点点关注,点点赞,嘻嘻~

点击下方编程公社领取免费福利!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C语言趣味小游戏开发《找方块》!测试你眼力见的时候到了~ 的相关文章

  • 基于51单片机的12864液晶时钟C语言程序

    自己写的12864液晶时钟程序 xff0c 经过验证可以使用 xff0c 希望可以为初学者作为参考 include lt reg52 h gt include lt math h gt define uint unsigned int de
  • 耗时两个月开发的弯管机三维模型自动转档软件

    一 系统简介 SmartPipe软件根据用户提供的三维实体管子数据 xff08 stp iges brep文件 xff09 xff0c 通过全自动方式 xff0c 提取管子的轴线数据及几何特征信息 xff0c 生成弯管编程所需的xyz数据以
  • 软件评测-软件测试与软件质量

    软件测试与软件质量 软件测试 xff1a 经典的定义是在规定条件下对程序进行操作 xff0c 以发现错误 xff0c 对软件质量进行评估 因为软件是由文档 数据 及程序组成 xff0c 所以软件测试应该是对软件形成过程的文档 数据以及程序进
  • sobol敏感性分析 matlab代码

    sobol 参数敏感性分析 参考 xff1a csdn https blog csdn net xiaosebi1111 article details 46517409 wiki xff1a https en wikipedia org
  • 软件质量的8个特性

    功能性 功能完备性 功能正确性 功能适用性 性能效率 时间特性 资源利用率 容量 兼容性 共存性 互操作性 易用性 可辨识性 易学性 易操作性 用户差错 防止性 用户界面 舒适性 易访问性 可靠性 成熟性 可用性 容错性 可恢复性 信息安全
  • Bad configuration option: \302\240

    ssh 配置文件时奇奇怪怪的错 xff0c 我碰到的是 xff1a Bad configuration option 302 240 一直不清楚后面这个 302 240 是啥意思 xff0c 后来参考这个回答 xff1a https sta
  • CentsOS系统卡值mysql查询慢

    第一步查看系统是什么占资源 htop F1 h 查看htop使用说明 xff0c F2 s 设置选项 F3 搜索进程 F4 过滤器 xff0c 输入关键字搜索 F5 t 显示属性结构 F6 lt gt 选择排序方式 F7 减少进程的优先级
  • 精美多功能翻页时钟源码 灵感来源于fliqlo

    介绍 xff1a 一个翻页时钟的网页 xff0c 灵感来源于fliqlo 外表相似 xff0c 功能不同 功能 xff1a 看时间看秒表倒计时 说明 xff1a F11 全屏 ctrl 43 43 或 调整设置框大小 单击 或 空格 可以暂
  • vscode 报错ERROR: Unable to start debugging. Unexpected GDB output from command “-exec-run“

    1 报错信息 Unable to start debugging xff0c 如下截图所示 网上找了很多资料 xff0c 发现大部分解释都说是 xff0c 库的问题 xff0c 拷贝libstdc 43 43 6 dll 文件后 xff0c
  • 关于Ip首部最大长度(60)和最小长度(20)的计算

    第一次写博客 xff0c 可能语言组织的不是特别好 xff0c 因为是个人理解 xff0c 有不正确的地方清指出 关于ip首部长度最大值5字节和60字节的计算 首先声明几个单位 ip数据报中的单位是 位 xff08 代表 32bit xff
  • Dev-C++ 5.11 调试程序 查找程序错误

    相信大家看到我这篇博客的时候还不怎么会用dev c 43 43 调试程序吧 xff0c 那么我就给大家详解一下 xff08 切记 xff1a 要调试的程序一定要能够通过编译 xff0c 一定要通过 xff0c 一定要通过 xff0c 一定要
  • NVM安装与使用

    NVM安装与使用 介绍 nvm是nodejs的版本管理工具 xff0c 可以安装和切换不同的版本nodejs npm是依赖包的管理工具 1 下载NVM GITHUB https github com coreybutler nvm wind
  • maven

    http mvnrepository com 打开网面 xff0c 搜索要查询的jar包名 xff0c 直接复制配制文件到你自己的pom xml中即可 xff0c 如 xff1a lt dependency gt lt groupId gt
  • 密集脚集成块的手工焊接方法

    电子爱好者在进行电子设计制作时 xff0c 最头痛的是焊接密集脚贴片集成块 如 VS1003的焊接 xff0c 往往感到无从下手 下面根据我设计制作时的经验 xff0c 将具体的手工操作方法介绍给大家 xff0c 希望能助你一臂之力 所需辅
  • python批量新建文件、批量保存图片、批量创建文件夹

    python批量新建文件 批量保存图片 批量创建文件夹 新建文件 xff1a 假设我要新建10个txt文件 for i in range 10 这里的 指代的是当前文件夹 i表示文件的名称 f 61 open 39 s 39 i 43 39
  • 操作系统——实验一.进程管理

    include 34 conio h 34 include 34 stdio h 34 include 34 stdlib h 34 struct jincheng type int pid int youxian int daxiao i
  • 计算机中堆栈的概念

    这两天学习win32的API xff0c 了解到了计算机中堆栈的概念 xff0c 相信很多程序员有时候也弄不明白计算机中的堆栈的数据结构 再次为堆栈做一下详细解析 在英文中 xff0c 我们管栈称为stack xff0c 管堆称为heap
  • 使用sqlite3_exec回掉函数输出查询内容

    include lt stdlib h gt include lt stdio h gt include lt sqlite3 h gt int my callback void param int f num char f value c
  • 网络数据传输的三种校验方法

    一 奇偶校验 根据被传输的一组二进制代码的数位中 1 的个数是奇数或偶数来进行校验 采用奇数的称为奇校验 xff0c 反之 xff0c 称为偶校验 采用何种校验是事先规定好的 通常专门设置一个奇偶校验位 xff0c 用它使这组代码中 1 的

随机推荐