qq_64054038 2022-01-30 00:31 采纳率: 100%
浏览 80
已结题

请大家看下这是什么问题 C语言烟花的程序

我自己看视频写C语言烟花程序,最后显示的烟花绽放不知道哪错了,是一排一排的,看了下别人的程序也没发现问题在哪

请各位帮忙解答下,这是哪出错了,用的vs2022。

#include <stdio.h>
#include <graphics.h>
#include <math.h>
#include <stdlib.h>
#include <time.h>
#include <mmstream.h>
#pragma comment(lib,"winmm.lib")

#define pi 3.14159265

struct jet
{
    int x, y;
    int hx, hy;
    int h;
    bool shoot;

    DWORD t1, t2, dt;
    IMAGE img[2];
    byte n : 1;

}jet[13];

struct fire
{
    int r;
    int maxr;
    int x;
    int y;
    int zx, zy;
    int kuan;
    int h;
    int xy[240][240];

    bool show;
    bool draw;
    DWORD t1, t2, dt;
}fire[13];

void welcome()
{
    settextcolor(YELLOW);

    int i, x, y;
    for (i = 0; i < 45; i++)
    {
        cleardevice();
        x = 600 + (300 * sin(pi * 2 * i / 60));
        y = 375 + (300 * cos(pi * 2 * i / 60));
        settextstyle(i, 0, L"楷体");
        outtextxy(x, y, L"新年快乐");
        outtextxy(x + 50, y + 50, L"祝亲爱的楠笨猪新的一年天天开心");
        Sleep(50);
    }

    getchar();
    cleardevice();
    settextstyle(30, 0, L"楷体");
    outtextxy(300, 200, L"2022新的起点");
    outtextxy(300, 230, L"新的一年让我们共同进步");
    outtextxy(300, 260, L"下面请观看烟花表演");
    outtextxy(500, 290, L"——爱你的蒋大哥");

    getchar();
    //cleardevice();
}

void show(DWORD* p);
void yinyue();

void init(int i);

void tupian();

void choicejet(DWORD& t1);

void shoot();

int main()
{
    initgraph(1100, 750);
    yinyue();
    srand((unsigned int)time(NULL));
    welcome();
    DWORD t1 = timeGetTime();
    DWORD* pm = GetImageBuffer();
    
    for (int i = 0; i < 13; i++)
    {
        init(i);
    }

    tupian();
    BeginBatchDraw();
    while (1)
    {
        for (int i = 0; i < 1100; i++)
        {
            for (int clr = 0; clr < 100; clr++)
            {
                int px1 = rand() % 1100;
                int py1 = rand() % 750;

                if (py1 < 749)
                {
                    pm[py1 * 1100 + px1] = pm[py1 * 1100 + px1 + 1] = BLACK;
                }
            }
        }
        choicejet(t1);
        shoot();
        show(pm);
        FlushBatchDraw();
    }
    return 0;
}

void yinyue()
{
    mciSendString(TEXT("open ./yinyue/你是对的人.mp3 alias music"), 0, 0, 0);
    mciSendString(L"play music", 0, 0, 0);
}

void init(int i)
{
    //烟花弹
    jet[i].x = 0;
    jet[i].y = 0;
    jet[i].hx = 0;
    jet[i].hy = 0;
    jet[i].h = 0;
    jet[i].shoot = false;
    jet[i].n = 0;
    jet[i].t1 = timeGetTime();
    jet[i].dt = rand() % 10;
    jet[i].x = 0;

    //烟花
    //fire[i].x = 0;
    //fire[i].y = 0;
    fire[i].kuan = 240;
    fire[i].h = 240;
    fire[i].maxr = rand() % 50 + 100;
    fire[i].zx = rand() % 30 + 80;
    fire[i].zy = rand() % 30 + 80;
    fire[i].r = 0;
    fire[i].t1 = timeGetTime();
    fire[i].dt = 5;
    fire[i].show = false;
    fire[i].draw = false;

    


}

void tupian()
{
    IMAGE jetimg;
    loadimage(&jetimg, L"./yinyue/烟花弹.jpg", 200, 50);

    SetWorkingImage(&jetimg);

    for (int i = 0; i < 13; i++)
    {
        int n = rand() % 5;
        getimage(&jet[i].img[0], n * 20, 0, 20, 50);
        getimage(&jet[i].img[1], (n + 5) * 20, 0, 20, 50);

    }
    SetWorkingImage(NULL);

    //******//
    IMAGE fimg, gimg;
    loadimage(&fimg, L"./yinyue/烟花.jpg", 3120, 240);

    for (int i = 0; i < 13; i++)
    {
        SetWorkingImage(&fimg);
        getimage(&gimg, i * 240, 0, 240, 240);
        SetWorkingImage(&gimg);
        for (int a = 0; a < 240; a++)
        {
            for (int b = 0; b < 240; b++)
            {
                fire[i].xy[a][b] = getpixel(a,b);
            }
        }
    }
    SetWorkingImage(NULL);
    //******//

}

void choicejet(DWORD& t1)
{
    DWORD t2 = timeGetTime();
    if (t2 - t1 > 100)
    {
        int n = rand() % 13;
        if (fire[n].show == false && jet[n].shoot == false)
        {
            //重置烟花弹数据
            jet[n].x = rand() % 1100;
            jet[n].y = rand() % 100 + 600;
            jet[n].hx = jet[n].x;
            jet[n].hy = rand() % 350;
            jet[n].h = jet[n].hy - jet[n].y;
            jet[n].shoot = true;
            putimage(jet[n].x, jet[n].y, &jet[n].img[jet[n].n], SRCINVERT);
        }
        t1 = t2;
    }
}

void shoot()
{
    for (int i = 0; i < 13; i++)
    {
        jet[i].t2 = timeGetTime();
        if (jet[i].t2 - jet[i].t1 > jet[i].dt && jet[i].shoot == true)
        {
            putimage(jet[i].x, jet[i].y, &jet[i].img[jet[i].n], SRCINVERT);

            if (jet[i].y >= jet[i].hy)
            {
                jet[i].y -= 5;
                jet[i].n++;

            }
            putimage(jet[i].x, jet[i].y, &jet[i].img[jet[i].n], SRCINVERT);

            if (jet[i].y <= jet[i].hy)
            {
                putimage(jet[i].x, jet[i].y, &jet[i].img[jet[i].n], SRCINVERT);
                jet[i].shoot = false;
                fire[i].x = jet[i].hx;
                fire[i].y = jet[i].hy;
                fire[i].show = true;
            }


        }
        jet[i].t1 = jet[i].t2;
    }
}

void show(DWORD* pm)
{
    int drt[16] = { 5,5,5,5,5,6,15,15,15,25,25,25,55,55,55,65 };
    for (int i = 0; i < 13; i++)
    {
        fire[i].t2 = timeGetTime();
        if (fire[i].t2 - fire[i].t1 >= fire[i].dt && fire[i].show == true)
        {
            if (fire[i].r < fire[i].maxr)
            {
                fire[i].r++;
                fire[i].dt = drt[fire[i].r / 10];
                fire[i].draw = true;
            }

            if (fire[i].r >= fire[i].maxr - 1)
            {
                fire[i].draw = false;
                init(i);
            }
            fire[i].t1 = fire[i].t2;
        }
        if (fire[i].draw)
        {
            for (double a = 0; a <= 6.28; a += 0.01)
            {
                int x1 = (int)(fire[i].zx + fire[i].r * cos(a));
                int y1 = (int)(fire[i].zy - fire[i].r * sin(a));

                if (x1 > 0 && x1 < fire[i].kuan && y1>0 && y1 < fire[i].h)
                {

                    int b = fire[i].xy[x1][y1] & 0xff;
                    int g = (fire[i].xy[x1][y1] >> 8) & 0xff;
                    int r = (fire[i].xy[x1][y1] >> 16);

                    int xx = (int)(fire[i].x + fire[i].r * cos(a));
                    int yy = (int)(fire[i].y - fire[i].r * sin(a));

                    if (r > 0x20 && g > 0x20 && b > 0x20 && xx > 0 && xx < 1100 && yy>0 && yy < 750)
                    {
                        pm[yy * 1200 + xx] = BGR(fire[i].xy[x1][y1]);
                    }
                    fire[i].draw = false;
                }
            }


        }
    }

}

  • 写回答

2条回答 默认 最新

  • CSDN专家-link 2022-01-30 01:13
    关注

    正确的应该啥样啊?代码看一下

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 2月7日
  • 已采纳回答 1月30日
  • 修改了问题 1月30日
  • 修改了问题 1月30日
  • 展开全部

悬赏问题

  • ¥15 2024-五一综合模拟赛
  • ¥15 下图接收小电路,谁知道原理
  • ¥15 装 pytorch 的时候出了好多问题,遇到这种情况怎么处理?
  • ¥20 IOS游览器某宝手机网页版自动立即购买JavaScript脚本
  • ¥15 手机接入宽带网线,如何释放宽带全部速度
  • ¥30 关于#r语言#的问题:如何对R语言中mfgarch包中构建的garch-midas模型进行样本内长期波动率预测和样本外长期波动率预测
  • ¥15 ETLCloud 处理json多层级问题
  • ¥15 matlab中使用gurobi时报错
  • ¥15 这个主板怎么能扩出一两个sata口
  • ¥15 不是,这到底错哪儿了😭