植物大戰僵尸雜交版破解C++實現

文章目錄

  • 前言
  • 準備工作:基地址與偏移
  • UI界面設計和綁定
    • 項目模板
    • 總覽圖
    • 生成與實現
    • 信號處理
      • 1、陽光值更新:BTN1
      • 2、三種錢幣值更新:BTN2-BTN4
      • 3、冷卻刷新:BTN5
      • 4、鎖定陽光:check1
      • 5、無冷卻:check2
      • 6、OnTimer()和OnClose()處理函數
      • 7、其余未描述部分參考

前言

最近出來的PVZ雜交版又掀起一波熱潮,在各大短視頻平臺也有一席之地,借助工具Cheat Engine,寫了個簡單的植物大戰僵尸雜交版破解程序,話不多說,我們來看如何實現的。
工具:Cheat Engine、visual studio (MFC支持)、植物大戰僵尸雜交版

準備工作:基地址與偏移

通過CE尋找基地址的工作可以參考其他人的博客:
通過CE尋找游戲基址1
通過CE尋找游戲基址2
這里直接給出對應內容:【基址+偏移】
陽光值:0x006A9EC0 + 0x00000768 + 0x00005560
銀幣值:0x006A9EC0 + 0x0000082C + 0x00000208
金幣值:0x006A9EC0 + 0x0000082C + 0x0000020C
鉆石值:0x006A9EC0 + 0x0000082C + 0x00000210
冷卻值:0x006A9EC0 + 0x00000768 + 0x00000144 +{
0x00000070, 0x000000C0, 0x00000110, 0x00000160,
0x000001B0, 0x00000200, 0x00000250, 0x000002A0,
0x000002F0, 0x00000340, 0x00000390, 0x000003E0,
0x00000430, 0x00000480, 0x000004D0, 0x00000520
對應卡牌欄目第幾章卡牌,索引就是幾,實際上卡牌不會超過14張,只要給出14個就行了,找到前幾個偏移量之后可以按照規律往后推測。
}

UI界面設計和綁定

項目模板

使用MFC應用程序,選擇基于對話框選項

總覽圖

UI設計圖

生成與實現

1、依此雙擊按鈕、單選框,studio會自動建立信號與函數的映射。
2、Dlg.h中添加成員變量:

public:
UINT sunvalue;	//陽光
UINT money_a;	//銀幣
UINT money_b;	//金幣
UINT money_c;	//鉆石
int check1;		//鎖定陽光	check 的狀態
int check2;		//無冷卻	check 的狀態

3、Dlg.cpp中進行內容綁定:

void CPVZCrackerDlg::DoDataExchange(CDataExchange* pDX){CDialogEx::DoDataExchange(pDX);DDX_Text(pDX, IDC_EDIT1, sunvalue);	//將edit1的內容與sunvalue綁定,以下同理DDX_Text(pDX, IDC_EDIT2, money_a);	DDX_Text(pDX, IDC_EDIT3, money_b);	DDX_Text(pDX, IDC_EDIT4, money_c);	DDX_Check(pDX, CHECK1, check1);DDX_Check(pDX, CHECK2, check2);
}

4、如何讓check選擇時,實現陽光鎖定和刷新冷卻呢?
可以在check勾選時,開啟定時器,每隔0.5s進行模擬點擊刷新事件來達到效果
因此需要引入定時器模塊,給出相關博客(主要參考2)
MFC中如何使用定時器:1
MFC中如何使用定時器:2
創建出void XXXXXDlg::OnTimer(UINT_PTR nIDEvent)。
當勾選狀態時,打開計時器,未勾選狀態時,關閉計時器即可

5、經過上面的操作后,Dlg.h內容大致如下:


// PVZCrackerDlg.h: 頭文件
//#pragma once// CPVZCrackerDlg 對話框
class CPVZCrackerDlg : public CDialogEx
{
// 構造
public:CPVZCrackerDlg(CWnd* pParent = nullptr);	// 標準構造函數UINT sunvalue;	//陽光UINT money_a;	//銀幣UINT money_b;	//金幣UINT money_c;	//鉆石int check1;		//鎖定陽光	check 的狀態int check2;		//無冷卻	check 的狀態
// 對話框數據
#ifdef AFX_DESIGN_TIMEenum { IDD = IDD_PVZCRACKER_DIALOG };
#endifprotected:virtual void DoDataExchange(CDataExchange* pDX);	// DDX/DDV 支持// 實現
protected:HICON m_hIcon;// 生成的消息映射函數virtual BOOL OnInitDialog();afx_msg void OnPaint();afx_msg HCURSOR OnQueryDragIcon();DECLARE_MESSAGE_MAP()
public:afx_msg void OnBnClickedButton1();afx_msg void OnBnClickedButton2();afx_msg void OnBnClickedButton3();afx_msg void OnBnClickedButton4();afx_msg void OnBnClickedButton5();afx_msg void OnBnClickedCheck1();afx_msg void OnBnClickedCheck2();afx_msg void OnTimer(UINT_PTR nIDEvent);int TIM_X ;afx_msg void OnClose();
};

信號處理

1、陽光值更新:BTN1

void CPVZCrackerDlg::OnBnClickedButton1(){// 修改陽光UpdateData(TRUE);	//先進行數據更新HWND PVZ;			//獲取窗口句柄PVZ = ::FindWindow(L"MAINWINDOW", L"植物大戰僵尸雜交版v2.0");//這里需要對應游戲窗口名。DWORD pid = 0;GetWindowThreadProcessId(PVZ, &pid);	//獲取進程idHANDLE handle = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pid);//打開進程,獲取所有權SIZE_T ipread = 0;           //下面要用的參數,實際上往往忽略,但不寫又不行DWORD base = 0x006A9EC0;	 //數據基地址偏移量等由CE給出。DWORD offset1 = 0x00000768;DWORD offset2 = 0x00005560;//[A]->B 表示將A地址里的值拿到B中,不加[]代表立即數下文同理,如有錯誤歡迎指正//[base]->sunbaseDWORD sunbase = 0;ReadProcessMemory(handle, LPCVOID(base), &sunbase, sizeof(DWORD), &ipread);//[sunbase+offset1]->sunoffset1DWORD sunoffset1 = 0;ReadProcessMemory(handle, LPCVOID(sunbase + offset1), &sunoffset1, sizeof(DWORD), &ipread);//sunvalue -> [sunoffset1+offset2]DWORD svalue = sunvalue;WriteProcessMemory(handle, LPVOID(sunoffset1 + offset2), &svalue, sizeof(DWORD), &ipread);
}

2、三種錢幣值更新:BTN2-BTN4

void CPVZCrackerDlg::OnBnClickedButton2(){// TODO: 在此添加控件通知處理程序代碼// 修改銀幣UpdateData(TRUE);HWND PVZ;PVZ = ::FindWindow(L"MAINWINDOW", L"植物大戰僵尸雜交版v2.0");DWORD pid = 0;GetWindowThreadProcessId(PVZ, &pid);HANDLE handle = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pid);SIZE_T ipread = 0;           //下面要用的參數DWORD base = 0x006A9EC0;	 //數據基地址偏移量等由CE給出。DWORD offset1 = 0x0000082C;DWORD offset2 = 0x00000208;//[base]->moneybaseDWORD moneybase = 0;ReadProcessMemory(handle, LPCVOID(base), &moneybase, sizeof(DWORD), &ipread);//[moneybase+offset1]->moneyoffset1DWORD moneyoffset1 = 0;ReadProcessMemory(handle, LPCVOID(moneybase + offset1), &moneyoffset1, sizeof(DWORD), &ipread);//money_a -> [moneyoffset1+offset2]DWORD svalue = money_a;WriteProcessMemory(handle, LPVOID(moneyoffset1 + offset2), &svalue, sizeof(DWORD), &ipread);
}
void CPVZCrackerDlg::OnBnClickedButton3(){// TODO: 在此添加控件通知處理程序代碼// 修改金幣UpdateData(TRUE);HWND PVZ;PVZ = ::FindWindow(L"MAINWINDOW", L"植物大戰僵尸雜交版v2.0");DWORD pid = 0;GetWindowThreadProcessId(PVZ, &pid);HANDLE handle = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pid);SIZE_T ipread = 0;           //下面要用的參數DWORD base = 0x006A9EC0;	 //數據基地址偏移量等由CE給出。DWORD offset1 = 0x0000082C;DWORD offset2 = 0x0000020C;//[base]->moneybaseDWORD moneybase = 0;ReadProcessMemory(handle, LPCVOID(base), &moneybase, sizeof(DWORD), &ipread);//[moneybase+offset1]->moneyoffset1DWORD moneyoffset1 = 0;ReadProcessMemory(handle, LPCVOID(moneybase + offset1), &moneyoffset1, sizeof(DWORD), &ipread);//money_b -> [moneyoffset1+offset2]DWORD svalue = money_b;WriteProcessMemory(handle, LPVOID(moneyoffset1 + offset2), &svalue, sizeof(DWORD), &ipread);
}
void CPVZCrackerDlg::OnBnClickedButton4(){// TODO: 在此添加控件通知處理程序代碼// 修改鉆石UpdateData(TRUE);HWND PVZ;PVZ = ::FindWindow(L"MAINWINDOW", L"植物大戰僵尸雜交版v2.0");DWORD pid = 0;GetWindowThreadProcessId(PVZ, &pid);HANDLE handle = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pid);SIZE_T ipread = 0;           //下面要用的參數DWORD base = 0x006A9EC0;	 //數據基地址偏移量等由CE給出。DWORD offset1 = 0x0000082C;DWORD offset2 = 0x00000210;//[base]->moneybaseDWORD moneybase = 0;ReadProcessMemory(handle, LPCVOID(base), &moneybase, sizeof(DWORD), &ipread);//[moneybase+offset1]->moneyoffset1DWORD moneyoffset1 = 0;ReadProcessMemory(handle, LPCVOID(moneybase + offset1), &moneyoffset1, sizeof(DWORD), &ipread);//money_a -> [moneyoffset1+offset2]DWORD svalue = money_c;WriteProcessMemory(handle, LPVOID(moneyoffset1 + offset2), &svalue, sizeof(DWORD), &ipread);
}

3、冷卻刷新:BTN5

void CPVZCrackerDlg::OnBnClickedButton5(){// 修改冷卻UpdateData(TRUE);HWND PVZ;PVZ = ::FindWindow(L"MAINWINDOW", L"植物大戰僵尸雜交版v2.0");DWORD pid = 0;GetWindowThreadProcessId(PVZ, &pid);HANDLE handle = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pid);SIZE_T ipread = 0;           //下面要用的參數DWORD base = 0x006A9EC0;	 //數據基地址偏移量等由CE給出。DWORD offset1 = 0x00000768;DWORD offset2 = 0x00000144;DWORD offset3[16] = {0x00000070, 0x000000C0, 0x00000110, 0x00000160,0x000001B0, 0x00000200, 0x00000250, 0x000002A0,0x000002F0, 0x00000340, 0x00000390, 0x000003E0,0x00000430, 0x00000480, 0x000004D0, 0x00000520};//[base]->freshbaseDWORD freshbase = 0;ReadProcessMemory(handle, LPCVOID(base), &freshbase, sizeof(DWORD), &ipread);//[freshbase+offset1]->freshoffset1DWORD freshoffset1 = 0;ReadProcessMemory(handle, LPCVOID(freshbase + offset1), &freshoffset1, sizeof(DWORD), &ipread);//[freshoffset1+offset2]->freshoffset2DWORD freshoffset2 = 0;ReadProcessMemory(handle, LPVOID(freshoffset1 + offset2), &freshoffset2, sizeof(DWORD), &ipread);//1 ->[freshoffset2+offset3]DWORD freshvalue = 1;	//1代表冷卻完畢	其他代表正在冷卻for (int i = 0; i < 16; ++i)WriteProcessMemory(handle, LPVOID(freshoffset2 + offset3[i]), &freshvalue, sizeof(DWORD), &ipread);
}

4、鎖定陽光:check1

void CPVZCrackerDlg::OnBnClickedCheck1(){// TODO: 在此添加控件通知處理程序代碼CButton* pBtn = (CButton*)GetDlgItem(CHECK1);int checked = pBtn->GetCheck();	//獲取check狀態//實際上可以直接check1switch (checked){case 1: {SetTimer(1, 500, NULL);	//設置500ms為周期的定時器,標簽為1,并開啟break;}case 0: {KillTimer(1);			//關閉標簽為1的定時器break;}default:break;}
}

5、無冷卻:check2

void CPVZCrackerDlg::OnBnClickedCheck2(){// TODO: 在此添加控件通知處理程序代碼CButton* pBtn = (CButton*)GetDlgItem(CHECK2);int checked = pBtn->GetCheck();switch (checked) {case 1: {SetTimer(2, 500, NULL);break;}case 0: {KillTimer(2);break;}default:break;}
}

6、OnTimer()和OnClose()處理函數

void CPVZCrackerDlg::OnTimer(UINT_PTR nIDEvent)
{// TODO: 在此添加消息處理程序代碼和/或調用默認值switch (nIDEvent){case 1: OnBnClickedButton1(); break;case 2: OnBnClickedButton5(); break;default:break;}CDialogEx::OnTimer(nIDEvent);
}void CPVZCrackerDlg::OnClose()
{// TODO: 在此添加消息處理程序代碼和/或調用默認值KillTimer(1);KillTimer(2);CDialogEx::OnClose();
}

7、其余未描述部分參考


// PVZCrackerDlg.cpp: 實現文件
#include "pch.h"
#include "framework.h"
#include "PVZCracker.h"
#include "PVZCrackerDlg.h"
#include "afxdialogex.h"#ifdef _DEBUG
#define new DEBUG_NEW
#endif// CPVZCrackerDlg 對話框
CPVZCrackerDlg::CPVZCrackerDlg(CWnd* pParent /*=nullptr*/): CDialogEx(IDD_PVZCRACKER_DIALOG, pParent){m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);check1 = 0;check2 = 0;sunvalue = 5000;money_a = 10000;money_b = 10000;money_c = 10000;TIM_X = 0;
}void CPVZCrackerDlg::DoDataExchange(CDataExchange* pDX){CDialogEx::DoDataExchange(pDX);DDX_Text(pDX, IDC_EDIT1, sunvalue);	//將edit1的內容與sunvalue綁定,以下同理DDX_Text(pDX, IDC_EDIT2, money_a);	DDX_Text(pDX, IDC_EDIT3, money_b);	DDX_Text(pDX, IDC_EDIT4, money_c);	DDX_Check(pDX, CHECK1, check1);DDX_Check(pDX, CHECK2, check2);
}BEGIN_MESSAGE_MAP(CPVZCrackerDlg, CDialogEx)ON_WM_PAINT()ON_WM_QUERYDRAGICON()ON_BN_CLICKED(IDC_BUTTON1, &CPVZCrackerDlg::OnBnClickedButton1)ON_BN_CLICKED(IDC_BUTTON2, &CPVZCrackerDlg::OnBnClickedButton2)ON_BN_CLICKED(IDC_BUTTON3, &CPVZCrackerDlg::OnBnClickedButton3)ON_BN_CLICKED(IDC_BUTTON4, &CPVZCrackerDlg::OnBnClickedButton4)ON_BN_CLICKED(IDC_BUTTON5, &CPVZCrackerDlg::OnBnClickedButton5)ON_BN_CLICKED(CHECK1, &CPVZCrackerDlg::OnBnClickedCheck1)ON_BN_CLICKED(CHECK2, &CPVZCrackerDlg::OnBnClickedCheck2)ON_WM_TIMER()ON_WM_CLOSE()
END_MESSAGE_MAP()// CPVZCrackerDlg 消息處理程序BOOL CPVZCrackerDlg::OnInitDialog()
{CDialogEx::OnInitDialog();// 設置此對話框的圖標。  當應用程序主窗口不是對話框時,框架將自動//  執行此操作SetIcon(m_hIcon, TRUE);			// 設置大圖標SetIcon(m_hIcon, FALSE);		// 設置小圖標// TODO: 在此添加額外的初始化代碼this->SetWindowTextW(L"植物大戰僵尸雜交版破解 by 和八哥的環球探險");return TRUE;  // 除非將焦點設置到控件,否則返回 TRUE
}// 如果向對話框添加最小化按鈕,則需要下面的代碼來繪制該圖標。對于使用文檔/視圖模型的 MFC 應用程序,這將由框架自動完成。void CPVZCrackerDlg::OnPaint()
{if (IsIconic()){CPaintDC dc(this); // 用于繪制的設備上下文SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);// 使圖標在工作區矩形中居中int cxIcon = GetSystemMetrics(SM_CXICON);int cyIcon = GetSystemMetrics(SM_CYICON);CRect rect;GetClientRect(&rect);int x = (rect.Width() - cxIcon + 1) / 2;int y = (rect.Height() - cyIcon + 1) / 2;// 繪制圖標dc.DrawIcon(x, y, m_hIcon);}else{CDialogEx::OnPaint();}
}//當用戶拖動最小化窗口時系統調用此函數取得光標
//顯示。
HCURSOR CPVZCrackerDlg::OnQueryDragIcon()
{return static_cast<HCURSOR>(m_hIcon);
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/24581.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/24581.shtml
英文地址,請注明出處:http://en.pswp.cn/web/24581.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

git合并多個項目并保留提交版本記錄

目錄 一、場景 二、合并步驟 1.本地新建 all 目錄&#xff0c;并初始化 2.在 all 中添加 a&#xff0c;b&#xff0c;c 的遠程分支 3.驗證是否添加成功 4.在 all 目錄下&#xff0c;獲取 a, b,c 的 master 分支數據 5.合并項目并移動到子目錄中 6.推送 all 的 master 分支…

二開版微交易系統

下載地址&#xff1a;二開版微交易系統

集成學習概述

概述 集成學習(Ensemble learning)就是將多個機器學習模型組合起來&#xff0c;共同工作以達到優化算法的目的。具體來講&#xff0c;集成學習可以通過多個學習器相結合&#xff0c;來獲得比單一學習器更優越的泛化性能。集成學習的一般步驟為&#xff1a;1.生產一組“個體學習…

實戰 | YOLOv10 自定義數據集訓練實現車牌檢測 (數據集+訓練+預測 保姆級教程)

導讀 本文主要介紹如何使用YOLOv10在自定義數據集訓練實現車牌檢測 (數據集訓練預測 保姆級教程)。 YOLOv10簡介 YOLOv10是清華大學研究人員在Ultralytics Python包的基礎上&#xff0c;引入了一種新的實時目標檢測方法&#xff0c;解決了YOLO以前版本在后處理和模型架構方面…

規范系統運維:系統性能監控與優化的重要性與實踐

在當今這個高度信息化的時代&#xff0c;企業的IT系統運維工作顯得尤為關鍵。其中&#xff0c;系統性能監控和優化是運維工作中不可或缺的一環。本文旨在探討規范系統運維中系統性能監控與優化的重要性&#xff0c;并分享一些實踐經驗和策略。 一、系統性能監控與優化的重要性…

RAGFlow 學習筆記

RAGFlow 學習筆記 0. 引言1. RAGFlow 支持的文檔格式2. 嵌入模型選擇后不再允許改變3. 干預文件解析?4. RAGFlow 與其他 RAG 產品有何不同&#xff1f; ?5. RAGFlow 支持哪些語言&#xff1f; ?6. 哪些嵌入模型可以本地部署&#xff1f; ?7. 為什么RAGFlow解析文檔的時間比…

自動化裝箱封箱解決方案:深度探討其優勢及故障處理技巧

在當今這個快節奏、高效率的時代&#xff0c;自動化裝箱封箱解決方案以其獨特的優勢&#xff0c;正逐漸成為物流、倉儲等行業的新寵。它不僅能大幅提升作業效率&#xff0c;還能顯著降低人工成本&#xff0c;減少人為錯誤。星派將深度探討自動化裝箱封箱技術的顯著優勢&#xf…

【Vue】練習-mutations的減法功能

文章目錄 一、需求二、完整代碼 一、需求 步驟 二、完整代碼 Son1.vue <template><div class"box"><h2>Son1 子組件</h2>從vuex中獲取的值: <label>{{ $store.state.count }}</label><br><button click"handleA…

C# 界面控件中英切換

編程軟件:VS 2015 需求:界面有兩個按鈕&#xff0c;點擊可以將界面上所有控件進行不同語言的切換。 一共兩種方案&#xff0c;個人認為第二種方案使用范圍更廣&#xff08;這里以中英文切換為例&#xff09;。 方案一:如圖所示&#xff0c;建立兩個資源文件 將所需控件的中英…

海思SS928(SD3403)部署YOLOv5-YOLOv7步驟詳解

1. YOLO模型資料 本文檔內容以yolov5-7.0工程、yolov5s模型為例。 a. 模型結構 詳細的模型結構可以利用netron工具打開.pt或.onnx模型查看。 b. 模型參數即驗證結果 其中,YOLOv5n、YOLOv5s、YOLOv5m、YOLOv5l、YOLOv5x為五種類型的預訓練模型,其包含的檢測類別相…

利用Pandas進行數據清洗與過濾:Python實戰指南

利用Pandas進行數據清洗與過濾&#xff1a;Python實戰指南 作為一個Python愛好者和數據分析從業者&#xff0c;我一直在探索如何利用Python來更高效地處理和分析數據。Python語言以其簡單易學、功能強大的特點&#xff0c;成為了數據分析領域的寵兒。本文將分享一些實用的Pyth…

2024 cicsn ezbuf

文章目錄 參考protobuf逆向學習復原結構思路exp 參考 https://www.y4ng.cn/posts/pwn/protobuf/#ciscn-2024-ezbuf protobuf 當時壓根不知道用了protobuf這個玩意&#xff0c;提取工具也沒提取出來&#xff0c;還是做題做太少了&#xff0c;很多關鍵性的結構都沒看出來是pro…

android 異屏同顯---學習筆記

實現 Android 異屏同顯(多個屏幕顯示同樣的畫面)可以通過多種方法來完成,具體實現方式會根據你的需求和設備的支持情況有所不同。以下是幾種常見的方法: 方法 1:使用 Cast SDK 如果你想要將內容投屏到智能電視或其他支持 Cast 的設備上,可以使用 Google Cast SDK。 主…

Unity 集成 FMOD 音頻管理插件 2.02

Unity 集成 FMOD 音頻管理插件 2.02 3. 集成教程&#xff1a;3.1 設置Unity項目3.2 設置FMOD項目3.3 設置 FMOD for Unity3.4 添加聲音&#xff1a;卡丁車引擎3.5 添加聲音&#xff1a;氛圍3.6 添加聲音&#xff1a;音樂3.7 刪除現有音頻3.8 下一步 10. 腳本 API 參考10.1 基礎…

Java鎖的四種狀態(無鎖、偏向級鎖、輕量級鎖、重量級鎖)

介紹 首先&#xff0c;我們需要明確一點&#xff1a;偏向級鎖、輕量級鎖、重量級鎖只針對synchronized 鎖的狀態總共有四種&#xff0c;級別由低到高依次為&#xff1a;無鎖、偏向鎖、輕量級鎖、重量級鎖。 這四種鎖狀態分別代表什么&#xff0c;為什么會有鎖升級&#xff…

在UI界面中實現3d人物展示

簡要原理(設置雙攝像機): 為需要展示的3D人物單獨設置一個攝像機(只設置為渲染人物層級),主要攝像機的方向與人物方向一致,但攝像機需要需要旋轉180,設置的角度自行進行微調創建一個Render Texture類型的組件用于存儲攝像機渲染的內容UI上設置需要展示的圖片區域,圖片…

遍歷目錄

自學python如何成為大佬(目錄):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 遍歷在漢語中的意思是全部走遍&#xff0c;到處周游。在Python中&#xff0c;遍歷是將指定的目錄下的全部目錄&#xff08;包括子目錄&#xff09;及…

聰明人社交的基本順序:千萬別搞反了,越早明白越好

聰明人社交的基本順序&#xff1a;千萬別搞反了&#xff0c;越早明白越好 國學文化 德魯克博雅管理 2024-03-27 17:00 作者&#xff1a;方小格 來源&#xff1a;國學文化&#xff08;gxwh001&#xff09; 導語 比一個好的圈子更重要的&#xff0c;是自己優質的能力。 唐詩宋…

【重學C語言】十九、SDL2 圖形化編程的使用

【重學C語言】十九、SDL2 圖形化編程的使用 SDL2 的第一個程序渲染器紋理渲染1. 紋理的概念2. 加載紋理3. 渲染紋理4. 紋理設置和查詢5. 紋理渲染流程6. 注意事項SDL2_imageSDL2 的第一個程序 #define SDL_MAIN_HANDLED #include <SDL.h>int main(int argc, char* argv[…

AH股高開低走,創業板跌超2%,寧德時代下挫6%,微盤股指數反彈超5%

創業板跌2%&#xff0c;權重股寧德時代跌近6%&#xff1b;地產、光刻機概念股逆勢大漲&#xff1b;券商股午后集體下跌&#xff0c;天風證券一度跌停。微盤股指數經歷連跌后早盤反彈超5%。 內容提要 周五&#xff0c;A股高開后回落&#xff0c;午盤震蕩回升。截至收盤&#x…