Ⅰ 求雪花小程序C++源代碼,能運行無誤的
#include<iostream.h>
#include <windows.h>
#include <math.h>
#include <stdlib.h>
#define ID_TIMER 1
#define SNOWNUM 500 // 雪花數量
#define CONTRAST 50 // 對比度
#define YSTART 5 // 用於確定雪花初始時的y坐標
#define SNOWCR RGB(0xFF, 0xFF, 0xFF) //雪花的顏色—白色
#define SNOWGATHERCR RGB(0xDB, 0xDB, 0xFF) //堆積雪花的顏色
typedef struct tagSnow
{
POINT ptSnowsPos[SNOWNUM]; //用於保存各個雪花的坐標
COLORREF crOrg[SNOWNUM]; //用於畫雪花前屏幕原來的顏色
int iVx, iVy, iAllVx, iAllVy;
}Snow;
void initSnow(HDC hdc, Snow *sn, int iSnow, int cxScreen);
int GetContrast(HDC hdc, Snow *sn, int iSnow);
void drawSnow(HDC hdc, Snow *sn, int cxScreen);
LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
PSTR szCmdLine, int iCmdShow)
{
static TCHAR szAppName[] = TEXT ("clsDeskSnow") ;
HWND hwnd ;
MSG msg ;
WNDCLASS wndclass ;
wndclass.style = CS_HREDRAW | CS_VREDRAW ;
wndclass.lpfnWndProc = WndProc ;
wndclass.cbClsExtra = 0 ;
wndclass.cbWndExtra = 0 ;
wndclass.hInstance = hInstance ;
wndclass.hIcon = LoadIcon (NULL, IDI_APPLICATION) ;
wndclass.hCursor = LoadCursor (NULL, IDC_ARROW) ;
wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH) ;
wndclass.lpszMenuName = NULL ;
wndclass.lpszClassName = szAppName ;
if(!RegisterClass (&wndclass))
{
MessageBox (NULL, TEXT ("This program requires Windows NT!"), szAppName, MB_ICONERROR) ;
return 0;
}
hwnd = CreateWindow (szAppName, TEXT ("桌面下雪"),
WS_MINIMIZEBOX | WS_SYSMENU,
CW_USEDEFAULT, CW_USEDEFAULT,
240, 120,
NULL, NULL, hInstance, NULL) ;
ShowWindow (hwnd, iCmdShow) ;
UpdateWindow (hwnd) ;
while (GetMessage (&msg, NULL, 0, 0))
{
TranslateMessage (&msg) ;
DispatchMessage (&msg) ;
}
return msg.wParam ;
}
LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
HDC hdc ;
PAINTSTRUCT ps ;
RECT rect ;
static int cxScreen, cyScreen; //屏幕寬高度(單位:像素)
static int iTimes, iLoopTimes=100;
static Snow snowDream;
int i;
switch (message)
{
case WM_CREATE:
cxScreen = GetSystemMetrics (SM_CXSCREEN) ;
cyScreen = GetSystemMetrics (SM_CYSCREEN) ;
srand ((int) GetCurrentTime ()) ; //初始化隨機數發生器
snowDream.iAllVx = (unsigned)rand()%3 - 1; //雪花總體水平飄行速度(-1,0,1)
snowDream.iAllVy = (unsigned)rand()%2 + 1; //雪花總體垂直下落速度(1,2)
hdc = GetDC(NULL); //檢索整個屏幕的設備上下文環境
for(i=0; i <SNOWNUM; i++)
{
snowDream.ptSnowsPos[i].x = rand() % cxScreen; //一個雪花開始下落的x坐標
snowDream.ptSnowsPos[i].y = rand() % YSTART; //一個雪花開始下落的y坐標
snowDream.crOrg[i] = GetPixel(hdc, snowDream.ptSnowsPos[i].x,
snowDream.ptSnowsPos[i].y); //獲取給定點的原來的顏色值
}
ReleaseDC(NULL, hdc);
SetTimer(hwnd, ID_TIMER, 10, NULL); //定時器,10毫秒
return 0 ;
case WM_DISPLAYCHANGE: //當顯示解析度改變的時候
cxScreen = GetSystemMetrics (SM_CXSCREEN) ;
cyScreen = GetSystemMetrics (SM_CYSCREEN) ;
return 0;
case WM_TIMER:
hdc = GetDC(NULL); //檢索整個屏幕的設備上下文環境
if(iTimes > iLoopTimes)
{
iTimes = 0;
iLoopTimes = 50 + (unsigned)rand()%50;
if(snowDream.iAllVx != 0)
snowDream.iAllVx = 0;
else
snowDream.iAllVx = (unsigned)rand()%3 - 1; //雪花總體水平飄行速度(-1,0,1)
snowDream.iAllVy = (unsigned)rand()%2 + 1; //雪花總體垂直下落速度(1,2)
}
else
iTimes++;
drawSnow(hdc, &snowDream, cxScreen);
ReleaseDC(NULL, hdc);
return 0;
case WM_PAINT:
hdc = BeginPaint (hwnd, &ps) ;
GetClientRect (hwnd, &rect) ;
DrawText (hdc, TEXT ("桌面下雪!"), -1, &rect,
DT_SINGLELINE | DT_CENTER | DT_VCENTER) ;
EndPaint (hwnd, &ps) ;
return 0 ;
case WM_DESTROY:
KillTimer(hwnd, ID_TIMER); // 中止定時器
InvalidateRect(NULL, NULL, TRUE); // 刷新桌面
PostQuitMessage (0) ;
return 0 ;
}
return DefWindowProc (hwnd, message, wParam, lParam) ;
}
void initSnow(HDC hdc, Snow *sn, int iSnow, int cxScreen) //初始化第iSnow個雪花
{
sn->ptSnowsPos[iSnow].x = (unsigned)rand() % cxScreen; //x范圍整個屏幕寬
sn->ptSnowsPos[iSnow].y = (unsigned)rand() % YSTART; //y范圍離屏幕頂部YSTART像素點以內
sn->crOrg[iSnow] = GetPixel(hdc, sn->ptSnowsPos[iSnow].x,
sn->ptSnowsPos[iSnow].y ) ;//獲取給定點的原來的顏色值
}
int GetContrast(HDC hdc, Snow *sn, int iSnow)
{
int iR, iG, iB;
COLORREF crCmp;
if(0 == sn->iVx) //若水平速度為0,則取比其大一個像素的正下方的點
crCmp = GetPixel(hdc, sn->ptSnowsPos[iSnow].x, sn->ptSnowsPos[iSnow].y + 1);
else //若水平速度>0,取右下方的點。 <0則取左下方的點
crCmp = GetPixel(hdc, sn->ptSnowsPos[iSnow].x + (sn->iVx>0?1:-1), sn->ptSnowsPos[iSnow].y + 1);
if(crCmp==SNOWCR) //如果為雪花的顏色
return 0;
//分別獲取crCmp與對比點的藍、綠、紅部分的差值
iB = abs((crCmp>>16)&0xFF - (sn->crOrg[iSnow]>>16)&0xFF);
iG = abs((crCmp>>8)&0xFF - (sn->crOrg[iSnow]>>8)&0xFF);
iR = abs((crCmp)&0xFF - (sn->crOrg[iSnow])&0xFF);
return (iR+iG+iB)/3;
}
void drawSnow(HDC hdc, Snow *sn, int cxScreen)
{
int i;
for(i=0; i <SNOWNUM; i++)
{
//如果保存的原來的顏色不是雪花的顏色
if(sn->crOrg[i] != SNOWCR)
SetPixel(hdc, sn->ptSnowsPos[i].x, sn->ptSnowsPos[i].y,
sn->crOrg[i]); //還原上一個位置的顏色
sn->iVx = sn->iAllVx*(i%3+1); //雪花的x飄動速度
sn->iVy = sn->iAllVy*(i%3+1); //雪花的y飄動速度
//rand()%5-2使雪花下落的時候 有抖動效果
sn->ptSnowsPos[i].x += sn->iVx+rand()%5-2; //雪花的下一個x坐標
sn->ptSnowsPos[i].y += sn->iVy+1; //雪花的下一個y坐標
//獲取給定點的原來的顏色值
sn->crOrg[i] = GetPixel(hdc, sn->ptSnowsPos[i].x, sn->ptSnowsPos[i].y);
if(CLR_INVALID == sn->crOrg[i]) //如果獲取顏色失敗,即雪花飄出了屏幕
{
initSnow(hdc, sn, i, cxScreen); //重新初始化 雪花
continue;
}
if(sn->crOrg[i] != SNOWCR) //若當前點的顏色 不等於 雪花的顏色
{
if(SNOWGATHERCR == sn->crOrg[i]) //當前點的顏色=堆積的雪的顏色
{ //設置為雪花的顏色
SetPixel(hdc, sn->ptSnowsPos[i].x, sn->ptSnowsPos[i].y, SNOWCR);
sn->crOrg[i] = SNOWCR;
//initSnow(hdc, sn, i, cxScreen); //重新初始化 雪花
}
else if(GetContrast(hdc, sn, i) > 50) //若對比度>50
{ //堆積雪花
SetPixel(hdc, sn->ptSnowsPos[i].x, sn->ptSnowsPos[i].y, SNOWGATHERCR);
SetPixel(hdc, sn->ptSnowsPos[i].x-1, sn->ptSnowsPos[i].y+1, SNOWGATHERCR);
SetPixel(hdc, sn->ptSnowsPos[i].x+1, sn->ptSnowsPos[i].y+1, SNOWGATHERCR);
initSnow(hdc, sn, i, cxScreen); //重新初始化 雪花
}
else //對比度 <50,不堆積,畫出這幀雪花.等下次的時候再還原此點原本的顏色.以產生飄動效果
SetPixel(hdc, sn->ptSnowsPos[i].x, sn->ptSnowsPos[i].y, SNOWCR);
}
}
這是我根據網上的修改的桌面下雪的程序,在vc6.0上新建win32可也運行,希望對你有點幫助
}
Ⅱ 求易語言屏幕下雪源碼
.版本 2.程序集 窗口程序集1
.程序集變數 num, 整數型
.程序集變數 a, 整數型, , "1000,3"
.程序集變數 d, 整數型
.程序集變數 e, 整數型
.程序集變數 g, 整數型
.程序集變數 oldx, 整數型
.程序集變數 oldy, 整數型
.程序集變數 h, 整數型
.程序集變數 dc, 整數型
.程序集變數 color, 整數型
.程序集變數 dodo, 整數型.子程序 _按鈕1_被單擊num = 500
dc = GetDC (0)
處理事件 ()
置隨機數種子 ()
.計次循環首 (num, d)
a [d] [1] = 取整 (取屏幕寬度 () × 取隨機數 (, 1000) ÷ 1000)
a [d] [2] = 取整 (取屏幕高度 () × 取隨機數 (, 1000) ÷ 1000)
a [d] [3] = 1 + 取隨機數 (, 1000) ÷ 1000 × 3
.計次循環尾 ().判斷循環首 (num > 0)
.計次循環首 (10, e)
處理事件 ()
.計次循環首 (num, g)
oldx = a [g] [1]
oldy = a [g] [2]
a [g] [2] = a [g] [2] + a [g] [3]
.如果真 (a [g] [2] > 取屏幕高度 ())
a [g] [2] = 0
a [g] [1] = 取整 (取屏幕寬度 () × 取隨機數 (, 1000) ÷ 1000)
oldx = 0
oldy = 0
.如果真結束
h = 8 × (a [g] [3] - 1)
h = 60 + h
dodo = GetPixel (dc, a [g] [1], a [g] [2])
color = SetPixel (dc, a [g] [1], a [g] [2], 取顏色值 (h, h, h))
color = SetPixel (dc, oldx, oldy, dodo)
處理事件 () .計次循環尾 ()
延時 (10)
.計次循環尾 ()
.判斷循環尾 ().子程序 __啟動窗口_將被銷毀num = -1
處理事件 ()
Ⅲ 雪花演算法源碼
答案:
雪花演算法是一種分布式系統中生成全局唯一ID的演算法。以下是簡化版的雪花演算法源碼實現。
詳細解釋:
雪花演算法是為了解決分布式系統中的唯一ID生成問題而設計的。它生成的ID是一個長整型的數字,通常包含以下幾個部分:符號位、時間戳、機器標識、序列號等。這樣的設計保證了ID的全局唯一性,同時具備良好的有序性和性能。
以下是簡化版的雪花演算法源碼,由於涉及到編程語言的具體實現細節,我將提供一個通用的邏輯描述,不包含具體語言的關鍵字和語法:
1. 符號位:首先確定ID的符號位,通常使用最高位表示。這個位通常被設置為0,表示生成的ID是正數。
2. 時間戳:接下來生成時間戳部分,通常採用當前時間的毫秒數或者秒數。這樣可以保證在一定時間范圍內的唯一性。
3. 機器標識:為每個機器分配一個唯一的標識,可以是IP地址、機器ID等。這部分用於區分不同的部署節點或者機器實例。
4. 序列號:在同一毫秒內生成序列號,保證同一機器在同一時間戳內能夠生成多個ID。序列號通常採用遞增的方式,避免沖突。
5. 組合:將以上各部分組合成一個長整型的數字,形成一個唯一的ID。
具體的代碼實現會依賴於你使用的編程語言和環境。你需要根據具體的編程語言和框架來實現這個演算法,包括處理並發問題、時間戳的同步等細節。雪花演算法的核心思想是以上描述的邏輯,具體的代碼需要根據實際的應用場景和需求進行編寫和優化。
Ⅳ 2022聖誕樹代碼
1. 繪制2022年的聖誕樹使用python代碼。
2. 創建一個新的Python文件tree1.py,或者直接運行以下代碼:
```python
# 聲明樹的高度
height = 5
# 樹的雪花數,初始為1
stars = 1
# 以樹的高度作為循環次數
for i in range(height):
# 列印空格和星號來形成樹的每一層
print(' ' * (height - i) + '*' * stars)
# 雪花數增加,以形成樹的形狀
stars += 2
```
3. 代碼是程序員使用開發工具支持的語言編寫的源文件,是一套由字元、符號或信號碼元以離散形式表示信息的明確規則體系。
4. 代碼設計的原則包括唯一確定性、標准化和通用性、可擴充性與穩定性、便於識別與記憶、力求簡短與格式統一以及容易修改等。
5. 源代碼是代碼的一個分支,從某種意義上說,源代碼相當於代碼。
6. 在現代程序設計語言中,源代碼通常以文本文件的形式出現,最常用的格式是為了編譯成計算機程序。
7. 計算機源代碼的最終目的是將人類可讀文本轉換成計算機可執行的二進制指令,這一過程稱為編譯,由編譯器完成。