c语言动画程序源码
- 格式:doc
- 大小:39.50 KB
- 文档页数:6
c语言玫瑰花的编程源代码玫瑰花源代码是一个经典的程序,它模拟了一朵玫瑰花的生长过程。
这个程序可以用来学习C语言中的图形绘制技术,而且在编程学习的过程中也很有趣。
首先我们来看看玫瑰花程序的源代码:```include <graphics.h>int main() {int gd=DETECT, gm;initgraph(&gd, &gm, "");setcolor(RED);int x,y;for(int i=0;i<800;++i){x=i*cos(i);y=i*sin(i);putpixel(x+300,y+300,RED);putpixel(y+300,x+300,RED);putpixel(-x+300,-y+300,RED);putpixel(-y+300,-x+300,RED);putpixel(-y+300,x+300,RED);putpixel(-x+300,y+300,RED);putpixel(x+300,-y+300,RED);putpixel(y+300,-x+300,RED);delay(1);}getch();closegraph();return 0;}```在这个程序中,我们使用了C语言中的图形绘制库graphics.h,来实现绘制图形的功能。
程序的入口函数为main()函数,其中包含了一些初始化代码,如initgraph()函数用来初始化系统的图形模式等。
在这个例子中,我们使用了DETECT作为gd的值,这种方式可以自动检测当前计算机的图形模式。
在程序中,我们使用了for循环来绘制玫瑰花的形状。
具体实现方式是通过计算得出每个点的坐标,然后设置它们的颜色为红色,并使用putpixel()函数来绘制出这个点。
最后,程序调用了getch()函数等待用户按键,然后通过closegraph()函数来关闭图形窗口。
这个程序虽然只是绘制了一朵玫瑰花,但它的编程技巧和实现方式可以帮助我们更好地理解计算机图形学的基本概念和算法。
"魂斗罗"(Contra)是一款经典的横版射击游戏,由Konami公司开发。
编写一个完整的魂斗罗游戏是一个复杂的过程,涉及图形渲染、物理模拟、碰撞检测、音效处理等多个方面。
通常,这样的游戏会使用专业的游戏引擎或者特定的框架来开发,而不是直接用C语言从头开始。
c#include<stdio.h>#include<stdbool.h>// 定义玩家和敌人的结构体typedef struct {int x;int y;bool isAlive;} Player;typedef struct {int x;int y;bool isAlive;int speed; // 敌人的移动速度} Enemy;// 定义游戏的常量const int SCREEN_WIDTH = 800;const int SCREEN_HEIGHT = 600;const int PLAYER_SPEED = 5;const int BULLET_SPEED = 10;const int ENEMY_SPEED = 3;// 初始化玩家和敌人Player player = {SCREEN_WIDTH / 2, SCREEN_HEIGHT - 50, true};Enemy enemy = {SCREEN_WIDTH, SCREEN_HEIGHT / 2, true, ENEMY_SPEED};// 游戏主循环void gameLoop() {while (player.isAlive && enemy.isAlive) {// 处理玩家输入char input;printf("Move player (w/a/s/d): ");scanf(" %c", &input);switch (input) {case'w':if (player.y > 0) {player.y -= PLAYER_SPEED;}break;case'a':if (player.x > 0) {player.x -= PLAYER_SPEED;}break;case's':if (player.y < SCREEN_HEIGHT - 50) {player.y += PLAYER_SPEED;}break;case'd':if (player.x < SCREEN_WIDTH - 50) {player.x += PLAYER_SPEED;}break;}// 移动敌人enemy.x -= enemy.speed;// 检查碰撞if (player.x < enemy.x + 50 && player.x + 50 > enemy.x && player.y < enemy.y + 50 && player.y + 50 > enemy.y) {player.isAlive = false;printf("Game Over!\n");}// 打印游戏状态(仅用于演示)printf("Player position: (%d, %d)\n", player.x, player.y);printf("Enemy position: (%d, %d)\n", enemy.x, enemy.y);}}int main() {printf("Welcome to Contra Demo!\n");gameLoop();return0;}这。
CRC16校验C语言程序源码(附完整的可执行的C语言代码)//CRC16校验在通讯中应用广泛,这里不对其理论进行讨论,只对常见的2种//实现方法进行测试。
方法一:查表法(256长度的校验表)速度快,准确,但是对于单片机设备存储占用大,且校验表长度大,输入时容易出现错误。
// ---------------- POPULAR POLYNOMIALS ----------------// CCITT: x^16 + x^12 + x^5 + x^0 (0x1021) // CRC-16: x^16 + x^15 + x^2 + x^0 (0x8005) #define CRC_16_POLYNOMIALS 0x8005const BYTE chCRCHTalbe[] = // CRC 高位字节值表{0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41,0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41,0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41,0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41,0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41,0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41,0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41,0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41,0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41,0x00, 0xC1, 0x81, 0x40};const BYTE chCRCLTalbe[] = // CRC 低位字节值表{0x00, 0xC0, 0xC1, 0x01, 0xC3, 0x03, 0x02, 0xC2, 0xC6, 0x06, 0x07, 0xC7,0x05, 0xC5, 0xC4, 0x04, 0xCC, 0x0C, 0x0D, 0xCD, 0x0F, 0xCF, 0xCE, 0x0E,0x0A, 0xCA, 0xCB, 0x0B, 0xC9, 0x09, 0x08, 0xC8, 0xD8, 0x18, 0x19, 0xD9,0x1B, 0xDB, 0xDA, 0x1A, 0x1E, 0xDE, 0xDF, 0x1F, 0xDD, 0x1D, 0x1C, 0xDC,0x14, 0xD4, 0xD5, 0x15, 0xD7, 0x17, 0x16, 0xD6, 0xD2, 0x12, 0x13, 0xD3,0x11, 0xD1, 0xD0, 0x10, 0xF0, 0x30, 0x31, 0xF1, 0x33, 0xF3, 0xF2, 0x32,0x36, 0xF6, 0xF7, 0x37, 0xF5, 0x35, 0x34, 0xF4, 0x3C, 0xFC, 0xFD, 0x3D,0xFF, 0x3F, 0x3E, 0xFE, 0xFA, 0x3A, 0x3B, 0xFB, 0x39, 0xF9, 0xF8, 0x38,0x28, 0xE8, 0xE9, 0x29, 0xEB, 0x2B, 0x2A, 0xEA, 0xEE, 0x2E, 0x2F, 0xEF,0x2D, 0xED, 0xEC, 0x2C, 0xE4, 0x24, 0x25, 0xE5, 0x27, 0xE7, 0xE6, 0x26,0x22, 0xE2, 0xE3, 0x23, 0xE1, 0x21, 0x20, 0xE0, 0xA0, 0x60, 0x61, 0xA1,0x63, 0xA3, 0xA2, 0x62, 0x66, 0xA6, 0xA7, 0x67, 0xA5, 0x65, 0x64, 0xA4,0x6C, 0xAC, 0xAD, 0x6D, 0xAF, 0x6F, 0x6E, 0xAE, 0xAA, 0x6A, 0x6B, 0xAB,0x69, 0xA9, 0xA8, 0x68, 0x78, 0xB8, 0xB9, 0x79, 0xBB, 0x7B, 0x7A, 0xBA,0xBE, 0x7E, 0x7F, 0xBF, 0x7D, 0xBD, 0xBC, 0x7C, 0xB4, 0x74, 0x75, 0xB5,0x77, 0xB7, 0xB6, 0x76, 0x72, 0xB2, 0xB3, 0x73, 0xB1, 0x71, 0x70, 0xB0,0x50, 0x90, 0x91, 0x51, 0x93, 0x53, 0x52, 0x92, 0x96, 0x56, 0x57, 0x97,0x55, 0x95, 0x94, 0x54, 0x9C, 0x5C, 0x5D, 0x9D, 0x5F, 0x9F, 0x9E, 0x5E,0x5A, 0x9A, 0x9B, 0x5B, 0x99, 0x59, 0x58, 0x98, 0x88, 0x48, 0x49, 0x89,0x4B, 0x8B, 0x8A, 0x4A, 0x4E, 0x8E, 0x8F, 0x4F, 0x8D, 0x4D, 0x4C, 0x8C,0x44, 0x84, 0x85, 0x45, 0x87, 0x47, 0x46, 0x86, 0x82, 0x42, 0x43, 0x83,0x41, 0x81, 0x80, 0x40};WORD CRC16_1(BYTE* pchMsg, WORD wDataLen){BYTE chCRCHi = 0xFF; // 高CRC字节初始化BYTE chCRCLo = 0xFF; // 低CRC字节初始化WORD wIndex; // CRC循环中的索引while (wDataLen--){// 计算CRCwIndex = chCRCLo ^ *pchMsg++ ;chCRCLo = chCRCHi ^ chCRCHTalbe[wIndex];chCRCHi = chCRCLTalbe[wIndex] ;}return ((chCRCHi << 8) | chCRCLo) ;}方法一:列表法(简单表)const WORD wCRCTalbeAbs[] ={0x0000, 0xCC01, 0xD801, 0x1400, 0xF001, 0x3C00, 0x2800, 0xE401, 0xA001, 0x6C00, 0x7800, 0xB401, 0x5000, 0x9C01, 0x8801, 0x4400,};WORD CRC16_2(BYTE* pchMsg, WORD wDataLen){WORD wCRC = 0xFFFF;WORD i;BYTE chChar;for (i = 0; i < wDataLen; i++){chChar = *pchMsg++;wCRC = wCRCTalbeAbs[(chChar ^ wCRC) & 15] ^ (wCRC >> 4);wCRC = wCRCTalbeAbs[((chChar >> 4) ^ wCRC) & 15] ^ (wCRC >> 4);}return wCRC;}方法二:定义法根据CRC16/MODBUS原理直接计算,算法简单但对单片机计算压力大。
用c语言编写动态烟花代码动态烟花是一种非常有趣的动画效果,它通过不断改变每个粒子的位置和颜色来呈现出烟花的爆炸效果。
下面我们来看一下如何使用c语言进行动态烟花的编写。
首先,我们需要定义一个表示粒子的结构体,它包含了粒子的位置(x,y),速度(vx,vy),和颜色(r,g,b)等信息。
具体的代码如下:```ctypedef struct particle {float x, y;float vx, vy;int r, g, b;} particle;```接下来,我们需要初始化一堆粒子,并随机赋予它们速度和颜色。
具体的代码如下:```cvoid init_particles(particle* particles, int num_particles) {for (int i = 0; i < num_particles; i++) {particles[i].x = SCREEN_WIDTH / 2;particles[i].y = SCREEN_HEIGHT / 2;particles[i].vx = (float)rand() / RAND_MAX * 10 - 5;particles[i].vy = (float)rand() / RAND_MAX * 10 - 5;particles[i].r = rand() % 256;particles[i].g = rand() % 256;particles[i].b = rand() % 256;}}```然后,我们需要在循环中不断更新每个粒子的位置,并绘制出来。
在更新粒子位置时,我们需要考虑粒子的速度和重力等因素。
具体的代码如下:最后,在主函数中,我们需要不断调用以上两个函数进行更新并重绘烟花。
具体的代码如下:。
新概念51单片机C语言教程----入门、提高、开发、拓展全攻略郭天祥编著电子工业出版社例2.2.1编写程序,点亮第一个发光二极管(part2_1.c P27)#include <reg52.h> //52系列单片机头文件sbit led1=P1^0; //声明单片机P1口的第一位void main() //主函数{led1=0; /*点亮第一个发光二极管*/}例2.2.2编写程序,点亮P1口的若干二极管(part2_2.c P39)#include <reg52.h> //52系列单片机头文件void main() //主函数{P1=0xaa;//while(1);}例2.5.1利用for语句延时特性,编写第一个发光二极管以间隔1S亮灭闪动的程序(part2_3.c P42)#include <reg52.h> //52系列单片机头文件#define uint unsigned int //宏定义sbit led1=P1^0; //声明单片机P1口的第一位uint i,j;void main() //主函数{while(1) //大循环{led1=0; /*点亮第一个发光二极管*/for(i=1000;i>0;i--) //延时for(j=110;j>0;j--);led1=1; /*关闭第一个发光二极管*/for(i=1000;i>0;i--) //延时for(j=110;j>0;j--);}}- 2 - 例2.6.1编写程序使第一个发光二极管以间隔500ms亮灭闪动。
(part2_4.c P48)#include <reg52.h> //52系列单片机头文件#define uint unsigned int //宏定义sbit led1=P1^0; //声明单片机P1口的第一位void delay1s(); //声明子函数void main() //主函数{while(1) //大循环{led1=0; /*点亮第一个发光二极管*/delay1s(); //调用延时子函数led1=1; /*关闭第一个发光二极管*/delay1s(); //调用延时子函数}}void delay1s() //子函数体{uint i,j;for(i=500;i>0;i--)for(j=110;j>0;j--);}例2.7.1编写程序使第一个二极管以亮200ms、灭800ms的方式闪动。
标准c语言源程序文件的后缀标准C语言源程序文件的后缀是.c,这是C语言编写的源程序代码保存的常用后缀名。
在不同的操作系统或编译器中,还可能有其他不同的后缀名,比如在Windows中编译的可能是.exe或.obj,但在Linux中编译的则为.o或.so。
在本文中,我们将会重点解释.c文件的含义和作用。
一、C语言源程序C语言是一种结构化、高级程序设计语言,可以用来编写系统软件、应用软件、嵌入式系统、操作系统等。
C语言的源程序是指程序员所编写的源代码文件,这些文件包含了程序的所有命令、定义、声明和注释等。
通常来说,C语言的源程序包含一定的结构和规范,以方便编译器进行解析和编译成可执行文件或库文件。
C语言源程序通常采用.c后缀来命名,这是由于C语言源程序的特殊性决定的。
C语言编译器可以将.c文件编译成可执行文件或库文件,因此.c文件成为了C语言编写的源程序代码保存的常用后缀名。
在某些编译器中,也可以采用.cpp、.cc、.cxx等后缀,表示C++源程序文件。
C语言源文件通常包含了程序的类定义、函数声明、函数定义、数据类型的定义、宏定义、注释等,它是程序员用C语言编写程序的基石。
C语言源文件的命名形式可以是任意的,但通常情况下会按照语义化命名的原则来命名,以方便阅读和维护代码。
三、C语言源文件的作用C语言源文件是程序员用C语言编写程序的基础,它的作用可以总结如下:1. 定义和声明变量和函数。
2. 定义和引用各种数据类型。
3. 定义和使用宏。
4. 给出注释和说明。
5. 方便程序员进行写、改、查和测试。
6. 最后被编译器编译成可执行文件或库文件供使用。
C语言源文件的编译过程一般包括了以下几个步骤:1. 预处理:编译器根据C语言源文件中的宏、条件编译指令等对源文件进行一些预处理,在编译器编译之前生成中间文件。
2. 编译:编译器将预处理后的源文件编译成目标文件(.o或.obj),其中目标文件是可重定位文件,包含了汇编代码和机器指令。
一百五十行c语言代码实现爱心效果1.引言1.1 概述概述部分的内容:本文将介绍如何使用150行的C语言代码实现爱心效果。
通过这个程序,我们可以在屏幕上显示一个美丽的爱心图案,给人们带来温馨和浪漫的感觉。
爱心图案是一种常见的表达爱情和友情的图形,它具有独特而美丽的形状。
通过使用C语言编程,我们可以在命令行窗口中生成这个图案,并通过不同的颜色和动态效果进一步增加其吸引力。
本文将首先介绍爱心效果的实现原理,包括对爱心形状的分析和算法设计。
然后,我们将详细介绍程序的整体框架和主要函数的功能,使读者能够更深入地理解代码的实现过程。
通过学习这个程序,读者可以了解到C语言在图形处理方面的应用,同时也可以提升编程能力和创造力。
此外,本文还将讨论实现效果的优缺点,并提出进一步改进的可能性,以便读者在实际应用中进行探索和创新。
本文旨在向读者展示C语言的魅力和创造力,并鼓励读者通过编写自己的代码来实现更多有趣和实用的效果。
让我们一起开始吧!1.2文章结构文章结构是撰写一篇长文时需要考虑的重要因素之一。
一个良好的文章结构可以使读者更好地理解和跟随文章的思路,同时也有助于作者更好地组织自己的写作。
在本文中,文章结构可以按照以下方式展开:1. 引言1.1 概述在本部分,我们将简要介绍本篇文章的主题和目标- 以C语言代码实现爱心效果。
这个主题将涉及编写一百五十行的代码来展示一个爱心图案,通过解释代码的实现过程和原理,读者将能够掌握如何在C语言中实现这一效果。
1.2 文章结构本部分将详细说明本文的文章结构,包括各个章节的内容以及它们之间的逻辑关系。
通过了解整个文章的组织架构,读者可以更好地理解和阅读后续的章节。
1.3 目的在本小节中,我们会明确本篇文章的目的。
通过展示如何用C语言实现爱心效果,我们希望能够激发读者的兴趣,增加他们对C语言编程的理解,并鼓励他们在编程过程中尝试创造新的效果。
2. 正文2.1 爱心效果的实现原理本小节将详细介绍实现爱心效果的原理和方法。
沈阳理工大学学院计算机程序训练任务书学生姓名:班级:学号:设计题目:编制曲线轨迹动画程序一、设计要求:画一正八边形,如下图,再画一个小圆使在其正八边形边上移动。
八边形的大小和小圆移动的速度由键盘输入。
并将输入的数据送文件保存。
按回车键程序结束。
二、设计报告:题目内容描述:上机编写程序,先确定坐标原点,然后确定八边形的顶点,画八边形与小圆的初始位置,运用循环结构使小圆运动,八边形的大小和小圆移动的速度由键盘输入。
并将输入的数据送文件保存。
按回车键程序结束。
三、系统设计说明(一)系统功能分析:1.应用程序功能说明:先确定原点(200,200),再打开一个文件,如果文件不可写入,则规定八边形的边长为100,小圆移动速度为10,若能写入,则从键盘输入八边形的边长及小圆移动的速度,并把输入的数据存入文件保存,再根据p[i].x=l*cos(PI/PNUM+i*PI/(PNUM/2))+cx,p[i].y=cy-l*sin(PI/PNUM+i*PI/(PNUM/2)),确定八边形的顶点,再运用画线函数line画出八边形,并画出小圆的初始位置,运用循环结构使小圆运动。
运行程序,输入八边形边长及小圆速度,按回车键运行,出现所需运行结果,按退出键退出程序。
2.输入数据类型及格式:程序设计一般由两部分组成:算法和数据结构,合理地选择和实现一个数据结构和处理这些数据结构具有同样的重要性。
八边形的边长不要过大,长度过大会造成八边形在屏幕上显示不完整,一般长度小于210就可以,小圆的速度可以大一些,但也不宜过大,因为大于某一数值后,小圆的速度也不会再增大。
数据类型主要包括如下:#include "Conio.h" /*字符模函数及图形模函数*/#include "graphics.h" /*线条图形函数*/#include <stdio.h> /*输入输出函数*/#include <stdlib.h> /*动态分配储存空间函数*/#include <dos.h> /*调用函数*/#include <math.h> /*数学函数*/#define PI 3.14159265 /*宏定义PI值为3.14159265*/#define PNUM 8 /*对PNUM的宏定义,起值为8*/ #define EGA VGA_driver /*宏定义变量*/struct POINT /*定义结构图变量名称为POINT*/ {int x; /*定义结构体变量包涵的整形变量x*/ int y; /*定义结构体变量包涵的整形变量y*/ }p[PNUM+1]; /*定义一式的结构*/conio.h:conio.h不是C标准库中的头文件。
好看的c语言程序烟花源代码烟花是人们新年、庆祝等节日最喜爱的庆祝道具之一,而用C语言编写的烟花程序更是酷炫、有趣,甚至具有一定的指导意义。
本程序采用的是Win32 API图形和多线程,实现了屏幕上多个烟花同时绽放、炫彩夺目的效果。
以下是程序代码:```include <stdio.h>include <windows.h>include <stdlib.h>include <time.h>define MAX_FIREWORKS 10define MAX_PARTICLES 100struct ParticleStruct {float x, y;float vx, vy;float brightness;};struct FireworkStruct {int x, y;int color;int particlesLeft;bool exploded;ParticleStruct particles[MAX_PARTICLES];};FireworkStruct fireworks[MAX_FIREWORKS];int screenHeight, screenWidth;HDC hDCMem;HBITMAP hBitmap;HBITMAP hOldBitmap;void InitializeFirework(int index) {fireworks[index].x = rand() % screenWidth;fireworks[index].y = screenHeight - 1;fireworks[index].color = RGB(rand() % 256, rand() % 256, rand() % 256);fireworks[index].particlesLeft = rand() % 101 + 100;for (int i = 0; i < MAX_PARTICLES; i++) {fireworks[index].particles[i].x =fireworks[index].x;fireworks[index].particles[i].y =fireworks[index].y;fireworks[index].particles[i].vx = (rand() % 11 - 5) / 10.0;fireworks[index].particles[i].vy = (rand() % 11 - 10) / 10.0;fireworks[index].particles[i].brightness = 1.0;}}void InitializeFireworks() {for (int i = 0; i < MAX_FIREWORKS; i++)InitializeFirework(i);}bool UpdateFirework(int index) {fireworks[index].y -= rand() % 6 + 3;if (fireworks[index].y < screenHeight / 4) { fireworks[index].exploded = true;for (int i = 0; i < MAX_PARTICLES; i++) { fireworks[index].particles[i].vx = 0; fireworks[index].particles[i].vy = 0; }}return true;}else {bool particleExists = false;for (int i = 0; i < MAX_PARTICLES; i++){fireworks[index].particles[i].vx *= 0.95; fireworks[index].particles[i].vy *= 0.95;fireworks[index].particles[i].x +=fireworks[index].particles[i].vx;fireworks[index].particles[i].y +=fireworks[index].particles[i].vy;fireworks[index].particles[i].brightness *=0.975;if (fireworks[index].particles[i].brightness > 0.0)particleExists = true;}fireworks[index].particlesLeft--;if (fireworks[index].particlesLeft == 0|| !particleExists) {InitializeFirework(index);return false;}return true;}}void UpdateFireworks() {for (int i = 0; i < MAX_FIREWORKS; i++)UpdateFirework(i);}void DrawFireworks() {HBRUSH hBrush;for (int i = 0; i < MAX_FIREWORKS; i++) {if (!fireworks[i].exploded) {hBrush = CreateSolidBrush(fireworks[i].color);SelectObject(hDCMem, hBrush);Ellipse(hDCMem, fireworks[i].x - 5,fireworks[i].y - 5, fireworks[i].x + 5, fireworks[i].y + 5);DeleteObject(hBrush);}else {for (int j = 0; j < MAX_PARTICLES; j++) {hBrush = CreateSolidBrush(RGB(255, 255, 255)/*fireworks[i].color*/);SelectObject(hDCMem, hBrush);SetPixel(hDCMem,fireworks[i].particles[j].x, fireworks[i].particles[j].y, fireworks[i].color*fireworks[i].particles[j].brightness);DeleteObject(hBrush);}}}}DWORD WINAPI UpdateThread(LPVOID lpParam) {while (true) {UpdateFireworks();Sleep(10);}return 0;}int main() {HWND hWnd = GetDesktopWindow();HDC hDC = GetDC(hWnd);screenHeight = GetSystemMetrics(SM_CYSCREEN);screenWidth = GetSystemMetrics(SM_CXSCREEN);hDCMem = CreateCompatibleDC(hDC);hBitmap = CreateCompatibleBitmap(hDC, screenWidth, screenHeight);hOldBitmap = (HBITMAP)SelectObject(hDCMem, hBitmap);InitializeFireworks();CreateThread(NULL, 0, &UpdateThread, NULL, 0, NULL);MSG msg;BOOL bRet;while ((bRet = GetMessage(&msg, NULL, 0, 0)) != 0) { if (bRet == -1)break;else {TranslateMessage(&msg);DispatchMessage(&msg);DrawFireworks();BitBlt(hDC, 0, 0, screenWidth, screenHeight, hDCMem, 0, 0, SRCCOPY);}}SelectObject(hDCMem, hOldBitmap);DeleteObject(hBitmap);DeleteDC(hDCMem);ReleaseDC(hWnd, hDC);return 0;}```本程序实现了多个烟花同时在屏幕上绽放和消失,其中每个烟花的颜色和位置随机生成。
C语言动画程序#include <math.h>#include <stdio.h>#include <graphics.h>#include <dos.h>#define pi 3.1415926535double ca3mm1(double m1,double m2);double ca3fm1(double cosine,double sine);double ca5fm2(double a6m,double a5m,double a4m,double a4f,int shang);double ca6fm2(double a4m ,double a4f,double a5m , double a5f);char inbox(int x,int y,int x1,int y1);char buf();main(){double m=3.0;double xo=100.0,yo=200.0,a1=30.0,t1=pi;double xc=xo+m*a1,yc=yo;double a2=8.0,a3,a4=25.0,a5=30.0,a6=20.0,a7=35.0;double t2,t3,t4,t5,t6,t7;double xo1=xo+m*150,yo1=yo;double xc1=xo1-m*a1,yc1=yo1;double i,j,k;double l1;double n=116.1,nt;initscreen();setfillstyle(SOLID_FILL,DARKGRAY);bar(0,0,640,480);mybutton(10,10,"BEGIN",1,0);mybutton(500,10,"EXIT",1,0);line(0,69,640,69);mouseinit();changemousecross();setmousexy(320,20);mouseshow();setmousearea(0,0,640,60);do{if(inbox(10,10,70,26)&&button()==1){mousehide(); mybutton(10,10,"BEGIN",0,0); mouseshow(); mousehold(); mousehide(); mybutton(10,10,"BEGIN",1,7); mouseshow(); break; }if(inbox(500,10,555,26)&&button()==1){mousehide(); mybutton(500,10,"EXIT",0,0); mouseshow(); mousehold(); mousehide(); mybutton(500,10,"EXIT",1,7); mouseshow(); exit(0); }if(buf()==56)for(i=0;i<10000;i++){switch (buf()){case 18:{mousehide();mybutton(500,10,"EXIT",0,0);mouseshow();delay(4000);mousehide();mybutton(500,10,"EXIT",1,7);mouseshow();exit(0);}case 48: {mousehide();mybutton(10,10,"BEGIN",0,0);mouseshow();delay(4000);mousehide();mybutton(10,10,"BEGIN",1,7);mouseshow();goto run;}default:break;}}}while(1);run:drawjijia(xo,yo,1);drawjijia(xc,yc,1);drawjijia(xo1,yo1,1);drawjijia(xc1,yc1,1);setwritemode(1);do{for(i=0;i<360.0;i+=1.0){t2=i;a3=ca3mm1(a1*cos(t1)+a2*cos(t2*pi/180.0),a1*sin(t1)+a2*sin(t2*pi/180.0));t3=ca3fm1(a1*cos(t1)+a2*cos(t2*pi/180.0),a1*sin(t1)+a2*sin(t2*pi/180.0));a4=a3;t4=t3;t5=ca5fm2(a6,a5,a4,t4,0);t6=ca6fm2(a4,t4,a5,t5);t7=t6-90.0;l1=xc1-xc-2*m*a7*cos(t7*pi/180);nt=(asin(l1/2/(n/2))*180/pi)-90.0;drawline(xo,yo,a2,t2,m,LIGHTGRAY);drawline(xo+m*a2*cos(t2*pi/180),yo-m*a2*sin(t2*pi/180),a5,t5,m,LIGHTGRAY);drawline(xc,yc,a6,t6,m,LIGHTGRAY);drawline(xc,yc,a7,t7,m,LIGHTGRAY);drawline1(xo1,yo1,a2,t2,m,LIGHTGRAY);drawline1(xo1+m*a2*cos((180-t2)*pi/180),yo1-m*a2*sin((180-t2)*pi/180),a5,t5,m,LIGHTGRAY); drawline1(xc1,yc1,a6,t6,m,LIGHTGRAY);drawline1(xc1,yc1,a7,t7,m,LIGHTGRAY);for(j=-1;j<20;j++){ drawline(xc+m*a7*cos(t7*pi/180),(yc-m*a7*sin(t7*pi/180)-j*n*sin(nt*pi/180)),n,nt,1.0,GREEN); drawline1(xc1-m*a7*cos(t7*pi/180),(yc1-m*a7*sin(t7*pi/180)-j*n*sin(nt*pi/180)),n,nt,1.0,DARK GRAY);}delay(300);drawline(xo,yo,a2,t2,m,LIGHTGRAY);drawline(xo+m*a2*cos(t2*pi/180.0),yo-m*a2*sin(t2*pi/180.0),a5,t5,m,LIGHTGRAY);drawline(xc,yc,a6,t6,m,LIGHTGRAY);drawline(xc,yc,a7,t7,m,LIGHTGRAY);drawline1(xo1,yo1,a2,t2,m,LIGHTGRAY);drawline1(xo1+m*a2*cos((180-t2)*pi/180),yo1-m*a2*sin((180-t2)*pi/180),a5,t5,m,LIGHTGRAY); drawline1(xc1,yc1,a6,t6,m,LIGHTGRAY);drawline1(xc1,yc1,a7,t7,m,LIGHTGRAY);for(j=-1;j<20;j++){ drawline(xc+m*a7*cos(t7*pi/180),(yc-m*a7*sin(t7*pi/180)-j*n*sin(nt*pi/180)),n,nt,1.0,GREEN); drawline1(xc1-m*a7*cos(t7*pi/180),(yc1-m*a7*sin(t7*pi/180)-j*n*sin(nt*pi/180)),n,nt,1.0,DARK GRAY);}setwritemode(0);if(inbox(500,10,555,26)&&button()==1){mousehide(); mybutton(500,10,"EXIT",0,0); mouseshow(); mousehold(); mousehide(); mybutton(500,10,"EXIT",1,7); mouseshow(); exit(0); }if(buf()==56)for(k=0;k<10000;k++){switch (buf()){case 18:{mousehide();mybutton(500,10,"EXIT",0,0);mouseshow();delay(4000);mousehide();mybutton(500,10,"EXIT",1,7);mouseshow();exit(0); }default:break;}}setwritemode(1);}}while(1);}drawline(double xo,double yo,double mo,double fujiao,double m,int color) {double x,y;x=(xo+m*mo*cos(fujiao*pi/180));y=(yo-m*mo*sin(fujiao*pi/180));setcolor(color);line (xo,yo,x,y);}drawline1(double xo,double yo,double mo,double fujiao,double m,int color) {double x,y;x=(xo-m*mo*cos(fujiao*pi/180));y=(yo-m*mo*sin(fujiao*pi/180));setcolor(color);line (xo,yo,x,y);}drawjijia(double x,double y,int shang){setcolor(RED);if (shang==1){circle(x,y,3);line(x-3.0,y+3.0,x-15.0,y+20.0);moveto(x-15,(int)(y+20));lineto((int)(x+15),(int)(y+20));moveto((int)(x+15),(int)(y+20));lineto(x+3,y+3);}setcolor(RED);if (shang==0){circle((int)x,(int)y,3);line (x-3,y-3,x-15,y-20);moveto(x-15,y-20);lineto(x+15,y-20);moveto(x+15,y-20);lineto(x+3,y-3);}}double ca3mm1(double m1,double m2){double temp;temp = sqrt(m1*m1 + m2*m2);return(temp);}double ca3fm1(double cosine,double sine){float temp;if (sine > 0 && cosine > 0)temp = atan(sine / cosine) * 180 / pi;if (sine > 0 && cosine < 0)temp = (atan(sine / cosine) + pi) * 180 / pi;if (sine < 0 && cosine < 0)temp = (atan(sine / cosine) + pi) * 180 / pi;if (sine < 0 && cosine > 0)temp = (atan(sine / cosine) + 2 * pi) * 180 / pi;return(temp);}double ca5fm2(double a6m,double a5m,double a4m,double a4f,int shang) {double temp,sine1,cosine1;cosine1 = (a6m *a6m - a4m *a4m - a5m*a5m) / (2 * a4m * a5m);sine1 = sqrt(1 - cosine1 *cosine1);if (shang==0)sine1 = sine1*(-1);if (sine1 > 0 && cosine1 > 0)temp = a4f + (atan(sine1 / cosine1) * 180 / pi);if (sine1 > 0 && cosine1 < 0)temp = a4f + ((atan(sine1 / cosine1) + pi) * 180 / pi);if (sine1 < 0 && cosine1 < 0)temp = a4f + ((atan(sine1 / cosine1) + pi) * 180 / pi);if (sine1 < 0 && cosine1 > 0)temp = a4f + ((atan(sine1 / cosine1) + 2 * pi) * 180 / pi);return(temp);}double ca6fm2(double a4m ,double a4f,double a5m , double a5f){double temp,sine1,cosine1;sine1 = a4m * sin(a4f * pi / 180) + a5m * sin(a5f * pi / 180);cosine1 = a4m * cos(a4f * pi / 180) + a5m * cos(a5f * pi / 180);if (sine1 > 0 && cosine1 > 0)temp = (atan(sine1 / cosine1) * 180 / pi);if (sine1 > 0 && cosine1 < 0)temp = ((atan(sine1 / cosine1) + pi) * 180 / pi);if (sine1 < 0 && cosine1 < 0)temp = ((atan(sine1 / cosine1) + pi) * 180 / pi);if (sine1 < 0 && cosine1 > 0)temp = ((atan(sine1 / cosine1) + 2 * pi) * 180 / pi);return(temp);}initscreen(){int gd=DETECT,gm;registerbgidriver(EGAVGA_driver);initgraph(&gd,&gm,"");}。