(扫雷游戏中)用C#实现 左右键一起点击 的事件

问题描述

privatevoidMouse_Down(objectsender,MouseEventArgse){//LBttonRBtton分别表示左键和右键被点击的标志。。。。。。。。。。if(e.Button==MouseButtons.Left){LButton=true;intcurrentSecond=currentTime.Millisecond;if(e.Button==MouseButtons.Right){RButton=true;if(currentTime.Millisecond-currentSecond<500){Double_Button(x,y);//左右键一起点击的事件LButton=false;RButton=false;}else{LButton=false;Right_Button(x,y);//右键点击的事件}}elseLeft_Button(x,y);//左键点击的事件}因为左键和右键不可能被同时摁下,上面表示的只是先点击左键在点击右键的情况;思路是:点击左键后,记录下当前的时间。要是点击右键的时间与左键的时间的间隔在500毫秒内就认为它是左右键一起点击。。不过运行的时候左右键一起点击都没有反应。。不知道为什么?请大家多多指教。。我才用.NET的

解决方案

解决方案二:
好像有两个小问题:(1)currentTime是什么?如果你没有在别的地方改变currentTime的值,我认为currentTime.Millisecond-currentSecond的结果永远是0;(2)在触发mousedown事件的那一刻,参数MouseEventArgse只有一个值,所以你下面要判断它同时等于两个值,那应该是行不通的。-----------------------------------建议不根绝datetime来判断,虽然一般不会有人按下鼠标左键不放,然后等几个小时后再按下鼠标右键-_-!可以加一个mouseup事件来实现你所需要的:boolLButton,RButton;privatevoidForm1_MouseDown(objectsender,MouseEventArgse){if(e.Button==MouseButtons.Left)LButton=true;if(e.Button==MouseButtons.Right)RButton=true;if(LButton&&RButton){Double_Button(x,y);//左右键一起点击的事件}}privatevoidForm1_MouseUp(objectsender,MouseEventArgse){if(e.Button==MouseButtons.Left)LButton=false;if(e.Button==MouseButtons.Right)RButton=false;}
解决方案三:
坐等高手回复!
解决方案四:
privateDateTimecurrentTime;currentTime=newSystem.DateTime();int毫秒=currentTime.Millisecond;//取当前毫秒DateTime是数字型1楼提出的小问题确实存在不过不太明白你后面的意思。。
解决方案五:
datetime是一个结构呀,而你创建这个结构的实例的时候,用的是无参数构造函数,所以currentTime.Millisecond的值是0。--------------------------------------就算currentTime.Millisecond能正确取出当前毫秒:intcurrentSecond=currentTime.Millisecond;if(e.Button==MouseButtons.Right){RButton=true;if(currentTime.Millisecond-currentSecond<500)红色那个判断相当于currentTime.Millisecond-currentTime.Millisecond,因为你在上面这段没有改变currentTime.Millisecond的值,currentTime.Millisecond的值没有变化。你可能认为currentTime.Millisecond的值会随着系统时间而变化,但是它的值一直是0
解决方案六:
那应该传什么参数给Datetime好呢?我现在只是知道思路,不过具体要怎么做,还是没有头绪看了LS提出的问题,今天又试了下,还是没有调好。。谁有相关的文章吗?麻烦发到我邮箱shjl353300@126.com谢谢
解决方案七:
privateDateTimeleftDateTime=DateTime.Now.AddHours(-1);privateDateTimerightDateTime=DateTime.Now.AddHours(-1);privatevoidChart_MouseDown(objectsender,MouseEventArgse){if(e.Button==MouseButtons.Right){rightDateTime=DateTime.Now;TimeSpants=rightDateTime-leftDateTime;if(ts.TotalMilliseconds<400){this.Text="OK";}}elseif(e.Button==MouseButtons.Left){leftDateTime=DateTime.Now;TimeSpants=leftDateTime-rightDateTime;if(ts.TotalMilliseconds<400){this.Text="OK2";}}}
解决方案八:
mark~
解决方案九:
usingSystem;usingSystem.Windows.Forms;classTest:Form{MouseButtonsButton;longTicks;//1个Ticks=100毫微秒longTicksDelay=5000000L;//5000000Ticks=500毫秒Test(){Labellabel=newLabel();label.Parent=this;label.Text="ClickMe";label.MouseDown+=newMouseEventHandler(Mouse_Down);}voidMouse_Down(objectsender,MouseEventArgse){Labellabel=senderasLabel;label.Text="Test";if(e.Button==(MouseButtons.Left|MouseButtons.Right)){label.Text="LandR";}elseif(e.Button==MouseButtons.Left){label.Text=(DateTime.Now.Ticks-Ticks<TicksDelay&&Button==MouseButtons.Right)?"LandR":"Lonly";}elseif(e.Button==MouseButtons.Right){label.Text=(DateTime.Now.Ticks-Ticks<TicksDelay&&Button==MouseButtons.Left)?"LandR":"Ronly";}Button=e.Button;Ticks=DateTime.Now.Ticks;}staticvoidMain(){Application.Run(newTest());}}

解决方案十:
usingSystem;usingSystem.Windows.Forms;classTest:Form{MouseButtonsButton;longTicks;//1个Ticks=100毫微秒longTicksDelay=5000000L;//5000000Ticks=500毫秒Test(){Labellabel=newLabel();label.Parent=this;label.Text="ClickMe";label.AutoSize=true;label.MouseDown+=newMouseEventHandler(Mouse_Down);}voidMouse_Down(objectsender,MouseEventArgse){Labellabel=senderasLabel;label.Text="Test";if(e.Button==(MouseButtons.Left|MouseButtons.Right)){label.Text="左右键一起点击";//Double_Button(x,y);}elseif(e.Button==MouseButtons.Left){if(DateTime.Now.Ticks-Ticks<TicksDelay&&Button==MouseButtons.Right){label.Text="先点击右键,紧接着点击左键";//Double_Button(x,y);}else{label.Text="点击左键";//Left_Button(x,y);}}elseif(e.Button==MouseButtons.Right){if(DateTime.Now.Ticks-Ticks<TicksDelay&&Button==MouseButtons.Left){label.Text="先点击左键,紧接着点击右键";//Double_Button(x,y);}else{label.Text="点击右键";//Right_Button(x,y);}}Button=e.Button;Ticks=DateTime.Now.Ticks;}staticvoidMain(){Application.Run(newTest());}}

解决方案十一:
谢谢LS的源程序。。通过了。。:-)有没什么关于C#WINDOW应用程序的书啊推荐几本嘛我图书馆借的那些书感觉都没什么用处的
解决方案十二:
MicrosoftC#Windows程序设计:上下册(含CD-ROM一张)北京大学出版社/2002-9-1/(美)佩特佐德(Petzold,C.)著,天宏工作室译/160元ISBN:9787301051405C#WindowsForm编程的经典,强烈推荐。
解决方案十三:
恩。。谢谢你了哈
解决方案十四:
又有一个问题了。。。这是左右键一起点击事件的部分:假设标的雷是对的,一起点击后打开周围的按钮。//左右键一起点击事件privatevoidDouble_Button(intx,inty){intn=0;for(inti=x-1;i<x+1&&i<=Widths&&i>=0;i++)for(intj=y-1;j>y+1&&j<=Heights&&j>=0;j++)if(buttonarray[i,j].Text=="*")n++;//扫描当前点四周,n为当前点雷的个数;用“*”标记为雷//buttonarray[x,y].Text=Convert.ToString(MilesNum[x,y]);if(n==MilesNum[x,y]){//MilesNum[x,y]是(x,y)点的雷数,前面已经正确赋值了privateint[,]MilesNum;//Open_Button(x,y)打开(x,y)点按钮if(Check(x-1,y-1)==true)Open_Button(x-1,y-1);if(Check(x-1,y)==true)Open_Button(x-1,y);if(Check(x-1,y+1)==true)Open_Button(x-1,y+1);if(Check(x,y-1)==true)Open_Button(x,y-1);if(Check(x,y+1)==true)Open_Button(x,y+1);if(Check(x+1,y-1)==true)Open_Button(x+1,y-1);if(Check(x+1,y)==true)Open_Button(x+1,y);if(Check(x+1,y+1)==true)Open_Button(x+1,y+1);}}//运行的时候if(n==MilesNum[x,y])不会执行Open_Button();用"buttonarray[x,y].Text=Convert.ToString(MilesNum[x,y]);"显示的MilesNum[x,y]==n的但if(n!=MilesNum[x,y])不管没有标雷,他都会执行Open_Button();这是为什么啊?
解决方案十五:
intn=0;for(inti=x-1;i<x+1&&i<=Widths&&i>=0;i++)for(intj=y-1;j>y+1&&j<=Heights&&j>=0;j++)if(buttonarray[i,j].Text=="*")n++;改为intn=0;for(inti=x-1;i<=x+1;i++){for(intj=y-1;j<=y+1;j++){if(i<=Widths&&i>=0&&j<=Heights&&j>=0&&buttonarray[i,j].Text=="*")n++;}}

解决方案:
或者:intn=0;for(inti=Math.Max(x-1,0);i<=Math.Min(x+1,Widths);i++){for(intj=Math.Max(y-1,0);j<=Math.Min(y+1,Heights);j++){if(buttonarray[i,j].Text=="*")n++;}}

解决方案:
如果buttonarray[i,j]的下标是0起始的,上面的Widths、Heights恐怕都要换成Widths-1、Heights-1。
解决方案:
改了的程序和我原来写的程序有什么不一样啊?为什么原来的不行呢?intn=0;for(inti=x-1;i<=x+1;i++){for(intj=y-1;j<=y+1;j++){if(i<=Widths&&i>=0&&j<=Heights&&j>=0&&buttonarray[i,j].Text=="*")n++;}}这个会超界了可以把IF改为这个:if((i+1)<=Widths&&(i-1)>=0&&(j+1)<=Heights&&(j-1)>=0&&buttonarray[i,j].Text=="*")
解决方案:
我不是说过了吗:如果buttonarray[i,j]的下标是0起始的,上面的Widths、Heights恐怕都要换成Widths-1、Heights-1。if(i>=0&&i<Widths&&j>=0&&j<Heights&&buttonarray[i,j].Text=="*")n++;

或者:intn=0;for(inti=Math.Max(x-1,0);i<=Math.Min(x+1,Widths-1);i++){for(intj=Math.Max(y-1,0);j<=Math.Min(y+1,Heights-1);j++){if(buttonarray[i,j].Text=="*")n++;}}

你原来的程序根本不行,会造成循环提前中止。
解决方案:
如果你同时判断左右键点击的时候,记得加入大概300毫秒以内的延时。因为计算机的处理速度非常快,用户很难在这个时间内两个键同时按下。

时间: 2024-10-22 19:52:06

(扫雷游戏中)用C#实现 左右键一起点击 的事件的相关文章

c#扫雷游戏中的爆炸效果

问题描述 c#扫雷游戏中的爆炸效果 扫雷游戏中的连环爆炸怎么做的啊?实在不会,请大神帮忙!!!谢谢- 解决方案 做一个gif动画表示爆炸,用这个http://download.csdn.net/download/gezhonglei2007/2357280 显示.显示之前先移动到对应的位置上

DW中按左右键切换到相邻单元格

如何实现DW中按左右键切换到相邻单元格呢: 首先声明外部函数:  Subroutine keybd_event(int bVk,int bScan,ulong dwFlags,ulong dwExtraInfo) LIBRARY "user32.dll" 一.如果不想在DW的单元格内利用左右键编辑内容,只要一按下左右键就切换到其他单元格的话可以: 新建ue_key 对应 pbm_dwnkey ,代码如下: if key=keyleftarrow! then keybd_event(16

ThinkPad电脑鼠标在AutoCAD中滚轮左右键功能无法使用

故障现象: ThinkPad鼠标在AutoCAD中滚轮左右键功能无法使用,另外滚轮在AutoCAD软件中的功能也有可能无法使用. 原因分析: 此问题是因为安装了选件鼠标的驱动后导致的按键冲突. 由于鼠标驱动的优先级高于AutoCAD软件的优先级,所以在使用AutoCAD的时候系统优先调用的鼠标驱动中的左右键设置,而没有调用AutoCAD软件的相关设置. 解决方案: 在程序和功能中卸载Lenovo Mouse Suite后问题可以解决.  

C#切换鼠标左右键习惯无需控制面板中修改_C#教程

本人一直喜欢左手使用鼠标,但有时候同事会临时进行操作,还得在控制面板里进行更改,比较不便,何不编写一个控制台程序,双击一下即可切换左右键 代码很简单: 复制代码 代码如下: class Program { [DllImport("user32.dll")] private extern static bool SwapMouseButton(bool fSwap); //博客地址:http://blog.csdn.net/bluceyoung [DllImport("user

用VC++编写扫雷游戏

首先分析扫雷的最基本功能. 点击鼠标左键于未知区域,如果未知区域有雷,游戏停止,显示所有的地雷.如果没雷,则显示周围雷数,如果周围没雷,则再查看周围八个区域是否有雷直到有雷为止并显示,这其实是一个递归过程. 点击鼠标右键于未知区域,则将其置为有雷而不管是否真的有雷.可选择初.中.高三级并可自定义雷数和区域大小. 雷区上部左侧显示总雷数减被标明有雷区域的数目. 雷区上部中间位置显示一按钮用于开局和显示鼠标动作的结果. 雷区上部右侧显示扫雷的时间. 将雷全部扫清后,则显示一对话框将你的姓名记入排行榜

使用纯javascript实现经典扫雷游戏

  使用纯javascript实现经典扫雷游戏         本文给大家分享的是个人刚开始学习javascript的时候写的仿windows经典的扫雷游戏的代码,当时只是写了下来,没加注释,这里补上,有需要的小伙伴可以参考下. 很久以前写的 当时都没写注释的 刚加上了 (尼玛,好多自己都不认识了 ... ) 不足的地方就是本来想写个游戏排名的统计的,等有空了再加上(好像每次都这么说 然后就等好久好久...) 还有就是没有实现:点击第一个格子不能是雷的功能 ? 1 2 3 4 5 6 7 8 9

C#如何开发扫雷游戏

简单的总结一下,如何利用C#进行WinForm 扫雷小游戏的开发: 扫雷游戏的主要设计的类有三个: Main.Pane .MineField 1)Main 是主控窗体,负责项目的启动和关闭:并协调内部各个组建模块的协调工作. 2)Pane是一个方格的封装,是雷区的重要组建:它表示一个方格的当前状态,以及是否布雷等信息. 3)MineField是雷区的封装,是游戏的核心组建:它负责方格的布局以及地雷的分布:并控制玩家的基本操作以及正确的响应. 类的实现: 一. Pane类 功能描述:Pane是一个

使用纯javascript实现经典扫雷游戏_javascript技巧

很久以前写的 当时都没写注释的 刚加上了 (尼玛,好多自己都不认识了 ... ) 不足的地方就是本来想写个游戏排名的统计的,等有空了再加上(好像每次都这么说 然后就等好久好久...) 还有就是没有实现:点击第一个格子不能是雷的功能 <style> ul{padding:0;list-style:none;} #mine{overflow:hidden;width:30px;height:30px;border:1px solid #966;} #mine li{float:left;width

基于C语言实现的扫雷游戏代码_C 语言

本文详细讲述了基于C语言实现的扫雷游戏代码,代码中备有比较详细的注释,便于读者阅读和理解.希望对学习游戏开发的朋友能有一点借鉴价值. 完整的实例代码如下: /* 模拟扫雷游戏 */ #include <graphics.h> #include <math.h> #include <stdio.h> #include <dos.h> #include <stdlib.h> #include <conio.h> #include <