1. 程式人生 > >一篇關於c的雜文,無意中亂寫整理

一篇關於c的雜文,無意中亂寫整理

我們先來說一下,物體的運動,我們高中就知道,物體的運動有如下幾種:

比如物體的速度大小發生變化,方向不變的變加速運動,減速運動,勻加速,勻減速運動。

比如速度大小不變,方向發生變化,如勻速圓周運動

還有就是速度的大小與方向都發生變化,如簡諧運動,也就是說按照正弦,餘弦方式函式運動。

既然說到了高中物理,我們就倆多說幾個公式吧。

我們來說一下,勻變速直線運動的幾個公式:

Vt=v0+at

S=v0t+1/2at^2

Vt^2-v0^2=2as

S=v0+vt/2*t

我們記幾個上面的公式就可以了。

然後我們切換幾個概念:

幀數:就是在1秒鐘之內傳輸圖片的數目,也可以理解為圖形處理器,每秒可以重新整理幾次,通常用

fps表示。每一幀都是靜止的影象。高的幀率可以得到更流暢,更加逼真的動畫。

幀率:測量顯示幀數的度量,也就是說每秒顯示幀數(fps)

一般來說30fps是可以接受的。但是將幀率提升至60fps就可以有明顯的互動感與逼真感。但是超過75fps則沒有明顯的流暢度了,因為顯示太快了。

3D:120HZ

液晶顯示器:60HZ

既然就是說,我們要求的是重新整理率越快越好,為什麼沒有必要追求太高的重新整理率呢?

原因就是說,在解析度不變的情況下,fps越高,則對顯示卡的處理能力要求也就越高。

電腦中所顯示的畫面,都是由顯示卡進行輸出的,因此螢幕上面的每一個畫素的填充都是由顯示卡來進行計算,輸出的。

我們舉個例子來說明一下啊,當畫面的解析度是

1024*76的時候,畫面的重新整理率要達到24/秒,,那麼顯示卡在一秒鐘需要處理的畫素量就達到1024*76*24

你想一下,如果幀率越高,那麼顯示卡1秒鐘處理畫素的能力是不是要進行提升呢。所以,我們不適宜設定很大的幀率,只要在合理範圍就可以了。顯示卡處理能力越大,畫面肯定就會不流暢。

一般來說到下一個畫面的切換時間幀速率為1/60秒,如果讓物體每幀增加3個畫素的距離,那麼1秒就會移動180個畫素的大小。

好了,拋棄上面不說,下面做一個讓一個應用程式從左往右移動,又從右往左移動。我們就倆讓qq這個應用程式來移動吧。

先來說一下,如何看電腦上的座標圖:

從電腦左上角開始,往下面是y軸,往右面是x軸。還有就是

system()這個函式可以向控制檯傳送指令。

來說一個cmd命令:

下面我們看一下面這個程式程式碼:

#include <stdio.h>

#include <stdlib.h>

#include <Windows.h>

//開啟qq應用程式

void openQQ()

{

ShellExecuteA(0, "open", "\"C:\\Program Files(x86)\\Thunder Network\\Thunder\\Program\\Thunder.exe\" -StartType:DesktopIcon", 0, 0, 3);

}

//關閉qq應用程式

void closeQQ()

{

system("taskkill /f /im Thunder.exe");//強制性結束程序

}

//模擬移動qq,從左向開始移動

void leftMoveQQ()

{

//一般從左開始移動,設定一個編號為0

int i = 0;

//要進行移動,就要先找到這個視窗的編號,也就是視窗控制代碼

HWND win1 = FindWindowA("XLUEFrameHostWnd", "迅雷7");//一個是類名,一個是標題

//對函式返回結果做一個處理

if (NULL == win1)

{

printf("沒有找到QQ這個應用視窗\n");

}

//下面就是找到了,處理一下程式的位置

SetWindowPos(win1, NULL, 0, 0, 400, 400, 0);//視窗編號,保留引數,座標,視窗的長度與寬度

//根據電腦解析度不同,來進行設定不同的移動長度

//我的電腦解析度是1366*768,加上本身qq就佔用了400的長度,所以,我就讓它移動966個畫素,差不多

while (i < 966)

{

//最開始的i是設定的為0,後來就要移動,按固定長度移動

SetWindowPos(win1, NULL, i, 0, 400, 400, 0);

//而且我們移動的中間,緩衝一秒鐘,不要移動的太快

Sleep(1000);//緩衝1

i += 30;//每次移動30個畫素,並且讓它移動的過程中若隱若現的移動

if (i / 10 % 2 == 1)

{

//如果十位數是奇數,就讓它隱藏

ShowWindow(win1, SW_HIDE);//讓視窗隱藏

}

else

{

ShowWindow(win1, SW_SHOW);//讓視窗顯示

}

}

}

//下面我們又要從右向左移動

void rightMoveQQ()

{

//這個時候就要從螢幕最右邊開始定位了

int i = 966;

HWND win1 = FindWindowA("XLUEFrameHostWnd", "迅雷7");//還是通過類名與標題來找到控制代碼

//對函式的返回結果我們必須要判定一下

if (NULL == win1)

{

printf("沒有找到QQ這個引用視窗\n");

}

//下面我們再來設定初始位置,從最右邊開始移動

SetWindowPos(win1, NULL,966, 0, 400, 400, 0);

//當位置小於0的時候,就不移動了

while (i > 0)

{

SetWindowPos(win1, NULL, i, 0, 400, 400, 0);

Sleep(1000);//緩衝1秒鐘

i -= 30;

}

}

//上面各項功能差不多就做好了,下面我們就要來寫入口函式

int main()

{

closeQQ();//在開啟前,我們先關閉之前開啟的QQ

openQQ();//開啟QQ

//在做一個死迴圈移動qq

while (1)

{

Sleep(3000);

leftMoveQQ();//從左開始移動qq

Sleep(3000);

rightMoveQQ();//從右開始移動QQ

}

system("pause");

return 0;

}

上面就是移動在螢幕上從左向右,又從右向左移動的一個小程式,下面我們讓它沿對角線移動,下面是程式程式碼:

#include <stdio.h>

#include <stdlib.h>

#include <Windows.h>

//我們還是先開啟QQ這個應用程式

void openQQ()

{

//先開啟應用程式

ShellExecuteA(0, "open", "\"C:\\Program Files(x86)\\Tencent\\QQ\\Bin\\QQScLauncher.exe\"", 0, 0, 3);//先來開啟這個引用程式

}

//然後關閉qq這個應用程式

void closeQQ()

{

system("taskkill /f /im QQProtect.exe");

}

//開始移動

void moveQQ()

{

//要移動一個視窗,我們必須先知道這個視窗的控制代碼

int i = 0;

HWND win1 = FindWindowA("TXGuiFoundation", "QQ");//一個是類名,一個是標題

//找到了之後,就開始設定一下它的初始位置

SetWindowPos(win1, NULL, 0, 0, 400, 400, 0);//初始位置,還有長度與寬度

//這裡關於沿對角線移動的一個設定,每個計算機解析度不一樣,自然也就不一樣

//x移動兩倍,y移動一倍,注意,引用視窗本身還有400的長度

while (i < 368)//768-400

{

//我們需要來設定一下位置

SetWindowPos(win1, NULL, 2 * i, i, 400, 400, 0);//每一次的i都是在不斷髮生變化的

Sleep(1000);//讓這個程式緩衝1秒執行

i += 10;

//讓視窗一閃一閃的移動

if ((i / 10 % 2) == 1)

{

//這個時候我們就隱藏視窗

ShowWindow(win1, SW_HIDE);//隱藏

}

else

{

ShowWindow(win1, SW_SHOW);//顯示

}

}

}

int main()

{

//把上面函式用起來就可以了

closeQQ();

openQQ();

while (1)

{

Sleep(2000);//緩衝兩秒鐘執行

moveQQ();//移動qq

}

system("pause");

return 0;

}

下面我們做一個植物大戰殭屍自動加血外掛:

首先,我們需要在電腦上面下載這款單機遊戲,然後執行:

然後開啟vs2013開發工具:

我們這裡的目標是,當太陽數小於100的時候,自動回升到200

其實也就是寫一個dll,然後載入到程式裡面去。

把原來的exe專案改成dll應用程式就可以了。

其實原理就是找到這個代表太陽數的變數,然後通過指標來做修改

我們必須通過一款軟體找到這個變數的地址:

比如CE軟體:


很明顯我們已經到了這個太陽的地址。

#include <Windows.h>

_declspec(dllexport) void change()

{

int *p = (int *)1FD87590;

while (1)

{

if (*p < 100)

{

*p = 200;

}

Sleep(2000);//每兩秒就檢查一次

}

}

上面就是目的碼

下面我們通過專案-》屬性->把配置型別變成dll檔案。

下面我們又要通過一款軟體把這個dll注入進去。注意要重新生成一下解決方案。注意在生成解決方案之前,就要把專案變成dll檔案,然後生成解決方案,不然不會成功。


上面找到dll注入就可以了。