会游戏学生端程序破解代码代码破解的有吗高额悬赏

  在航海时代中,涌现了一批又一批的豪杰,其中也不乏女性大海贼哦!在女性海贼中,baby5就是其中的一位。她不仅在动漫中有着超凡的实力,在8090手游《航海传奇》游戏中一样是一位强悍的S级人物哦!
  baby5在唐吉诃德海贼团隶属代号黑桃&琵卡军&的杀手兼女仆,穿着女仆装和高跟鞋,嘴上叼著一根烟的黑色长发女子,第一人称&老娘&,是武器果实能力者,武器人,身体任何部位都可以变化为各种武器,亦能借此和巴法罗发动合体技。
  游戏中她的自带技能也完美的凸显了果实的能力,是航海传奇中一个强大的单体技能哦!同时她的羁绊也不是那么难凑集,比如别致眼镜:装备时尚墨镜,攻击力提示18%。这个就是玩家比较容易获得的装备了。
  8090手游《航海传奇》是根据动漫海贼王改编的卡牌手游,酷炫的霸气能力,贴近原著的剧情,技能和伙伴,乘上蓄势待发的太阳号,一起征服伟大航路吧!现在就进入到官网下载吧。游戏10大未解之谜:古墓丽影真的有18禁代码? - 游戏圈 - 电玩巴士
| | | | | | | | | | | |
游戏10大未解之谜:古墓丽影真的有18禁代码?
作者:佚名 来源:互联网发布时间: 10:39:43
  自电子游戏出现早期,年轻的玩家们在校园里私下分享各自的小秘密,并且花了不少时间试图实现最荒诞的游戏传说。有些孩子听说死党的堂兄在《口袋妖 怪》里的卡车下面找到“梦幻”(超能力系神奇宝贝);另一些孩子则深信通过一种秘籍可以在《萨尔达传说:时之笛》里找到“众神的三角”。在通过因特网互相 联系集思广益之前,能够入侵游戏破解代码的玩家,可以变不可能为可能,实现各种校园耳语。
  因为这些想法有趣,吸引眼球抑或仅仅容易误导人;加上我们喜欢揭露真相;现在我们推出十个最常见的电子游戏迷思。
  10.《古墓丽影》的裸体代码
  1996年,《古墓丽影》的面世让世人眼前一亮。一直以来,我们都在企盼一种充满冒险气氛的印第安纳琼斯(Indiana Jones)式的探险游戏,里面有古代的遗迹,神秘的宝藏和恐龙。劳拉?克劳福特(Lara Croft)成为游戏的新偶像,只是由于她那跟游戏同样吸引人的外表而已。这位丰满的冒险家是一个强壮独立的角色,但是其外形设计勾起了男性的性幻想。流 言蜚语自然而然地迅速蔓延开来――据说有裸体代码能把《古墓丽影》中的劳拉(Lara)脱的如婴儿般一丝不挂。
  这种代码根本不存在。但这并不能让玩家们停下尝试的脚步。虚假的代码和秘籍遍布1997年早期的互联网并贯穿于整个游戏文化。其实《古墓丽影》确有 代码帮助玩家实现其他目的而非使劳拉?克劳福特(Lara Croft)裸体。尽管只是流言,《古墓丽影》裸体代码时至今日仍臭名远扬,而劳拉?克劳福特(Lara Croft)成为游戏性感尤物也很好地说明了这一点。
  最终,恶作剧的玩家笑到了最后。虽然没有任何内置裸体角色的《古墓丽影》,游戏修改人员最终还是开发出了以劳拉为模板的裸体角色补丁,该补丁可安装于电脑版《古墓丽影》。
  9.你可以用PS2的芯片来生成导弹系统
  在2000年末期,无论是秘密情报网还是主流媒体都开始报道,伊拉克总统萨达姆?侯赛因(Saddam Hussein)开始大量囤积当年秋天刚上市的PS2。不到一个月的时间,超过4000个游戏机被运往伊拉克,绕开了十年前联合国就施行的伊拉克武器禁运令。
  毕竟,这些游戏机本质上是孩子们的玩具,那么到底哪里能有杀伤力呢?关于贮存PS2(经常是头条新闻)的报道深度延伸,得到了一个令人惊恐的想法 ――侯赛因(Hussein)看中的是那些游戏机的芯片!基地头目竟然找到了禁运令的漏洞,并打算通过10-20台游戏机的连通来制造出一个强大到能够指 挥导弹系统的超级计算机,这种想法使恐慌开始蔓延。
  然而,这种担忧一出现就在现实面前不攻自破了。从技术层面上来讲,确实能做到连接一系列PS2处理器并把它们的128位处理器联通使用,但是这需要一种独特的软件,在PS2上市后,花数年才能研发出来。换句话说,这个传说纯属神话。
  8.电子游戏导致暴力
  迪伦?克莱伯德(Dylan Klebold)和埃里克?哈里斯(Eric Harris),这两位狂热的“毁灭战士”(Doom)青少年玩家,在1999年制造了科罗拉多州杰佛逊郡科伦拜中学校园(Columbine High School massacre in Littleton, Colo.)枪击案(美国历史上最血腥的校园枪击案)。德国十七岁的少年提姆?克雷舒默(Tim Kretschmer)用他在“反恐精英”(Counter Strike)中偷学而来的招式杀了15个人。当青少年有暴力行为时,他们之前所玩的那些暴力血腥的游戏通常会被引用为他们犯罪倾向的理由。逻辑方面可以 简单地总结为:暴力性电子游戏会让孩子变得暴力。
  这种想法是我们的传统观点,然而许多关于儿童和暴力性电子游戏的研究中呈现出了与之相反的事实证据。2005年的一项研究,被调查者从14岁到68 岁,他们被要求在一个月中花56个小时来玩大型多人角色扮演游戏(MMRPG) “阿瑟龙的召唤2”(Asheron’s Call 2),结果发现参与的玩家在游戏后没有任何暴力行为的显著变化。研究人员还发现,相比于控制组那些没有参与游戏的人来说,游戏玩家的攻击性也没有增加。
  尽管心理学家认为许多研究将现实社会中的暴力和电子游戏相结合是带有偏见的,但是其他研究得出了不同的结论。人们发现,没有什么比犯罪统计更能瓦解 电子游戏能增加现实社会中的暴力行为这种荒谬的说法。人们持续销售电子游戏――销售额从1997年的55亿美元增加到2007年的95亿美元――青少年的 暴力犯罪行为实际上下降了。1999年,美国有1763名未满十八岁少年因杀人而被捕,而到了2007年,这个年龄段因杀人被捕的是1063人。
  7.女孩子不打电玩
  在20世纪80年代初期,家庭电子游戏机刚开始普及,游戏是没有性别的――至少是男女皆宜的。游戏名如“青蛙过河”(Frogger),“挖金子” (Dig-Dug)和“波特Q精灵”(Q-Bert),没有任何性别偏见,也没有归类为男生游戏或者女生游戏。然而,随着游戏变得更加复杂,游戏名开始更 男性化。
  人们对电子游戏的认知仍旧停留在它是几乎严格意义上的男孩子的娱乐,甚至那些名字明显有些女气的游戏流行度都不太高这种事情也佐证了这种观点。但 是,在PS上“合金装备”(Metal Gear Solid)的销量大大高于芭比娃娃(Barbie)就意味着女孩子们不玩电子游戏吗?答案当然是否定的。
  事实上,自2008年一月到八月,18-45岁的女性紧随这个年龄段的男性之后成为了在电子游戏产业第二挥金如土的玩家
  6.《侠盗猎车手:圣安地列斯》(Grand Theft Auto: San Andreas)里的爱爱小游戏
  游戏开发商Rockstar Games的《侠盗猎车手》系列做得十分出色,但是当媒体的焦点集中在一个叫做热咖啡(Hot Coffee)的新增游戏程序时,这个游戏陷入了困境。游戏破解者在玩《侠盗猎车手:圣安地列斯》时发现一个肆意放荡的爱爱小游戏――游戏中女友邀请玩家 到家中喝咖啡,随后进行性交。政客对此十分愤慨并和媒体一起谴责这个新增游戏程序,随后娱乐软件定级委员会( Entertainment Software Ratings Board)对游戏玩家年龄重新进行评定,从原来青少年到成年之间的模糊界限改为法定的成人年龄。Rockstar Games只得再次将改动后的游戏发行到电脑,家用电视游戏机,微软游戏站,而这次改动耗费了仟游软件科技公司(Take-Two Interactive)几百万美元。
  其实Hot Coffee的丑闻是匪夷所思的:几乎没有人玩过Hot Coffee。它也不算是游戏的一部分,人们根本玩不了。但是游戏代码还是留在游戏光盘中,游戏破解者发现了它。不过Hot Coffee只有修改游戏程序才可以玩。在电脑上改并不难,但如果是改动游戏机版本上的代码就复杂多了。
  5. 孩子的视频游戏
  这个消息令人震惊:孩子们很喜欢打视频游戏。这是真的!世界上有几百万的孩子喜欢马里奥、索尼、比卡丘和其他视频游戏。但是也有成年人喜欢这些游 戏,他们伴随着“马里奥兄弟”、“刺猬索尼克”和雅达利公司的其他游戏长大,现在成人了,仍然很喜欢这些游戏。反过来说,视频游戏产业也陪伴着这些人成 长,制造出更多像“使命召唤”这样复杂和暴力的限制级单机游戏。
  2011年,53%的玩家年龄范围在18岁到49岁。他们平均年龄是37,这个平均年龄让人有点意外,因为比想象中要大。然而像网站游戏 (Flash Web browser games)和任天堂的“wii sports”和“Wii fit”(译者注:一种体感游戏)这样休闲游戏,让 老年人也成为了玩家。29%的玩家是50岁或50岁以上的人。
  根据美国娱乐软件协会(Entertainment Software Association)的统计,18岁以下的玩家只有18%。虽然仍有许多游戏是为儿童开发的,但是玩家的平均年龄在不断变大。
  4.《疯狂橄榄球》诅咒
  至于那些愚蠢的电子游戏传言遍布坊间,这一条是相当可怕的。2000年左右,游戏开发商和发行商电子艺界公司(Electronic Arts)开始每年在其广受欢迎的《疯狂的橄榄球》游戏封面贴上橄榄球运动员的特写。奇怪的事情发生了。随后几年,几乎每位上过封面的球员都因伤告别随后 的赛季。还有一些球员在比赛中毫无表现。球星们看起来被《疯狂橄榄球》诅咒打得东倒西歪。
  当然,有一个关于该诅咒的合理解释。被挑选做封面人物的球员通常刚经历过一个伟大的赛季;而橄榄球是一项很艰苦的运动。这种情况在全美橄榄球联赛 (NFL) 中一直存在:一些球员在有的赛季表现糟糕,还有一些则遭遇伤病。诅咒是众所周知的,但这并不意味着登上游戏的封面就会着魔术般地导致球员扭伤脚踝。
  3.电子游戏导致社会隔离
  电子游戏文化以作为那些呆板阿宅们的兴趣而自豪――这些游戏玩家窝在自家中或者妈妈的地下室里夜以继日的面对着电视机屏幕,从不出去和同龄人社交一 下。即使游戏画面对某些玩家来说可能很逼真,那些电子游戏迷的反社交阴影仍旧一点也没有少。自从20世纪90年代,网络连接成为了电脑游戏的一部分,由此 产生了一些在线多玩家的游戏,如“雷神之锤”(Quake)。自从2002年末发布了Xbox Live(一个游戏在线平台)之后,网络游戏也成为了游戏机上的一项重要功能。
  多亏了互联网的高速连通,游戏玩家可以同地球另一端的人一起玩游戏。有些游戏甚至设计出来供数百万用户同时在线玩。暴雪公司的(Blizzard) “魔兽世界”(World of Warcraft)拥有超过一千万的付费用户,这些人充值月费,登录服务器并在这个由其他玩家共同构成的虚拟世界进行游戏活动。微软的Xbox Live平台上有2300万的注册用户。
  市面上出现了越来越多的团队游戏或者是具有多人竞技成分的电子游戏;花时间玩游戏也意味着花时间在社交活动上。竞技性游戏因在线交流总是伴随着大量的口水战,而在线游戏还给玩家提供了与远方的朋友一起玩耍和交新朋友的机会。
  2.“乒乓游戏”(《Pong》)乃电子游戏“始祖”
  日,加州森尼韦尔市一家名叫Andy Capp的小酒馆见证了改变历史的一刻。众所周知,当时的泰迪?达布尼(Ted Dabney)和诺兰?布什内尔(Nolan Bushnell)两位“程序猿” 刚于成立雅达利(Atari)公司不久(1972年6月)。那晚,他们公布了一款名为《乒乓》(《Pong》)的新款街机游戏。这款游戏的面世象征着电子 游戏产业的诞生,仅在短短34年后,该产业的全球销售收入便已达380亿。
  乒乓游戏是世界上首款电子游戏吗?或许,并不尽然。没错,这款游戏是那天发布的,但在这之前,它已经有了好几个“前辈”。人们普遍认为的“乒乓游戏乃电子游戏界始祖”的看法,其正确性,其实仍是一个“迷”。
  事实上,早在乒乓游戏“出道”的前一年,一款街机游戏就已在上文提到的Andy Capp酒馆内问世了。与人们所公认的看法不同的是,其实《电脑空间》(《Computer Space》)才是名副其实的“电子游戏鼻祖”,知道的人,寥寥无几。该游戏是以电脑游戏《空间大战!》(《Spacewar!》) 为蓝本创作的。游戏颇具难度,在那个电子游戏初具雏形、尚未普及的年代,每个玩家都是新手,几乎没人可以闯关成功。而相比之下,《乒乓游戏》的游戏难度则 更符合玩家的速度和反应。《乒乓游戏》一夜爆红,其知名度远远超出《电脑空间》,这也使得人们误以为《乒乓游戏》在是世界上第一款电子游戏。
  1.成千上万的雅达利滞销游戏机“葬身”新墨西哥州沙漠
  有时候,那些听起来不可思议的“传说”往往是比珍珠还“真”的事实。最有力的例子莫过于那个流传已久的传言――新墨西哥州沙漠中埋藏着成千上万的雅达利游戏机。
  1983年9月,装载着近1000万部“遭人嫌弃”的雅达利滞销游戏机的14辆卡车“现身”新墨西哥州的阿拉莫戈多垃圾堆填区 (Alamogordo landfill)。人们将这些“货物”倾到在哪里,便径直离开了。他们将这些传言是“电子游戏界始祖”的家伙们存在过的证据,都深埋在了那个无人问津的 蛮夷之地。
  归根究底,这大量倾销背后的原因,关键在于其社会公共记录。确切来说,是指1982年雅达利公司第四季度的财务报表问题。这一年,雅达利公司的效益 远差于预期。造成这种现象的主要原因在于,他们“押错了宝”。他们在最突出的两款游戏上投入了太多的资金,即《E.T》.和《吃豆精灵》,后者是根据热门 电影《E.T.》改编而来的。然而,两者的市场反响远低于公司预估,辜负了公众的期望。平均以上的每种游戏产品都有5百万份被退回。面对着这成千上万的滞 销产品,雅达利公司不得不选择将它们埋葬。
  不幸的是,若有一些怀旧的电子游戏机爱好者想要到那个填埋区一寻踪迹,以期找到个“幸存”的游戏机做留念,那么恐怕会大失所望。雅达利公司早已要求这个填埋区的主人用压路机将游戏机压碎,并用混凝土覆盖之。
责任编辑:毛自榕
太棒了!我要分享:前两天一时兴起,用VS2008写了个“破解”2048游戏的程序,这里用引号是因为还没有完全破解,算法需要改进。由于又要开始忙了,不能再深入探究,所以把它放上来希望有更多的人一起研究。
首先肯定是要获取图像了,在这里我也没用摄像头来获取,因为并不是所有人都有摄像头,这个程序我们用屏幕捕捉就够用了。获取图像后就是要知道当前的数据了,一开始想着用字符识别的,后来仔细想想,这个程序可以不需要字符识别,通过判断区域颜色就可以了,若不放心可以做一下灰度直方图,提高稳定性。得到数据后就该分析如何移动了,这才是本文最关心的,我的算法思想是,计算移动的有效值,这个有效值不是单一的最大数,也不是单一的空格数最多,而是这两个数与其权值乘积的和,在递归调用时,随着深度的加深,对这些权值做一定的衰减处理。这个方法在一定程度上计算可以验证是正确的,但有些时候不太理想,特别在合成的数越大时越明显,可能我设置的参数不够好吧。我在程序中没有加入分布系数(数的分布,越密集权值应越大),也没有加入路径规划(而是用了递归,本来递归遍历可以不用路径规划的,但由于我加入了权系数,所以递归的作用没有完全表现出来)。好了就讲这么多了,希望有兴趣的一起交流。
源码中可能有很多地方是多余的,这可能是我在调试的时候尝试过的方法,不行后没有完全将其删除
// game2048Dlg.cpp : implementation file
#include &stdafx.h&
#include &game2048.h&
#include &game2048Dlg.h&
#ifdef _DEBUG
#define new DEBUG_NEW
const char* strmove[] = {&无&,&上&,&下&,&左&,&右&};
// CAboutDlg dialog used for App About
class CAboutDlg : public CDialog
CAboutDlg();
// Dialog Data
enum { IDD = IDD_ABOUTBOX };
protected:
virtual void DoDataExchange(CDataExchange* pDX); & &// DDX/DDV support
// Implementation
protected:
DECLARE_MESSAGE_MAP()
CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
void CAboutDlg::DoDataExchange(CDataExchange* pDX)
CDialog::DoDataExchange(pDX);
BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
END_MESSAGE_MAP()
// Cgame2048Dlg dialog
Cgame2048Dlg::Cgame2048Dlg(CWnd* pParent /*=NULL*/)
: CDialog(Cgame2048Dlg::IDD, pParent)
, m_pBackBitmap(NULL)
, startx(0)
, starty(0)
, maxnum(0)
, imgwidth(0)
, imgheight(0)
, pbitmap(NULL)
m_hIcon = AfxGetApp()-&LoadIcon(IDR_MAINFRAME);
void Cgame2048Dlg::DoDataExchange(CDataExchange* pDX)
CDialog::DoDataExchange(pDX);
BEGIN_MESSAGE_MAP(Cgame2048Dlg, CDialog)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
//}}AFX_MSG_MAP
ON_WM_MOUSEMOVE()
ON_WM_LBUTTONDOWN()
ON_BN_CLICKED(IDC_BUTTON1, &Cgame2048Dlg::OnBnClickedButton1)
ON_WM_TIMER()
ON_BN_CLICKED(IDC_BUTTON2, &Cgame2048Dlg::OnBnClickedButton2)
ON_WM_CLOSE()
ON_BN_CLICKED(IDC_BUTTON3, &Cgame2048Dlg::OnBnClickedButton3)
END_MESSAGE_MAP()
// Cgame2048Dlg message handlers
BOOL Cgame2048Dlg::OnInitDialog()
CDialog::OnInitDialog();
// Add &About...& menu item to system menu.
// IDM_ABOUTBOX must be in the system command range.
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX & 0xF000);
CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != NULL)
CString strAboutM
strAboutMenu.LoadString(IDS_ABOUTBOX);
if (!strAboutMenu.IsEmpty())
pSysMenu-&AppendMenu(MF_SEPARATOR);
pSysMenu-&AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
// Set the icon for this dialog. &The framework does this automatically
// &when the application's main window is not a dialog
SetIcon(m_hIcon, TRUE);// Set big icon
SetIcon(m_hIcon, FALSE);// Set small icon
// TODO: Add extra initialization here
m_strLog.Empty();
//startx = 490;
//starty = 170;
//endx = 990;//::GetSystemMetrics(SM_CXSCREEN);&
//endy = 670;//::GetSystemMetrics(SM_CYSCREEN); &
//imgwidth = endx -
//imgheight = endy -
rgb = NULL;
//rgb = new ARGB[imgwidth*imgheight];// 0xaabbggrr
ZeroMemory(prematrix,sizeof(int)*4*4);
int i = 0;
numcolor[i++] = Color(255,204,192,179).GetValue();//ARGB
numcolor[i++] = Color(255,238,228,218).GetValue();// 2
numcolor[i++] = Color(255,237,224,200).GetValue();// 4
numcolor[i++] = Color(255,242,177,121).GetValue();// 8
numcolor[i++] = Color(255,245,149,99).GetValue();// 16
numcolor[i++] = Color(255,246,124,95).GetValue();// 32
numcolor[i++] = Color(255,246,94,59).GetValue();// 64
numcolor[i++] = Color(255,237,207,114).GetValue();// 128
numcolor[i++] = Color(255,237,204,97).GetValue();// 256
numcolor[i++] = Color(255,237,200,80).GetValue();// 512
numcolor[i++] = Color(255,237,197,63).GetValue();// 1024
numcolor[i++] = Color(255,238,194,46).GetValue();// 2048
for (;i&17;i++)
numcolor[i] = 0;
return TRUE; &// return TRUE &unless you set the focus to a control
void Cgame2048Dlg::OnSysCommand(UINT nID, LPARAM lParam)
if ((nID & 0xFFF0) == IDM_ABOUTBOX)
CAboutDlg dlgA
dlgAbout.DoModal();
CDialog::OnSysCommand(nID, lParam);
// If you add a minimize button to your dialog, you will need the code below
// &to draw the icon. &For MFC applications using the document/view model,
// &this is automatically done for you by the framework.
void Cgame2048Dlg::OnPaint()
if (IsIconic())
CPaintDC dc(this); // device context for painting
SendMessage(WM_ICONERASEBKGND, reinterpret_cast&WPARAM&(dc.GetSafeHdc()), 0);
// Center icon in client rectangle
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;
// Draw the icon
dc.DrawIcon(x, y, m_hIcon);
Point pts[3];
CDC *pdc = GetDlgItem(IDC_IMAGE)-&GetDC();
Graphics graph(pdc-&GetSafeHdc());
GetDlgItem(IDC_IMAGE)-&GetClientRect(&rect);
Image image(_T(&g2048.bmp&));
graph.DrawImage(&image,rect.left,rect.top,rect.right-rect.left,rect.bottom-rect.top);// 显示图像
CDialog::OnPaint();
// The system calls this function to obtain the cursor to display while the user drags
// &the minimized window.
HCURSOR Cgame2048Dlg::OnQueryDragIcon()
return static_cast&HCURSOR&(m_hIcon);
void Cgame2048Dlg::OnMouseMove(UINT nFlags, CPoint point)
// TODO: Add your message handler code here and/or call default
CDialog::OnMouseMove(nFlags, point);
void Cgame2048Dlg::OnLButtonDown(UINT nFlags, CPoint point)
// TODO: Add your message handler code here and/or call default
// 鼠标框出目标区域
CDialog::OnLButtonDown(nFlags, point);
void Cgame2048Dlg::CaptureScreen2(int xStartPt, int yStartPt, int width, int height, int xToCopy, int yToCopy)
if (m_pBackBitmap != NULL) &
delete m_pBackB &
m_pBackBitmap = NULL; &
m_pBackBitmap = new CBitmap(); &
CDC ScrDC,MemDC; &
ScrDC.CreateDC(_T(&DISPLAY&), NULL, NULL, NULL); &
MemDC.CreateCompatibleDC(&ScrDC); &
m_pBackBitmap-&CreateCompatibleBitmap(&ScrDC,width,height); &
MemDC.SelectObject(m_pBackBitmap); & //开始拷贝 &
MemDC.BitBlt(xStartPt, yStartPt, width, height,&ScrDC,xToCopy,yToCopy,SRCCOPY); &
ScrDC.DeleteDC(); &
MemDC.DeleteDC();
void Cgame2048Dlg::CaptureScreen(void)
CDC ScrDC;
ScrDC.CreateDC(_T(&DISPLAY&), NULL, NULL, NULL); &
if (pbitmap != NULL) &
pbitmap = NULL; &
pbitmap = ::new Bitmap((HBITMAP)::GetCurrentObject(ScrDC, OBJ_BITMAP),NULL);
ScrDC.DeleteDC(); &
int Cgame2048Dlg::GetEndcoderClsid(const WCHAR * format, CLSID * pClsid)
UINT num = 0;
UINT size = 0;
ImageCodecInfo *pimagecodeinfo = NULL;
GetImageEncodersSize(&num,&size);
if (size == 0)
return -1;
pimagecodeinfo = (ImageCodecInfo*)(malloc(size));
if (pimagecodeinfo == NULL)
return -1;
GetImageEncoders(num,size,pimagecodeinfo);
for (UINT i = 0;i&++i)
if (wcscmp(pimagecodeinfo[i].MimeType,format)==0)
*pClsid = pimagecodeinfo[i].C
free(pimagecodeinfo);
free(pimagecodeinfo);
return -1;
void Cgame2048Dlg::OnBnClickedButton1()
// TODO: Add your control notification handler code here
imgwidth = endx -
imgheight = endy -
//SetWindowPos(&this-&wndNoTopMost,0,0,0,0,SWP_NOMOVE|SWP_NOSIZE);
SetWindowPos(&this-&wndTopMost,0,0,0,0,SWP_NOMOVE|SWP_NOSIZE);&
CaptureScreen();
int t1 = GetTickCount();
int scrnwidth,
scrnwidth = ::GetSystemMetrics(SM_CXSCREEN);
scrnheight = ::GetSystemMetrics(SM_CYSCREEN);
Rect imgrect(0, 0, scrnwidth,scrnheight);
BitmapData* bitmapData = new BitmapD
pbitmap-&LockBits(&imgrect,ImageLockModeRead,PixelFormat32bppARGB,bitmapData);
UINT* pixels = (UINT*)bitmapData-&Scan0;
ARGB* argb1 = new ARGB[scrnwidth*scrnheight];
int stride = bitmapData-&Stride / 4;
//for (i=0;i&i++)
// for (j=0;j&j++)
// rgb[i*imgwidth + j] = pixels[i * stride + j];
memcpy(argb1,pixels,sizeof(UINT)*scrnwidth*scrnheight);
pbitmap-&UnlockBits(bitmapData);
delete bitmapD
ARGB blockcolor = Color(255,187,173,160).GetValue();//ARGB
imgheight = 0;
imgwidth = 0;
for(i=0;i&i++)
int h=0,w=0;
for(j=0;j&j++)
if(argb1[i*scrnwidth + j] == blockcolor)
w++;
if(w & imgwidth)
imgwidth =
starty = i-5;
for(i=0;i&i++)
int h=0,w=0;
for(j=0;j&j++)
if(argb1[i + scrnwidth * j] == blockcolor)
h++;
if(h & imgheight)
imgheight =
startx = i-5;
delete[] argb1;
if(imgwidth & 400 || imgheight & 400)
MessageBox(_T(&获取游戏区域错误&));
endx = imgwidth +
endy = imgheight +
if(rgb != NULL)
rgb = new ARGB[imgwidth*imgheight];
str.Format(_T(&耗时: %d&),GetTickCount() - t1);
//MessageBox(str);
//graph.DrawImage(pbitmap,rect.left,rect.top,rect.right-rect.left,rect.bottom-rect.top);// 显示图像
//CaptureScreen(0, 0, ::GetSystemMetrics(SM_CXSCREEN), ::GetSystemMetrics(SM_CYSCREEN), 0, 0);
int scrn_w = ::GetSystemMetrics(SM_CXSCREEN);&
int scrn_h = ::GetSystemMetrics(SM_CYSCREEN);&
mouse_event(MOUSEEVENTF_ABSOLUTE | MOUSEEVENTF_MOVE, startx*65536/scrn_w,starty*65536/scrn_h,0, 0); //&
mouse_event(MOUSEEVENTF_LEFTDOWN | MOUSEEVENTF_LEFTUP,0,0,0,0);
CString strT
CTime CurrentTime=CTime::GetCurrentTime();&
strTime = CurrentTime.Format(_T(&%Y%m%d_%H%M%S 开始游戏\r\n&));
Logging(strTime);
SetTimer(MAIN_TIMER_ID,500,NULL);
bool Cgame2048Dlg::SaveBitmapToFile(CBitmap* bitmap, CString lpFileName)
{ & & & & & &
HBITMAP hB// 为刚才的屏幕位图句柄
HDC hDC; //设备描述表 &
int iB //当前显示分辨率下每个像素所占字节数 &
WORD wBitC //位图中每个像素所占字节数
DWORD dwPaletteSize = 0, //定义调色板大小
dwBmBitsSize, &//位图中像素字节大小 &&
dwDIBSize,
//位图文件大小
dwW &//写入文件字节数
BITMAP B //位图属性结构 &
BITMAPFILEHEADER bmfH //位图文件头结构 &
BITMAPINFOHEADER //位图信息头结构 & &
LPBITMAPINFOHEADER //指向位图信息头结构 &
HANDLE fh,
//定义文件
hDib, //分配内存句柄
hPal, //调色板句柄
hOldPal = NULL;
//计算位图文件每个像素所占字节数 &
hBitmap = (HBITMAP)* &
hDC = CreateDC(_T(&DISPLAY&),NULL,NULL,NULL); &
GetDeviceCaps(hDC, BITSPIXEL) * GetDeviceCaps(hDC, PLANES); &
DeleteDC(hDC);
if (iBits &= 1) &
wBitCount =
(iBits &= 4) &
wBitCount =
else if (iBits &= 8) &
wBitCount =
(iBits &= 24) &
wBitCount =
else if (iBits &= 32)
wBitCount = 32;
//计算调色板大小 &
if (wBitCount &= 8) &
dwPaletteSize =(1 && wBitCount) * sizeof (RGBQUAD);
//设置位图信息头结构 &
GetObject(hBitmap, sizeof (BITMAP), (LPSTR)&Bitmap);
bi.biSize = sizeof (BITMAPINFOHEADER); &
bi.biWidth = Bitmap.bmW &
bi.biHeight = Bitmap.bmH &
bi.biPlanes = 1;
bi.biBitCount =wBitC
bi.biCompression = BI_RGB; &
bi.biSizeImage = 0; &
bi.biXPelsPerMeter = 0; &
bi.biYPelsPerMeter = 0; &
bi.biClrUsed = 0; &
bi.biClrImportant = 0; &
dwBmBitsSize = ((Bitmap.bmWidth * wBitCount+31) / 32) * 4 * Bitmap.bmH &
//为位图内容分配内存 &
hDib = GlobalAlloc(GHND, dwBmBitsSize + dwPaletteSize + sizeof (BITMAPINFOHEADER)); &
lpbi = (LPBITMAPINFOHEADER)GlobalLock(hDib); &
// 处理调色板 &&
hPal = GetStockObject(DEFAULT_PALETTE); &
if (hPal) &
hDC = ::GetDC(NULL);
hOldPal = ::SelectPalette(hDC, (HPALETTE)hPal, FALSE);
RealizePalette(hDC);
// 获取该调色板下新的像素值 &
GetDIBits(hDC, hBitmap,0, (UINT) Bitmap.bmHeight,
(LPSTR)lpbi + sizeof (BITMAPINFOHEADER)+ dwPaletteSize,
(LPBITMAPINFO)lpbi,DIB_RGB_COLORS); &
//恢复调色板
if (hOldPal)
SelectPalette(hDC, (HPALETTE)hOldPal, TRUE); &
RealizePalette(hDC); &
::ReleaseDC(NULL, hDC);
//创建位图文件
fh = CreateFile(lpFileName, GENERIC_WRITE,
0, NULL, CREATE_ALWAYS,
FILE_ATTRIBUTE_NORMAL |FILE_FLAG_SEQUENTIAL_SCAN, NULL); &
if (fh == INVALID_HANDLE_VALUE)
return FALSE; &
// 设置位图文件头 &
bmfHdr.bfType =0x4D42;
dwDIBSize = sizeof (BITMAPFILEHEADER)&
+ sizeof (BITMAPINFOHEADER) &
+ dwPaletteSize+ dwBmBitsS
bmfHdr.bfSize =dwDIBS
bmfHdr.bfReserved1 = 0; &
bmfHdr.bfReserved2 = 0; &
bmfHdr.bfOffBits = (DWORD)sizeof (BITMAPFILEHEADER)&
+ (DWORD)sizeof (BITMAPINFOHEADER) &
+ dwPaletteS
// 写入位图文件头 &
WriteFile(fh, (LPSTR)&bmfHdr, sizeof(BITMAPFILEHEADER), &dwWritten,NULL);
// 写入位图文件其余内容 &
WriteFile(fh, (LPSTR)lpbi, dwDIBSize,&dwWritten, NULL);
GlobalUnlock(hDib); &
GlobalFree(hDib); &
CloseHandle(fh); &
return TRUE;
// 返回:1、2 、3、4 对应 上下左右,返回0则表示无法移动
int Cgame2048Dlg::calc_move(int* num)
if (num == NULL)
int mernum[4][4*4];// 四个方向合成后的数据
int i2p1[4][4*4];// 新增2 可能的位置
int empty = 0,maxnum = 0;
double mermax[4]={0};
int merempty[4]={0};
int movedir=0,defmov=0;// 小于0 表示不能移动
int i,j,k;
for(i=0;i&4*4;i++)
if(num[i] == 0)
empty++;
else if(maxnum & num[i])
maxnum = num[i];
for (i=0;i&4;i++)
memcpy(mernum[i],num,sizeof(int)*4*4);
if(1)//(maxnum & 9)
// 权值方法
mermax[i] = num_move(mernum[i],i+1,1);
num_move(mernum[i],i+1,1);
for (j=0;j&4*4;j++)
if(mernum[i][j] == 0)
merempty[i]++;
else if(mermax[i] & mernum[i][j])
mermax[i] = mernum[i][j];
if(memcmp(num,mernum[i],sizeof(int)*4*4)!=0)
defmov = i+1;
if(1)//(maxnum & 9)
double weight = -1;
for(i = 0;i&4;i++)
if(mermax[i] & weight)
movedir = i+1;
weight = mermax[i];
int* p = // 移动后的肯定要比移动前的优,不然算法是无效的,或已经无法再移动
for(i=0;i&4;i++)
if(MatrixCmp(mernum[i],p,4*4,maxnum)&0)// 应该是广义的最大值,除了值 的大小,还有值的合成度
movedir = i+1;
p = mernum[i];
if(movedir==0)
int Cgame2048Dlg::get_dir_move(int* num, int dir)
int ret = 1;
switch(dir)
case 1:// up &有些时候,有0存在的时候也能移动
if( num[0]&&num[1]&&num[2]&&num[3])
if((num[0] == 0)&&(num[1]||num[2]||num[3]))
if((num[1] == 0)&&(num[0]||num[2]||num[3]))
if((num[2] == 0)&&(num[1]||num[0]||num[3]))
if((num[3] == 0)&&(num[1]||num[2]||num[0]))
case 2:// down
if( num[12]&&num[13]&&num[14]&&num[15])
if((num[12] == 0)&&(num[13]||num[14]||num[15]))
if((num[13] == 0)&&(num[12]||num[14]||num[15]))
if((num[14] == 0)&&(num[12]||num[13]||num[15]))
if((num[15] == 0)&&(num[12]||num[13]||num[14]))
case 3:// left
if( num[0]&&num[4]&&num[8]&&num[12])
if((num[0] == 0)&&(num[4]||num[8]||num[12]))
if((num[4] == 0)&&(num[0]||num[8]||num[12]))
if((num[8] == 0)&&(num[0]||num[4]||num[12]))
if((num[12] == 0)&&(num[0]||num[4]||num[8]))
case 4:// right
if(num[3]&&num[7]&&num[11]&&num[15])
if((num[3] == 0)&&(num[7]||num[11]||num[15]))
if((num[7] == 0)&&(num[3]||num[11]||num[15]))
if((num[11] == 0)&&(num[3]||num[7]||num[15]))
if((num[15] == 0)&&(num[3]||num[7]||num[11]))
double Cgame2048Dlg::num_move(int* num, int dir, int cmove)
int change = -1;
double Weight = 0;
if (dir &= 0 || dir & 4 || num == NULL)
int emp = 0,tmax=0;
// 先矩阵变换,然后统一处理
matrixchange(num,dir);
// 统一按上移处理
for (i=0;i&4;i++)
index = 0;
for (j=1;j&4;j++)
if(tmax & num[j*4+i])
tmax = num[j*4+i];
if (num[j*4+i] != 0)
if (num[index*4+i] == 0)
num[index*4+i] = num[j*4+i];
num[j*4+i] = 0;
if(change == -1)
change = 0;
else if(num[index * 4+i] == num[j*4+i])
Weight+=num[index*4+i]*num[index*4+i]*num[index*4+i];//x^2 , x^3 &,x^4, &x^2*lg(cmove)或者多项式...
num[index*4+i]++;
index++;
num[j*4+i] = 0;
change++;
index++;
for(i=0;i&4*4;i++)
if(num[i] == 0)
emp++;
if(emp==1)
num[index] = 1;// 补2 处理
// 在数据较大时应考虑路径规划,或调整相关系数
if(cmove & 0 && change &= 0&&cmove&6)// 因为组合移动6次足够了,不需要太多次
int mernum[4][4*4];// 四个方向合成后的数据
int tweight[4]={0};
cmove += 1;;// 防止死循环
// 四个方向继续移动
for(i=0;i&4;i++)
memcpy(mernum[i],num,sizeof(int)*4*4);
if(get_dir_move(mernum[i],i+1)) // 递归的时候应该考虑下2会出现的位置,也用相关数供稿计算
tweight[i] = num_move(mernum[i],i+1,cmove);
tweight[i] = num_move(mernum[i],i+1);
if(0)//(tmax &= 9)
int* tmar = mernum[0];
for(i=1;i&4;i++)
if(MatrixCmp(mernum[i],tmar,4*4,tmax)&0)
tmar = mernum[i];
memcpy(num,tmar,sizeof(int)*4*4);
double maxweight = 0;
for(i=0;i&4;i++)
if(maxweight & tweight[i])
maxweight = tweight[i];
maxweight = maxweight/(cmove*cmove);// x^2 & x*lg(x) &...
Weight +=
// 还原矩阵
switch (dir)
matrixchange(num,2);
matrixchange(num,4);
matrixchange(num,3);
if(change & 0)
void Cgame2048Dlg::matrixchange(int* num, int dir)
int temp[4*4];
memcpy(temp,num,sizeof(int)*4*4);
switch (dir)
case 1:// 上移
// 默认处理方法,不处理
case 2:// 下移
for (i=0;i&4;i++)
for (j=0;j&4;j++)
num[i*4+j] = temp[(3-i)*4+3-j];
case 3:// 左移
for (i=0;i&4;i++)
for (j=0;j&4;j++)
num[i*4+j] = temp[(3-j)*4+i];
case 4:// 右移
for (i=0;i&4;i++)
for (j=0;j&4;j++)
num[i*4+j] = temp[j*4+3-i];
void Cgame2048Dlg::OnTimer(UINT_PTR nIDEvent)
// TODO: Add your message handler code here and/or call default
if(nIDEvent == MAIN_TIMER_ID)
KillTimer(MAIN_TIMER_ID);
int matrix[4*4];
CaptureScreen( );
Bitmap dispbitmap(imgwidth,imgheight,PixelFormat32bppARGB);
Rect imgrect(startx, starty, imgwidth, imgheight);
Rect dispimgrect(0, 0, imgwidth, imgheight);
BitmapData* bitmapData = new BitmapD
BitmapData* dispbitmapData = new BitmapD
pbitmap-&LockBits(&imgrect,ImageLockModeRead,PixelFormat32bppARGB,bitmapData);
dispbitmap.LockBits(&dispimgrect,ImageLockModeWrite,PixelFormat32bppARGB,dispbitmapData);
UINT* pixels = (UINT*)bitmapData-&Scan0;
UINT* disppixels = (UINT*)dispbitmapData-&Scan0;
int stride = bitmapData-&Stride / 4;
for (i=0;i&i++)
for (j=0;j&j++)
rgb[i*imgwidth + j] = pixels[i * stride + j];
disppixels[i * stride + j] = pixels[i * stride + j];
pbitmap-&UnlockBits(bitmapData);
dispbitmap.UnlockBits(dispbitmapData);
delete bitmapD
delete dispbitmapD
int w = 122;
int off = 30;
for (i=0;i&4;i++)
for (j=0;j&4;j++)
for (k=0;k&17;k++)
if(rgb[(i*w+ off)*imgwidth + j*w + off] == numcolor[k])
if(k == 0)
matrix[i*4+j] = 0;
else if(k&17)
matrix[i*4+j] = // pow(2.0,1.0*k);
else if(maxnum & 17 && numcolor[maxnum]==0)// &合成较大的值,保存其颜色
numcolor[maxnum] = rgb[(i*w+ off)*imgwidth + j*w + off];
matrix[i*4+j] =
// game over
//MessageBox(_T(&识别出错&));
int movedir = calc_move(matrix);
CString log(_T(&当前数据:\t&));
char strnum[200] = {0};
for (int i=0;i&4;i++)
sprintf(strnum,&%s\t\t&,strnum);
for (int j=0;j&4;j++)
sprintf(strnum,&%s%4d &,strnum,matrix[i*4 + j]);
sprintf(strnum,&%s\r\n&,strnum);
sprintf(strnum,&%s移动方向为:%s\r\n\r\n&,strnum,strmove[movedir]);
log +=
Logging(log);
switch (movedir)
keybd_event(VK_UP,0,WM_KEYDOWN | WM_KEYUP,0);
keybd_event(VK_DOWN,0,WM_KEYDOWN | WM_KEYUP,0);
keybd_event(VK_LEFT,0,WM_KEYDOWN | WM_KEYUP,0);
keybd_event(VK_RIGHT,0,WM_KEYDOWN | WM_KEYUP,0);
Point pts[3];
CDC *pdc = GetDlgItem(IDC_IMAGE)-&GetDC();
Graphics graph(pdc-&GetSafeHdc());
GetDlgItem(IDC_IMAGE)-&GetClientRect(&rect);
graph.DrawImage(&dispbitmap,rect.left,rect.top,rect.right-rect.left,rect.bottom-rect.top);// 显示图像
if(movedir &=1&&movedir&=4)
maxnum = 0;
num_move(matrix,movedir);
memcpy(prematrix,matrix,sizeof(int)*4*4);
for(int i=0;i&4*4;i++)
if(maxnum & prematrix[i])
maxnum = prematrix[i];
SetTimer(MAIN_TIMER_ID,400,NULL);
CaptureScreen2(0,0,imgwidth,imgheight,startx,starty);
SaveBitmapToFile(m_pBackBitmap,_T(&g2048.bmp&));
str.Format(_T(&g2048_%d.bmp&),maxnum);
SaveBitmapToFile(m_pBackBitmap,str);
str.Format(_T(&maxnum is %d&),maxnum);
Logging(str);
Logging(_T(&game over&));
MessageBox(_T(&game over&));
WriteLogToFile();
SetWindowPos(&this-&wndNoTopMost,0,0,0,0,SWP_NOMOVE|SWP_NOSIZE);
CDialog::OnTimer(nIDEvent);
void Cgame2048Dlg::OnBnClickedButton2()
// TODO: Add your control notification handler code here
KillTimer(MAIN_TIMER_ID);
KillTimer(CAP_TIMER_ID);
Logging(_T(&用户停止&));
WriteLogToFile();
SetWindowPos(&this-&wndNoTopMost,0,0,0,0,SWP_NOMOVE|SWP_NOSIZE);
void Cgame2048Dlg::OnClose()
// TODO: Add your message handler code here and/or call default
Logging(_T(&软件关闭&));
WriteLogToFile();
CDialog::OnClose();
int Cgame2048Dlg::Logging(CString log)
if(m_strLog.GetLength()&20000)
WriteLogToFile( );
m_strLog += log + _T(&\r\n&);
int Cgame2048Dlg::WriteLogToFile(void)
CString Filename,
Filename.Format(_T(&log.txt&));
m_strLog = str + m_strL
if (!pfile.Open(Filename,CFile::modeWrite|CFile::modeRead|CFile::modeNoTruncate))
pfile.Open(Filename,CFile::modeWrite|CFile::modeRead|CFile::modeCreate|CFile::modeNoTruncate);
pfile.SeekToEnd();
#ifdef _UNICODE
USES_CONVERSION;
pfile.Write(W2CA(m_strLog),((CStringA)m_strLog).GetLength());
pfile.Write(m_strLog,m_strLog.GetLength());
pfile.Close();
m_strLog.Empty();
int Cgame2048Dlg::MatrixCmp(int* ma1, int* ma2, int n,int m)
int ret = 0;
int* tm1 = new int[n];
int* tm2 = new int[n];
int n1=0,n2=0;
memcpy(tm1,ma1,sizeof(int)*n);
memcpy(tm2,ma2,sizeof(int)*n);
SortInt(tm1,n);
SortInt(tm2,n);
// 移动后最大数和格子数都有可能不变,则再多考虑一步
// 或者移动后的整齐度,或者再多考虑一步能合成更大的数
// 或者多一步时消除的更多
// 优先处理
for(i = 0;i&n;i++)
if(tm1[i]!=0)
n1++;
if(tm2[i]!=0)
n2++;
//普通处理
//if(n1 == n2 || m &= 9)
if(n1 == n2 )
for(i = 0;i&n;i++)
// 综合判断
if(tm1[i] & tm2[i])
else if(tm1[i] & tm2[i])
else if(n1 & n2)
delete[] tm1;
delete[] tm2;
void Cgame2048Dlg::SortInt(int* buf, int n)
for(int i=0;i&n;i++)
for(int j = i+1;j&n;j++)
if(buf[i] & buf[j])
t = buf[i];
buf[i] = buf[j];
void Cgame2048Dlg::OnBnClickedButton3()
// TODO: Add your control notification handler code here
SetWindowPos(&this-&wndTopMost,0,0,0,0,SWP_NOMOVE|SWP_NOSIZE);&
SetTimer(CAP_TIMER_ID,50,NULL);
由于是用了GDI+,所以在InitInstance( ) 函数中需要启动GDI+,即在该函数中加&
GdiplusStartup(&m_GdiplusToken,&m_GdiplusStartupInput,NULL);
在ExitInstance() 加
GdiplusShutdown(m_GdiplusToken);
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:2647次
排名:千里之外
(1)(2)(1)(1)(1)}

我要回帖

更多关于 程序侠淘宝客破解版 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信