用c#实现音乐游戏剪刀石头布布游戏,怎么做,求思路和代码,

中国领先的IT技术网站
51CTO旗下网站
一个简单C#游戏程序制作
本文介绍了网上有很多C#游戏程序制作的教程,大多是讲针对大型网络游戏的,主要包含一些抓包、反汇编、C++的知识综合。事实也如此,常见的外挂都是使用VC++写的,从来没有过C#或者其他.NET语言编写的程序。
作者:dht8来源:| 09:11
在向大家详细介绍C#游戏程序制作之前,首先让大家了解下作为游戏程序来说,主要就是三个功能:模拟键盘操作、模拟鼠标操作、修改内存数据,然后全面介绍C#游戏程序制作。
网上有很多C#游戏程序制作的教程,大多是讲针对大型网络游戏的,主要包含一些抓包、反汇编、C++的知识综合。事实也如此,常见的外挂都是使用VC++写的,从来没有过C#或者其他.NET语言编写的程序。
作为微软.NET技术的忠实粉丝,这难免是一种遗憾。不过不要紧,下面流牛木马就教大家两招,包教包会,免收学费。 :)
其实作为游戏程序来说,主要就是三个功能:模拟键盘操作、模拟鼠标操作、修改内存数据。修改内存数据比较难,但模拟鼠标键盘的操作却很简单。很多流行游戏的外挂,都可以只通过模拟鼠标键盘来实现,例如:劲舞团、QQ音速、连连看、各类网页游戏,以及各类大型网游中的自动打怪、自动吃药等等。
Warcraft Ⅲ,学名魔兽争霸之冰封王座,俗称魔兽,简称war3,在最近六七年风靡全球。最近两年,war3在中国又掀起了玩DOTA的新高潮。
本文制作DOTA游戏中的显血、改键外挂为例,简单地介绍如何制作C#游戏程序。
本示例包含两个功能:显血;将Q键改为小键盘的7键。玩war3的同学都知道,这两个功能对于war3(尤其是DOTA)相当重要。
首先简单介绍一下,程序模拟键盘的原理。
程序与游戏程序是两个不同的进程。外挂程序使用Windows提供的API找到游戏程序的进程,并设置键盘钩子(什么叫做钩子?你不知道,但百度知道。)设置完钩子后,我们再监控游戏进程中用户的按键,并根据用户需求进行处理,完成某些模拟键盘动作。
了解了这个过程之后,我们就可以开始整理思路了。完成C#游戏程序一共需要以下四个步骤:
一、声明Windows API 中的函数和常量&&&&&&&&&&&&&&[StructLayout(LayoutKind.Sequential)] &&&&&&&&&public&class&KeyBoardHookStruct &&&&&&&&&{ &&&&&&&&&&&&&public&int&vkC &&&&&&&&&&&&&public&int&scanC &&&&&&&&&&&&&public&int& &&&&&&&&&&&&&public&int& &&&&&&&&&&&&&public&int&dwExtraI &&&&&&&&&} &&&&&&&&&#region&DllImport &&&&&&&&&&&&&&&&&&[DllImport("user32.dll",&CharSet&=&CharSet.Auto,&CallingConvention&=&CallingConvention.StdCall)] &&&&&&&&&public&static&extern&int&SetWindowsHookEx(int&idHook,&HookProc&lpfn,&IntPtr&hInstance,&int&threadId); &&&&&&&&&[DllImport("user32.dll",&CharSet&=&CharSet.Auto,&CallingConvention&=&CallingConvention.StdCall)] &&&&&&&&&&&&&&&&&&public&static&extern&bool&UnhookWindowsHookEx(int&idHook); &&&&&&&&&[DllImport("user32.dll",&CharSet&=&CharSet.Auto,&CallingConvention&=&CallingConvention.StdCall)] &&&&&&&&&&&&&&&&&&public&static&extern&int&CallNextHookEx(int&idHook,&int&nCode,&IntPtr&wParam,&IntPtr&lParam); &&&&&&&&&&&&&&&&&&[DllImport("kernel32.dll",&CharSet&=&CharSet.Auto,&CallingConvention&=&CallingConvention.StdCall)] &&&&&&&&&private&static&extern&IntPtr&GetModuleHandle(string&lpModuleName); &&&&&&&&&&&&&&&&&&&[DllImport("USER32.DLL")] &&&&&&&&&public&static&extern&IntPtr&FindWindow(string&lpClassName, &&&&&&&&&&&&&string&lpWindowName); &&&&&&&&&&&[DllImport("USER32.DLL")] &&&&&&&&&public&static&extern&bool&SetForegroundWindow(IntPtr&hWnd); &&&&&&&&&[DllImport("User32.dll")] &&&&&&&&&public&static&extern&void&keybd_event(Byte&bVk,&Byte&bScan,&Int32&dwFlags,&Int32&dwExtraInfo); &&&&&&private&const&int&KEYEVENTF_KEYUP&=2;&
本例所使用的函数比较少,它们都在系统的USER32.dll里,包括:设置和取消钩子、调用下一个钩子、导入进程、模拟键盘等等。我们依次导入它们。
这些函数的命名规范合理,几乎只根据函数名就能知道其功能。
如果读者对于其中的某些函数不熟悉,请自行搜索MSDN。
二、使用Windows API设置钩子&
有了以上windows API函数的声明,下一步就是设置钩子了。
寥寥两行代码,但包含了相当丰富的内容。&public&delegate&int&HookProc(int&nCode,&IntPtr&wParam,&IntPtr&lParam); && &&public&void&Hook_Start() &&&&&{ &&&&&&&&&&&&&&&&&&if&(hHook&==&0) &&&&&&&&&{ &&&&&&&&&&&&&KeyBoardHookProcedure&=&new&HookProc(KeyBoardHookProc); &&&&&&&&&&&&&&hHook&=&SetWindowsHookEx(WH_KEYBOARD_LL,&KeyBoardHookProcedure,&GetModuleHandle(Process.GetCurrentProcess().MainModule.ModuleName),&0); &&&&&&&&&&&&&&&&&&&&&& &&&&&&&&&} &&&&&}&
先介绍一下设置钩子的明星函数:SetWindowsHookEx 。它的参数说明如下。◆SetWindowsHookEx(◆idHook: I&& {钩子类型}◆lpfn: TFNHookP {函数指针}◆hmod: HINST;&&&&&& {包含钩子函数的模块(EXE、DLL)句柄; 一般是 HI 如果是当前线程这里可以是 0}◆dwThreadId: DWORD {关联的线程; 可用 GetCurrentThreadId 获取当前线程; 0 表示是系统级钩子}◆HHOOK;&&&&&&&&&&& {返回钩子的句柄; 0 表示失败}
请注意lpfn这个参数。上面的解释是“函数指针”。在C#中,是不能直接使用指针的,更不要说函数指针了。我们可以采用C#中的委托(delegate)来实现函数指针的功能。
于是乎,在上面的代码中,我们定义了一个处理键盘消息函数的委托KeyBoardHookProcedure = new HookProc(KeyBoardHookProc),并将它作为参数传入SetWindowsHookEx 内。KeyBoardHookProc就是被委托的具体函数。
三、监控用户操作
设置好钩子后,我们可以在被委托的函数中写入监控用户操作与模拟键盘的代码。public&static&int&KeyBoardHookProc(int&nCode,&IntPtr&wParam,&IntPtr&lParam) &&&&&&&&&{ &&&&&&&&&KeyBoardHookStruct&input&=&(KeyBoardHookStruct)Marshal.PtrToStructure(lParam,&typeof(KeyBoardHookStruct)); &&&&&&&&&&&&&&&&&&&&&&&&&&&if&(input.vkCode&==&(int)Keys.Home) &&&&&&&&&&&&&{ &&&&&&&&&&&&&&&&} &&&&&&&& &&&&&&&&&&&&&&&&&&&&&&&&&return&CallNextHookEx(hHook,&nCode,&wParam,&lParam); &&&&&&&&&&}&
四、根据用户需要模拟键盘操作
显血功能:玩war3的都知道,war3自带的显血快捷键有3个。Alt键是显示所有单位生命,[ 键显示友方单位生命,] 键显示地方单位生命。外挂需要做的事情仅仅是模拟一直按着某个键不松手而已。由于Alt键与其他很多键构成组合键,故我们不能模拟长按Alt,否则会影响正常游戏。我们的解决方案应该是模拟长按 [ 键和 ] 键。代码如下:&&&IntPtr&wcHandle&=&FindWindow(null,&"Warcraft&III"); &&&&&&&if&(wcHandle&!=&IntPtr.Zero) &&&{ &&&&&&&&&&&&&&SetForegroundWindow(wcHandle); &&&byte&VK_NUM1&=&219;&&&&&&&&byte&VK_NUM2&=&221;&&&&&&&&keybd_event(VK_NUM1,&0,&0,&0);&&&&keybd_event(VK_NUM2,&0,&0,&0);&&&
改键:小键盘(Numpad)上的快捷键很不方便按,所以很多玩家喜欢把小键盘上的键改到左边的字母键盘。玩war3的同学都知道,没有任何英雄的技能使用"Q”这个快捷键。于是我们把小键盘上的7键改到Q上,也不会造成任何冲突。方法也很简单:如果监控到用户按"Q”键,则像游戏进程发送小键盘上的"7"键。代码如下:&&&&if&(input.vkCode&==&(int)Keys.Q) &&&&{ &&&&&&&&&&&&&&&&IntPtr&wcHandle&=&FindWindow(null,&"Warcraft&III"); &&&&&&&&&&&&&&&&&if&(wcHandle&!=&IntPtr.Zero) &&&&&&&&{ &&&&&&&&&&&&&&&&&&&&&&&&SetForegroundWindow(wcHandle); &&&&&&&&&&&&byte&VK_Q&=&(byte)Keys.NumPad7; &&&&&&&&&&&&keybd_event(VK_Q,&0,&0,&0);&&&&&&&&&&&&keybd_event(VK_Q,&0,&KEYEVENTF_KEYUP,&0);&&&&&&&&&} &&&&&&&&return&1; &&&&}&
好了,到这里就把模拟键盘的C#游戏程序介绍完了。模拟鼠标与之非常类似,请用户自行揣摩。
【编辑推荐】
【责任编辑: TEL:(010)】
大家都在看猜你喜欢
热点热点头条头条头条
24H热文一周话题本月最赞
讲师:742305人学习过
讲师:172124人学习过
讲师:12217人学习过
精选博文论坛热帖下载排行
本书全面而详细地介绍了Linux操作系统。全书分为5个部分:第一部分着重说明Linux的起源及功能,如何规划和安装Linux主机;第二部分介绍Linu...
订阅51CTO邮刊一个小时候经常玩的游戏:
通过只移动空白处周围的小方块 最终将所有方块移动到目标位置即完成游戏
程序的逻辑并不难:
1.初始化所有(4X4)按钮属性(位置 ,大小,标号,是否可见) 和方法(点击按钮 交换),并按顺序排列
2.点击洗牌 开始游戏 (通过随机交换任意两个按钮X次)
3.每次点击某个按钮 判断是否在隐藏按钮周围,在周围则交换这两个按钮,否则无反应
4.每次点击按钮 判断所有按钮是否达到目标位置,达到则弹出消息窗口
Project是 Windows form& Application
using System.Collections.G
using System.D
using System.D
using System.L
using System.T
using System.Threading.T
using System.Windows.F
namespace WindowsFormsApplication3
public partial class Form1 : Form
public Form1()
InitializeComponent();
const int N = 4;
Button[,] buttons = new Button[N, N];
//创建N X N大小的按钮数组
void swap(Button btn1, Button btn2) //交换两个按钮 实际上只需要交换两个属性(显示的标号Text,是否可见Visible)即可
string str1 = btn1.T
btn1.Text = btn2.T
btn2.Text = str1;
bool a = btn1.V
btn1.Visible = btn2.V
btn2.Visible =
private void button1_Click(object sender, EventArgs e)
//点击开始按钮
for (int i = 0; i & 1000; i++)
//随机交换两个按钮 1000次实现洗牌
Random rnd = new Random();
int a, b, c,
a = rnd.Next(N);
//产生四个不大于N的随机数
b = rnd.Next(N);
c = rnd.Next(N);
d = rnd.Next(N);
swap(buttons[a, b], buttons[c, d]);
Button FindHiddenButton()
//找到那个没显示的按钮
for (i = 0; i & N; i++)
for (j = 0; j & N; j++)
if (buttons[i, j].Visible == false)
return buttons[i, j];
bool IsNeighbor(Button btnA, Button btnB) // 判断两个按钮是否相邻
int a = (int)btnA.T
int b = (int)btnB.T
int r1 = a / N, c1 = a % N;
int r2 = b / N, c2 = b % N;
if (r1 == r2 && (c1 == c2 - 1 || c1 == c2 + 1) //相邻条件
|| c1 == c2 && (r1 == r2 - 1 || r1 == r2 + 1))
bool ResultIsOk()
//判断是否完成
for (int r = 0; r & N; r++)
for (int c = 0; c & N; c++)
if (buttons[r, c].Text != (r * N + c + 1).ToString())
void btn_Click(object sender, EventArgs e)
//点击某个按钮
Button btn = sender as B //当前点中的按钮
Button blank = FindHiddenButton();
if (IsNeighbor(btn, blank))
swap(btn, blank);
blank.Focus();
//duang 给&移动&的格子加特效
//判断是否完成了
if (ResultIsOk())
MessageBox.Show(&You Win&);
//弹出消息窗
void GenerateAllButtons()
//生成所有按钮
int x0 = 100, y0 = 10, wid1 = 50, wid2 = 45;
for (int i = 0; i & N; i++)
for (int j = 0; j & N; j++)
Button btn = new Button();
btn.Top = y0 + i * wid1;
btn.Left = x0 + j * wid1;
btn.Width = wid2;
btn.Height = wid2;
btn.Visible =
btn.Text = (i * N + j + 1).ToString();
//初始化按钮所有属性
btn.Tag = i * N +
//保存行号 列号
btn.Click += new EventHandler(btn_Click);
buttons[i, j] =
//放到数组上
this.Controls.Add(btn);
//加到界面上
buttons[N - 1, N - 1].Visible =
private void Form1_Load(object sender, EventArgs e)
GenerateAllButtons();
本文已收录于以下专栏:
相关文章推荐
----------------------
ASP.Net+Unity开发、.Net培训、期待与您交流! ----------------------C#入门经典里的扑克牌客户端程序
这个程序...
using Snamespace SpeedTestTemplate{
class Program
static void Main()
class myclass
public static void Main()
string s1 = Convert.T...
public class initCard { //初始化牌
private string[] suit = { "\x0001", "\x0002", "\x00...
int i,n,a,b,t;
void main() {
52张牌随机分给4个万玩家,要求每个玩家的牌用一个一维数组表示。我们采用模拟大法。初始化一副扑克牌,洗牌,发牌。using Susing System.Collections.Generi...
原文:http://blog.csdn.net/jirongzi_cs2011/article/details/
完美洗牌问题: 给定一个数组a1,a2,a3,...an...
private static void Shuffle ()
string[] cardType = { "红桃", "黑桃", "方块", "梅花" };
string[] c...
(1)52张扑克牌,四种花色(红桃、黑桃、方块和梅花),随机发牌给四个人。
(2)最后将四个人的扑克牌包括花色打印在控制台上。
花色和点数用枚举类型实现
每张扑克牌...
他的最新文章
讲师:董岩
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)C#开发俄罗斯方块小游戏_图文_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
C#开发俄罗斯方块小游戏
&&详细讲解开发过程,包学会。
阅读已结束,下载文档到电脑
想免费下载更多文档?
定制HR最喜欢的简历
下载文档到电脑,方便使用
还剩30页未读,继续阅读
定制HR最喜欢的简历
你可能喜欢

我要回帖

更多关于 类似剪刀石头布的游戏 的文章

 

随机推荐