C++------流星雨
用C++实现模拟数字、字母流星雨,其主要用到链表、win32编程基础。
demo实例:
// DataRainDemo.cpp : 定义应用程序的入口点。
// #include "stdafx.h"
#include "DataRainDemo.h"
#include<time.h>
#include<stdlib.h>
#include<windows.h>
#define STRMINLEN 8
#define STRMAXLEN 25 //双向链表的每一个节点
typedef struct MyList
{
struct MyList *prev; //前一节点
struct MyList *pNext; //下一节点
char ch; //数据保存
} MyList,*pMyList;
//处理数据
typedef struct MyListColum
{
MyList *phead; //整个链表的头
MyList *pCurent; //链表所在当前的位置
MyList *pTemp; //临时变量
int listStrLen; //整个链表的长度
int x, y; //链表的位置
int iStopTimes;
int iMusStopTimes;
}StrColum,*pStrColum; #define MAX_LOADSTRING 100 // 全局变量:
HINSTANCE hInst; // 当前实例
WCHAR szTitle[MAX_LOADSTRING]; // 标题栏文本
WCHAR szWindowClass[MAX_LOADSTRING]; // 主窗口类名 // 此代码模块中包含的函数的前向声明:
ATOM MyRegisterClass(HINSTANCE hInstance);
BOOL InitInstance(HINSTANCE, int);
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
INT_PTR CALLBACK About(HWND, UINT, WPARAM, LPARAM); int APIENTRY wWinMain(_In_ HINSTANCE hInstance,
_In_opt_ HINSTANCE hPrevInstance,
_In_ LPWSTR lpCmdLine,
_In_ int nCmdShow)
{
UNREFERENCED_PARAMETER(hPrevInstance);
UNREFERENCED_PARAMETER(lpCmdLine); // TODO: 在此放置代码。 // 初始化全局字符串
LoadStringW(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
LoadStringW(hInstance, IDC_DATARAINDEMO, szWindowClass, MAX_LOADSTRING);
MyRegisterClass(hInstance); // 执行应用程序初始化:
if (!InitInstance (hInstance, nCmdShow))
{
return FALSE;
}
srand(time(NULL));//以时间为种子
HACCEL hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_DATARAINDEMO)); MSG msg; // 主消息循环:
while (GetMessage(&msg, nullptr, , ))
{
if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
} return (int) msg.wParam;
}
//宽字节 两个字节代表一个字符
TCHAR randomChar()
{
return (rand() % + );//0-9的ASCII
} //
// 函数: MyRegisterClass()
//
// 目的: 注册窗口类。
//
ATOM MyRegisterClass(HINSTANCE hInstance)
{
WNDCLASSEXW wcex; wcex.cbSize = sizeof(WNDCLASSEX); wcex.style = CS_HREDRAW | CS_VREDRAW;
wcex.lpfnWndProc = WndProc;
wcex.cbClsExtra = ;
wcex.cbWndExtra = ;
wcex.hInstance = hInstance;
wcex.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_DATARAINDEMO));
wcex.hCursor = LoadCursor(nullptr, IDC_ARROW);
wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+);
wcex.lpszMenuName = NULL;//MAKEINTRESOURCEW(IDC_DATARAINDEMO);
wcex.lpszClassName = szWindowClass;
wcex.hIconSm = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL)); return RegisterClassExW(&wcex);
} //
// 函数: InitInstance(HINSTANCE, int)
//
// 目的: 保存实例句柄并创建主窗口
//
// 注释:
//
// 在此函数中,我们在全局变量中保存实例句柄并
// 创建和显示主程序窗口。
//
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
hInst = hInstance; // 将实例句柄存储在全局变量中 /*HWND hWnd = CreateWindowW(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, nullptr, nullptr, hInstance, nullptr);*/
/*
API 函数原型:
HWND WINAPI CreateWindow(
_In_opt_ LPCTSTR lpClassName, // 窗口类名称
_In_opt_ LPCTSTR lpWindowName, // 窗口标题
_In_ DWORD dwStyle, // 窗口风格,或称窗口格式
_In_ int x, // 初始 x 坐标
_In_ int y, // 初始 y 坐标
_In_ int nWidth, // 初始 x 方向尺寸
_In_ int nHeight, // 初始 y 方向尺寸
_In_opt_ HWND hWndParent, // 父窗口句柄
_In_opt_ HMENU hMenu, // 窗口菜单句柄
_In_opt_ HINSTANCE hInstance, // 程序实例句柄
_In_opt_ LPVOID lpParam // 创建参数
); 注:_In_ 说明该参数是输入的,_opt_ 说明该参数是可选参数(不是说没有参数,而是可以利用宏搭配参数)。
*/
HWND hWnd = CreateWindowW(szWindowClass, NULL, WS_DLGFRAME|WS_THICKFRAME|WS_POPUP,
, , GetSystemMetrics(SM_CXSCREEN), GetSystemMetrics(SM_CYSCREEN), nullptr, nullptr, hInstance, nullptr); if (!hWnd)
{
return FALSE;
} ShowWindow(hWnd, nCmdShow);
UpdateWindow(hWnd); return TRUE;
} //
// 函数: WndProc(HWND, UINT, WPARAM, LPARAM)
//
// 目的: 处理主窗口的消息。
//
// WM_COMMAND - 处理应用程序菜单
// WM_PAINT - 绘制主窗口
// WM_DESTROY - 发送退出消息并返回
//
//
//初始化每个链表
void init(StrColum *cc, int cyScreen, int x)
{
int j;
cc->listStrLen = rand() % (STRMAXLEN - STRMINLEN) + STRMINLEN;
cc->x = x+;
cc->y = rand() % ? rand() % cyScreen : ;
cc->iMusStopTimes = rand() % ;
cc->iStopTimes = ;
cc->phead = cc->pCurent = (pMyList)calloc(cc->listStrLen,sizeof(MyList));
for ( j = ; j < cc->listStrLen-; j++)
{
cc->pCurent->prev = cc->pTemp;
cc->pCurent->ch = '\0';
cc->pCurent->pNext = cc->pCurent + ;
cc->pTemp = cc->pCurent++;
}
cc->pCurent->prev = cc->pTemp;
cc->pCurent->ch = '\0';
cc->pCurent->pNext = cc->phead;
cc->phead->prev = cc->pCurent;
cc->pCurent = cc->pTemp = cc->phead;
cc->phead->ch = randomChar();
}
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
HDC hdc;
int i, j, temp, ctn;
static HDC hdcMem;
HFONT hFont;
static HBITMAP hBimtmap;
static int cxScreen, cyScreen;
static int iFontWidth = , iFontHeight = , iColumCount;
static StrColum *ccChain;
switch (message)
{
case WM_CREATE:
{
cxScreen = GetSystemMetrics(SM_CXSCREEN);
cyScreen = GetSystemMetrics(SM_CYSCREEN);
SetTimer(hWnd, , , NULL);
hdc = GetDC(hWnd);
hdcMem = CreateCompatibleDC(hdc);
hBimtmap = CreateCompatibleBitmap(hdc, cxScreen, cyScreen);
SelectObject(hdcMem, hBimtmap);
ReleaseDC(hWnd, hdc); hFont = CreateFont(iFontHeight, iFontWidth - , , ,
FW_BOLD, , , , DEFAULT_CHARSET,
OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS,
DRAFT_QUALITY, FIXED_PITCH | FF_SWISS,
TEXT("Fixedsys"));
SelectObject(hdcMem,hFont);
DeleteObject(hFont);
SetBkMode(hdcMem,TRANSPARENT);
//设置显示的列数
iColumCount = cxScreen / (iFontWidth * / );
ccChain = (pStrColum)calloc(iColumCount,sizeof(StrColum));
for (int i = ; i < iColumCount; i++)
{
init(ccChain + i,cyScreen,(iFontWidth*/)*i);
}
return ;
}
break;
case WM_COMMAND:
{
int wmId = LOWORD(wParam);
// 分析菜单选择:
switch (wmId)
{
case IDM_ABOUT:
DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
break;
case IDM_EXIT:
DestroyWindow(hWnd);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
}
break;
case WM_PAINT:
{
PAINTSTRUCT ps;
HDC hdc = BeginPaint(hWnd, &ps);
// TODO: 在此处添加使用 hdc 的任何绘图代码...
EndPaint(hWnd, &ps);
}
break; case WM_DESTROY:
KillTimer(hWnd,);
DeleteObject(hBimtmap);
DeleteDC(hdcMem);
for ( i = ; i < iColumCount; i++)
{
free((ccChain+i)->pCurent);
}
free(ccChain);
PostQuitMessage();
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
case WM_TIMER:
{
hdc = GetDC(hWnd);
PatBlt(hdcMem, , , cxScreen, cyScreen, BLACKNESS);
for (int i = ; i < iColumCount; i++)
{
ctn = (ccChain + i)->iStopTimes++ >(ccChain + i)->iMusStopTimes;
(ccChain + i)->pTemp = (ccChain + i)->phead;
SetTextColor(hdcMem,RGB(,,));
TextOut(hdcMem,(ccChain+i)->x,(ccChain+i)->y,&((ccChain+i)->pTemp->ch),);
j = (ccChain + i)->y;
(ccChain + i)->pTemp = (ccChain + i)->pTemp->pNext;
temp = ;
//temp 绿色过度到黑色
while ((ccChain+i)->pTemp!=(ccChain+i)->phead
&&(ccChain+i)->pTemp->ch)
{
SetTextColor(hdcMem,RGB(,-(*(temp++)
/(ccChain+i)->listStrLen),));
TextOut(hdcMem,(ccChain+i)->x,j-=iFontHeight,
&((ccChain+i)->pTemp->ch),);
(ccChain + i)->pTemp = (ccChain + i)->pTemp->pNext;
}
if (ctn)
(ccChain + i)->iStopTimes = ;
else
continue;
(ccChain + i)->y += iFontHeight;//下次开始显示的地方
if ((ccChain+i)->y-(ccChain+i)->listStrLen*iFontHeight>cyScreen)
{
free((ccChain+i)->pCurent);
init(ccChain+i,cyScreen,(iFontWidth*/)*i);
}
(ccChain + i)->phead = (ccChain + i)->phead->prev;
(ccChain + i)->phead->ch = randomChar();
} BitBlt(hdc,,,cxScreen,cyScreen,hdcMem,,,SRCCOPY);
ReleaseDC(hWnd,hdc);
}
//case WM_RBUTTONDOWN:
// KillTimer(hWnd,1);
// return 0;
//case WM_RBUTTONUP:
// SetTimer(hWnd,1,10,NULL);
// return 0; }
return ;
} // “关于”框的消息处理程序。
INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
UNREFERENCED_PARAMETER(lParam);
switch (message)
{
case WM_INITDIALOG:
return (INT_PTR)TRUE; case WM_COMMAND:
if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
{
EndDialog(hDlg, LOWORD(wParam));
return (INT_PTR)TRUE;
}
break;
}
return (INT_PTR)FALSE;
}
实现效果展示
C++------流星雨的更多相关文章
- POJ 3669 Meteor Shower(流星雨)
POJ 3669 Meteor Shower(流星雨) Time Limit: 1000MS Memory Limit: 65536K Description 题目描述 Bessie hears ...
- BZOJ_1611_[Usaco2008_Feb]_Meteor_Shower流星雨_(bfs)
描述 http://www.lydsy.com/JudgeOnline/problem.php?id=1611 网格图起始位置(0,0),不同时间会有流星落下,导致之后的时间里,该点以及周围四个点都不 ...
- BZOJ1611: [Usaco2008 Feb]Meteor Shower流星雨
1611: [Usaco2008 Feb]Meteor Shower流星雨 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 904 Solved: 393 ...
- BZOJ 1611: [Usaco2008 Feb]Meteor Shower流星雨
1611: [Usaco2008 Feb]Meteor Shower流星雨 Description 去年偶们湖南遭受N年不遇到冰冻灾害,现在芙蓉哥哥则听说另一个骇人听闻的消息: 一场流星雨即将袭击整个 ...
- [Usaco2008 Feb]Meteor Shower流星雨
去年偶们湖南遭受N年不遇到冰冻灾害,现在芙蓉哥哥则听说另一个骇人听闻的消息: 一场流星雨即将袭击整个霸中,由于流星体积过大,它们无法在撞击到地面前燃烧殆尽, 届时将会对它撞到的一切东西造成毁灭性的打击 ...
- [Usaco2008 Feb]Meteor Shower流星雨[BFS]
Description 去年偶们湖南遭受N年不遇到冰冻灾害,现在芙蓉哥哥则听说另一个骇人听闻的消息: 一场流星雨即将袭击整个霸中,由于流星体积过大,它们无法在撞击到地面前燃烧殆尽, 届时将会对它撞到的 ...
- 1611: [Usaco2008 Feb]Meteor Shower流星雨
1611: [Usaco2008 Feb]Meteor Shower流星雨 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 1010 Solved: 44 ...
- 用 CSS3 做一个流星雨动画
昨天 UI 提交过来一个登录页的设计稿,要求背景有一个流星雨动画,做完之后觉得挺有趣,分享一下~ 一.流星动画 首先创建一个 div 作为画布 <div id="stars" ...
- bzoj1611 / P2895 [USACO08FEB]流星雨Meteor Shower
P2895 [USACO08FEB]流星雨Meteor Shower 给每个点标记一下能够走的最迟时间,蓝后bfs处理一下 #include<iostream> #include<c ...
- 撩妹技能 get,教你用 canvas 画一场流星雨
开始 妹子都喜欢流星,如果她说不喜欢,那她一定是一个假妹子. 现在就一起来做一场流星雨,用程序员的野路子浪漫一下. 要画一场流星雨,首先,自然我们要会画一颗流星. 玩过 canvas 的同学,你画圆画 ...
随机推荐
- Codeforces 963A Alternating Sum ( 思维 && 数论 )
题意 : 题目链接 分析 : Tutorial 讲的很清楚 至于为什么这样去考虑 算是一个经验问题吧 如果一个问题要你给出模意义下的答案 就多考虑一下答案是要用逆元构造出来 也就说明有除法的存在 那么 ...
- CodeForces 1100F Ivan and Burgers
CodeForces题面 Time limit 3000 ms Memory limit 262144 kB Source Codeforces Round #532 (Div. 2) Tags da ...
- 页面禁止刷新处理Js实现
document.onkeydown = function(e) { e = window.event || e; var k = e.keyCode; //屏蔽ctrl+R,F5键,ctrl+F5键 ...
- socket模块其他用法
1.socket模块的其他方法 服务端套接字函数 s.bind() 绑定(主机,端口号)到套接字 s.listen() 开始TCP监听 s.accept() 被动接受TCP客户的连接,(阻塞式)等待连 ...
- 命令行创建 vue 项目(仅用于 Vue 2.x 版本)
1 .安装 Node.js 和 npm ( 验证安装成功输入下图 1 命令行可得 2:输入命令行 3 可得 4 即安装成功) 2.安装全局 webpack (安装依照下图输入命令行 1 耐心等待至到出 ...
- java把含小数点的数字字符串转换为int类型
String num ="1.00"; int abc =Double.valueOf(num).intValue();//转换为Int类型
- sqli-labs(30)
0X01 观摩源码 和29关没区别 只是这里闭合变成了“ 0X02构造语句 爆库名 ?id=&id=-"union select 1,database(),3%23 0X03组合拳打 ...
- maven 配置私服 连接
两种方法: 1.在单个项目的pom.xml中使用 私服的连接地址,这样只对该项目起作用. 2.在maven的setting.xml配置中添加私服的连接地址.这样对所有项目起作用. 本文章只演示第二种方 ...
- android 对话框显示工具类
这个工具类非常简单,但是将显示dialog的方法统一封装,能够大大减少代码重复 package com.ctbri.weather.utils; import android.app.AlertDia ...
- Starting MySQL... ERROR! The server quit without updating PID file (/usr/local/mysql/data/VM_0_6_centos.pid)
刚接触MySql数据库,参考一些文章后搭建起来了也创建了数据库,程序跑到很好,一觉醒来突然连接不上了 MySql数据库了. 研究了好一会才找到原因. 现象: 登录数据库失败 [root@VM_0_6_ ...