#include <stdio.h>   包含輸出入函式庫
#include <stdlib.h> C++標準庫文件之一,包含大量函數原型
#include <conio.h> DOS視窗輸出入函數庫,基本上<stdio.h>都有,但還是要看編譯工具
#include <iostream> 標準的輸入(cin)/輸出(cout)流 標頭文件,C++最基本添加文件。

winage 發表在 痞客邦 留言(0) 人氣()

1、點 "偵錯"
2、然後"選項和設定"
3、右邊勾上"啟用來源服務器支援"
4、左邊點"符號"
5、打勾"微軟符號服務器"
6、跑的時候會自動下載更新!!!

winage 發表在 痞客邦 留言(0) 人氣()

兩個不會自動關閉式窗的方法
1: _getch()
2:system(“pause”)的宣告在 stdlib.h 中
在#include <stdio.h>差入一列,#include <stdlib.h>

winage 發表在 痞客邦 留言(0) 人氣()

這篇文章受密碼保護,請輸入密碼後查看內容。

winage 發表在 痞客邦 留言(0) 人氣()

在转入正题之前,我觉得应该先提出两个我本人自定义的术语:类级成员(class level member)和对象级成员(object level member)。我不知道在C++领域里是否已经有这样的术语,只是我觉得这两个术语可以很好地帮助我们理解static member function。在这里可以就有人想指正我了:本来成员(member)就是类独有的一部分,还分什么类级和对象级的。但我相信如果你看完本文后,你原来对static member function的那种一知半解,会演变成现在的“原来是这么一回事”的话,你会觉得这是非常棒的两个东西。所谓的类级成员就是指该成员是属于类拥有的,一个类只有一个的;而所谓的对象级成员就是指该成员是属于对象自己的,只要产生多少个该类的对象就会产生出多少个这样的成员。如果你还是没有理解其中的意思的话,不要紧,往下看吧,慢慢你就会明白了(其实也没什么,也只是static member与non static member的区别而已,只是我觉得这样更利于理解而已)。

winage 發表在 痞客邦 留言(0) 人氣()

首先介绍一下C语言中的结构。对于一个结构来说, 
struct MyStruct { 
int member_a; 
}; 
如果有个变量MyStruct s,那么使用其中的成员元素时可以用 
s.member_a = 1; 
如果采用指针方法访问,比如MyStruct * ps,那么同样的访问必须用箭头号: 
ps->member_a = 1; 

::只用在类成员函数和类成员变量中。比如,声明一个类: 
class CA { 
public: 
int ca_var; 
int add(int a, int b); 
int add(int a); 
}; 
那么在实现这个函数时,必须这样书写: 
int CA::add(int a, int b) 

return a + b; 

另外,双冒号也常常用于在类变量内部作为当前类实例的元素进行表示,比如: 
int CA::add(int a) 

return a + ::ca_var; 

表示当前类实例中的变量ca_var。

winage 發表在 痞客邦 留言(0) 人氣()

這篇文章受密碼保護,請輸入密碼後查看內容。

winage 發表在 痞客邦 留言(0) 人氣()

這篇文章受密碼保護,請輸入密碼後查看內容。

winage 發表在 痞客邦 留言(0) 人氣()

這篇文章受密碼保護,請輸入密碼後查看內容。

winage 發表在 痞客邦 留言(0) 人氣()

BiteFight 简单外挂开发之IE篇 最近在玩BiteFight(黑暗传说),这是一个简单的休闲性质的网页游戏,模式就是练功、做任务、升级,类似于文字MUD。因为手动练功做任务太麻烦了,而且不能7*24小时进行,于是想做一个外挂。 做的思路有很多,我选择了其中比较简单的两种: 一、基于IE的HtmlView用VC做一个程序,每次刷新页面的时候执行JavaScript任务脚本; 二、做一个FireFox扩展(extension),监听“DOMContentLoaded”事件,执行JavaScript任务





 


 BiteFight 简单外挂开发之IE篇 

最近在玩BiteFight(黑暗传说),这是一个简单的休闲性质的网页游戏,模式就是练功、做任务、升级,类似于文字MUD。因为手动练功做任务太麻烦了,而且不能7*24小时进行,于是想做一个外挂。

做的思路有很多,我选择了其中比较简单的两种:
一、基于IE的HtmlView用VC做一个程序,每次刷新页面的时候执行JavaScript任务脚本; 
二、做一个FireFox扩展(extension),监听“DOMContentLoaded”事件,执行JavaScript任务脚本。
两种思路我都做了实现,而且运行良好,但是FireFox extension具有一些优势,我将在文章的末尾进行比较。(游戏明确反外挂,所以只提供源码片段和演示程序(适用S1服务器):下载(请用浏览器右键菜单\目标另存为,需更改后缀名) )

本篇着重介绍基于IE的HtmlView的关键开发步骤和部分代码:
1. 创建一个基于HtmlView的单文档应用;
2. 增加菜单项,例如:“Robbery Human”,并增加处理函数

void CWebMudView::OnStartRobberyHuman()
{
    m_iCurrentWorkType = ERobberyHuman;  // 设置当前的任务类型

    CString url;
    url.LoadString(IDS_STRING_ATTACK_URL);  // 从Resource 中读取Robbery Human的页面url

    // 把任务脚本内容读取到m_strCurrentScript变量中
    GetFileContent(GetCurrWorkingDir() + "\\RobberyHuman.js", m_strCurrentScript); 
    
    Navigate2(url, NULL, NULL);
}
 

3. 重载HtmlView的OnDocumentComplete()虚函数

void CWebMudView::OnDocumentComplete(LPCTSTR lpszURL)
{
    CString title;
    title.Format("[%s] %s", WorkTypeArray[m_iTargetWorkType], lpszURL);
    gGetMainFrame()->UpdateTitle(title);

    switch(m_iCurrentWorkType)        
    {
    ....
    case ERobberyHuman:
        m_iCurrentWorkType = EIdle;   // 把当前的任务类型置空,防止重入
        RunScript(m_strCurrentScript);  
        break;
    ....
    }

    CHtmlView::OnDocumentComplete(lpszURL);
}
 

4. 增加执行JavaScript脚本函数
void CWebMudView::RunScript(CString strCode)
{
    CString strLang("javascript");
    //
    LPDISPATCH pDisp = NULL;
    IHTMLDocument2 *pHTMLDoc = NULL;
    IHTMLWindow2 *pHTMLWnd = NULL;

    try{
        if (!(::IsWindow(this->m_hWnd)))//!! must do this, for m_hWnd=0xcccc
            return;

        pDisp = this->GetHtmlDocument();
        if( pDisp )
        {
            if (SUCCEEDED(pDisp->QueryInterface(IID_IHTMLDocument2, (void**)&pHTMLDoc)))
            {
                if(SUCCEEDED(pHTMLDoc->get_parentWindow( &pHTMLWnd )))
                {
                    BSTR bstrCode = strCode.AllocSysString();
                    BSTR bstrLang = strLang.AllocSysString();
                    VARIANT vRet;
                    vRet.vt = VT_BOOL;
                    BOOL bRet = SUCCEEDED(pHTMLWnd->execScript(bstrCode,bstrLang,&vRet));  // 执行脚本
                    if (bRet==FALSE && m_bShowScriptResult)
                    {
                        TRACE("\n!!!!!!!!!!!!!!!!Run Script error!!!!!!!!!!!!!!!!!\n");
                        AfxMessageBox("Run Script error!!");
                    }
                    SysFreeString(bstrCode);
                    SysFreeString(bstrLang);
                }
            }
        }
    }catch(...){}

    try{
        if(pHTMLWnd != NULL)    pHTMLWnd->Release();
        if(pHTMLDoc != NULL)    pHTMLDoc->Release();
        if(pDisp != NULL)        pDisp->Release();
    }catch(...){}
}
 

5. 编译生成可执行文件
6. 编写RobberyHuman.js,并保存到可执行文件所在的目录
function robbery()
{
  // 如果当前页面不是robbery页面,则延迟并跳转到robbery页面
    if (document.URL.indexOf("robbery.php") == -1)    {
        // alert("Wrong page!!!");
        window.setTimeout("window.location.href='http://s2.bitefight.cn/bite/robbery.php';", 5*1000);
        return;
    }

    if (document.forms.length > 0) {
      // 分析form,提交post请求
        if (document.getElementById('mjz')==null) {
            alert("Robbery human times to max!!");
        } else {
            window.setTimeout("document.forms[0].submit();", 5*1000);
        }
    }
}
robbery();

7. 运行测试

注:外挂的核心其实是JavaScript脚本,可以做的很复杂,自动完成许多任务。


基于IE的BiteFight外挂 


在我的机器上我实现的功能主要包括:
1. Work : robbery human->work->robbery->...
  1) robbery human every 10 minutes to max times, or failed, goto 2); 
  2) work in tomb for one hour, then goto 1)
2. Protect your Hero : robbery human->robbery hero->work->robbery human->.....
  1) robbery human every 10 minutes to max times, or failed, goto 2);
  2) robbery Hero, or failed, goto 3)
  3) work in tomb for one hour, then goto 1)
3. Training Upgrade : work->robbery human->training->work->....
  1) work in tomb for one hour, then goto 2)
  2) robbery human every 10 minutes to max times, or failed, goto 3)
  3) try to upgrade you skill's level, or failed, goto 1)

由于BiteFight使用cookie保存session, 每次提交form的时候都会提交保存的session,而IE只有一个profile,共用cookie,因此只能保存一个session,所以基于IE的HtmlView实现外挂在同一台PC上只能运行一个,无法同时练多个Hero。而在同一台PC上可以运行多个FireFox,其中每个FireFox使用自己的profile/cookie,所以基于FireFox Extension的外挂可以同时运行多个。






winage 發表在 痞客邦 留言(0) 人氣()

想要在javascript 做自動close browser 時會發現無法關閉

或 出現提示使用者"是否要關閉視窗" 的訊息

可以使用解決方法為
window.opener=Null  (可以解決IE7 提示使用者是否要close的訊息)
在某種情況下做window.close會沒有反應
需要改由
top.window.close();
便可以正常close

winage 發表在 痞客邦 留言(0) 人氣()

這篇文章受密碼保護,請輸入密碼後查看內容。

winage 發表在 痞客邦 留言(0) 人氣()

« 1 2 3
Blog Stats
⚠️

成人內容提醒

本部落格內容僅限年滿十八歲者瀏覽。
若您未滿十八歲,請立即離開。

已滿十八歲者,亦請勿將內容提供給未成年人士。