我爱舞女泪 我爱舞女泪
关注数: 0 粉丝数: 23 发帖数: 1,774 关注贴吧数: 0
使用人工智能实现自动推箱子,感兴趣的进来讨论下! 最近在写推箱子的游戏,我要使用人工智能实现自动推箱子,其要实现的效果为:利用鼠标点击箱子可以选择要推的箱子,鼠标再点击目的地,如果有箱子被选择,就自动推动被选择的箱子到此坐标,否则,人移动到此坐标!这具体的移动步骤,当然是自动选择最短的路径。也就是说,你只要选择要它搬哪个箱子,并指定要搬到的目的地,它就自动搬好,当然,如果出发点到目的地没有路可走,有障碍物,当然它就不会搬!其它的已经实现,就是自动推箱子的问题有点复杂,我先分析一下自动推箱子的思路,并使用图解的方法,让大家能更清晰明了:符号提示:★ 代表人▲ 代表目的地○ 代表放箱子的洞● 代表箱子□ 代表可以行走的空地■ 代表不能通行的墙→←↑↓ 代表行走的四个方向图一■■■■■■■■■■■■□▲□□□□□□□■■■■■■■■□□□■■□□□□□□□□□■■□★□□□□□■■■■■■■■■■■■■■这第一个图是最简单的,只移动人,将人移动到目的地就可以了,它的行走路线就应该是如图■■■■■■■■■■■■□▲←←←←←□□■■■■■■■■↑□□■■□□□□□□↑□□■■□★→→→→↑■■■■■■■■■■■■■■图二■■■■■■■■■■■■□○□□□□□□□■■■■■■■■□□□■■□□□●□□□□□■■□★□□□□□■■■■■■■■■■■■■■这个图,是要先将人移动到箱子左边,再推动到箱子转角的地方,人必须要走到箱子的下面,向上推到顶,再走到箱子的右边推,直到进洞,为了直观,我把人走的路线,和箱子走的路线分开画■■■■■■■■■■■■□○←←←←←□□■■■■■■■■↑□□■■□□□●→→↑□□■■□★□□□□□■■■■■■■■■■■■■■上面的是箱子应该走的路线,下面的是要让箱子实现以上的路线,则人的路线图■■■■■■■■■■■■□○←←←←←↑□■■■■■■■■↑→□■■□↑→→→→↑□□■■□★□□□↓→■■■■■■■■■■■■■■图三■■■■■■■■■■■■■□□□□□□□□○□■■□□□■□■■■□□■■■■■□●□□□□□■■□□★□□□□□■■■■■■■■■■■■■■■此图就有些复杂了,同样,还是先是箱子行走路线,这里因为重复了路线,我将分两次显示■■■■■■■■■■■■■□□←←←□□□○□■■□□□■↑■■■□□■■■■■□●□□□□□■■□□★□□□□□■■■■■■■■■■■■■■■人行走路线■■■■■■■■■■■■■□□←←←←←←↑□■■□□□■↓■■■↑□■■■■■□→→→→→□■■□□★→↑□□□■■■■■■■■■■■■■■■第二步■■■■■■■■■■■■■□→→→→→→→○□■■□□□■□■■■□□■■■■■□□□□□□□■■□□□□□□□□■■■■■■■■■■■■■■■人行走路线■■■■■■■■■■■■■→→→→→→→→○□■■↑←←■□■■■□□■■■■■□□□□□□□■■□□□□□□□□■■■■■■■■■■■■■■■从以上图中可以看出,要做以自动推箱子,还是非常复杂的,如果要推一个箱子,它要可以自动推动指定的那个箱子,并会自动绕开障碍物,如果障碍物是要推的那个箱子,则要自动将这个箱子推到可以开路的地方,但他不能去推动其它箱子来达到排除障碍物的目的。希望大家都讨论一下自己的看法和思路!谢谢
在picturebox在画个一个矩形框,并可以移动它,类似photoshop中选 这是我写的代码请新建一个工程,放一个图片框控件在窗体上,不改控件名称,放入以下代码Option Explicit'矩形结构Private Type RECT  Left   As Long  Top    As Long  Right   As Long  Bottom  As LongEnd Type'操作类型Enum OpType  None = 0  Draw  DragEnd EnumDim rc As RECT '所画矩形Dim ot As OpType '操作类型Dim m_X As Long '当拖动矩形时,鼠标位置的 X 坐标Dim m_Y As Long '当拖动矩形时,鼠标位置的 Y 坐标Private Sub Form_Load()  ot = None  With Picture1    .ScaleMode = vbPixels    .AutoRedraw = False    .Appearance = 0  End WithEnd SubPrivate Sub Form_Resize()  Picture1.Move ScaleX(8, vbPixels, ScaleMode), ScaleY(8, vbPixels, ScaleMode), _      ScaleWidth - ScaleX(16, vbPixels, ScaleMode), _      ScaleHeight - ScaleY(16, vbPixels, ScaleMode)End SubPrivate Sub Picture1_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)  If vbLeftButton = (Button And vbLeftButton) Then    Select Case ot    Case OpType.None      With rc        If X > .Left And X < .Right And Y > .Top And Y < .Bottom Then          '如果已经画好了矩形,如果点击矩形范围内任意位置,则视为拖动矩形          m_X = X          m_Y = Y          ot = Drag        Else          '反之则视为重画矩形          Call DrawRect          .Left = X          .Right = X          .Top = Y          .Bottom = Y          ot = Draw        End If      End With    Case OpType.Draw    Case OpType.Drag    End Select  End IfEnd SubPrivate Sub Picture1_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)  If vbLeftButton = (Button And vbLeftButton) Then    With rc      Select Case ot      Case OpType.None      Case OpType.Draw        '画矩形时,先画一次清除上次画的矩形
直接取字节的某一位的算法 直接取出指定字节(Byte)的某一位(Bit)的值,结果只会是0或1,也就是想知道这个位上是0还是1,大家有什么优的算法,不妨帖出来供大家研究和学习!我这里先帖出我的算法,经测试,第一种方法比第二种方法在速度上要快一半有多,很明显,第一种方法,用的是常量,所以少了计算步骤,而第二种方法还要先计算幂,所以就慢了许多,但从代码量上来讲,第二种方法较简捷。Option ExplicitDim byts(0 To 255) As BytePrivate Sub Command1_Click()  Dim ts As Single, td As Single  Dim i As Integer, j As Long, k As Integer, b As Byte  ts = Timer  For j = 0 To 1000    For i = 0 To 255'      Debug.Print byts(i),      For k = 7 To 0 Step -1'        Debug.Print ByteBit(byts(i), k),'        Debug.Print ByteBitEx(byts(i), k),'        b = ByteBit(byts(i), k)        b = ByteBitEx(byts(i), k)      Next'      Debug.Print "================================================"    Next  Next  td = Timer  Text1.Text = ts  Text2.Text = td  Text3.Text = td - ts  Debug.Print Now, td - tsEnd SubPrivate Sub Form_Load()  Dim i As Integer  For i = 0 To 255    byts(i) = i  NextEnd Sub'取字节的某一位Private Function ByteBit(ByVal bytValue As Byte, ByVal intBitIndex As Integer) As Byte  Select Case intBitIndex  Case 0    ByteBit = bytValue And &H1  Case 1    ByteBit = (bytValue And &H2) \ &H2  Case 2    ByteBit = (bytValue And &H4) \ &H4  Case 3    ByteBit = (bytValue And &H8) \ &H8  Case 4    ByteBit = (bytValue And &H10) \ &H10  Case 5    ByteBit = (bytValue And &H20) \ &H20  Case 6    ByteBit = (bytValue And &H40) \ &H40  Case 7    ByteBit = (bytValue And &H80) \ &H80  End SelectEnd Function'取字节的某一位Private Function ByteBitEx(ByVal bytValue As Byte, ByVal intBitIndex As Integer) As Byte  Select Case intBitIndex  Case 0 To 7    ByteBitEx = (bytValue And 2 ^ intBitIndex) \ 2 ^ intBitIndex  End SelectEnd Function以下是测试结果:调用ByteBit07-04-12 01:32:27 2.015625 07-04-12 01:32:31 2.202637 07-04-12 01:32:34 2 07-04-12 01:32:37 2.016113 07-04-12 01:32:40 2 07-04-12 01:32:43 2.015625 07-04-12 01:32:46 2 07-04-12 01:32:49 2.016113 07-04-12 01:32:55 1.983887 07-04-12 01:32:59 1.984863 07-04-12 01:33:03 2 07-04-12 01:33:06 2.015137 =====================================调用ByteBitEx07-04-12 01:34:41 4.219238 07-04-12 01:34:47 4.219238 07-04-12 01:34:52 4.203125 07-04-12 01:34:57 4.203125 07-04-12 01:35:02 4.21875 07-04-12 01:35:07 4.202637 07-04-12 01:35:11 4.219238 07-04-12 01:35:15 4.203125 07-04-12 01:35:19 4.219238 07-04-12 01:35:23 4.21875 07-04-12 01:35:28 4.219238
关於最短路迳的算法解析 今天在书上终於找到一个更好的算法,叫等高算法,实现的思路是:先由终点向四周出发,标识出步数,直到起点为止,再由起蹼,找标识出来的步数最小的坐标行走,就是最短路迳。如图,要从★点走到☆点┏━━━━━━━━━━━━━━━━━┓┃□□□□■■■■□□□□□□□□□┃┃□☆□□■■■■□□□□□□□□□┃┃□□□□■■■■□□□■■□□□□┃┃□□□□■■□□□□■■□□□■■┃┃■□□□■■□□□■■□□□■■■┃┃■□□□□□□□■■□□□■■■■┃┃■□□□□□□■■□□□■■□□□┃┃■□□□□□□■■□□□■■□□□┃┃■■■■■■■■■□□□□□□□□┃┃■■■■■■■■□□□□□□★□□┃┃■□□□□□□□□□□□□□□□□┃┗━━━━━━━━━━━━━━━━━┛由终点向四周标识出行走步数,直到到达起点为止,如图┏━━━━━━━━━━━━━━━━━┓┃ 2 1 2 3■■■■161718192021222324┃┃ 1☆ 1 2■■■■151617181920212223┃┃ 2 1 2 3■■■■141516■■21222324┃┃ 3 2 3 4■■11121314■■232223■■┃┃ 4 3 4 5■■101112■■252423■■■┃┃■ 4 5 6 7 8 910■■272625■■■■┃┃■ 5 6 7 8 910■■292827■■□□□┃┃■ 6 7 8 91011■■302928■■□□□┃┃■■■■■■■■■313029303132□□┃┃■■■■■■■■□3231303132★□□┃┃■□□□□□□□□□323132□□□□┃┗━━━━━━━━━━━━━━━━━┛再起点,找所标识出来的步数最小的路迳行走,为了直观,我把其它位置上的步数清除了┏━━━━━━━━━━━━━━━━━┓┃□□□□■■■■□□□□□□□□□┃┃□☆□□■■■■□1617181920□□□┃┃□ 1 2 3■■■■1415□■■21□□□┃┃□□□ 4■■□1213□■■2322□■■┃┃□□□ 5■■1011□■■□24□■■■┃┃■□□ 6 7 8 9□■■□2625■■■■┃┃■□□□□□□■■□□27■■□□□┃┃■□□□□□□■■□□28■■□□□┃┃■■■■■■■■■□□293031□□□┃┃■■■■■■■■□□□□□32★□□┃┃■□□□□□□□□□□□□□□□□┃┗━━━━━━━━━━━━━━━━━┛当然,在有些地方,不是唯一的,如1到4,9到16,21到26,29到32(从第二个图中可以看出),但这不影响找出的路迳是否为最短路迳的正确性。这个算法中,标识出行走步数的算法,需要优化,因为,大家可以注意到,从起始点到达终点,只需走32步,但在第二个图中,我们开始并不知道有多少步,所以有很标步骤是多馀,书上是用两个堆椎,交替实现,速度提高不少,但我没看懂,没理解到它的意思,它也没讲详细,所以我也没办法讲给大家。此算法有源码,要的留下邮箱!
◇链接·海外文物之最 中国流失国外的文物,就绘画而言,美国收藏最多,仅华盛顿弗利尔博物馆就有1200余幅;美国大都会博物馆所藏中国绘画近500幅;大英博物馆所藏中国绘画最精。在瓷器方面,以收藏亚洲艺术品著称的法国集美博物馆收藏最佳。就地方志和古籍而言,美国最多,美国国会图书馆就有4000多种地方志。 就甲骨片而言,日本是收藏最多的国家,在流失海外的近3万片甲骨片中,日本有近13000片。就敦煌宝藏而言,而今敦煌遗书在我国国内仅存2万件,仅占三成;藏于大英图书馆东方写本部有13700件;藏于法国巴黎国立图书馆有6000件;藏于俄罗斯圣彼得堡亚洲民族研究所12000件;藏于英国印度事务部图书馆近2000件,此外,日本、美国、瑞典、奥地利、韩国也均有敦煌文物收藏。 他乡国宝 ●欧洲 大英博物馆(英国) 女史箴图 大英博物馆收藏有中国文物23000余件,许多是珍品、孤品,其中东晋顾恺之《女史箴图》唐代摹本最为引人注目,敦煌文物也极其重要。大英图书馆(英国) 中国珍贵文献和古籍6万多种,其中有波罗蜜佛经最早版本、《永乐大典》45卷及甲骨片、敦煌藏经等。 枫丹白露宫(法国)在西方博物馆中,收藏和展览圆明园珍宝最多最好的要数法国的枫丹白露宫,有中国文物3万多件。 巴黎东方博物院(法国) 收藏有圆明园玉印两方,“保合太和”与“圆明园印”。 巴黎集美博物馆(法国) 这里收藏的瓷器从中国最早的原始瓷器一直到明清的青花、五彩瓷,多为精品。
关于实现双击文件自动打开的方法,要的进来 要实现在资源管理器里双击文件时,让系统使用你和程序来打开这个文件,或用户从命令行输入参数时打开指定参数的文件,我们需要实现两个功能:一是向系统注册文件类型,就是打开方式,使用API向注册表中写入注册表信息二是在程序中使用Command()函数获得命令行参数,但要注意,当用户是双击文件来打开的,那么此参数是被一对双引号引起来的字符串,我们需要先替换双引号(你放心,一个合法的文件名和路径是不会有双引号的),并加载此文件内容即可另外,从资源管理器里双击文件来的打开文件时,获得的文件名当然肯定是一个文件名,但是,当用户从命令行输入命令时,可以输入多个,如:我的记事本.exe c:\autoexec.bat d:\abc.txt,此时获得的参数实际上是两个参数,如果直接使用这参数当文件名打开时,会找不到文件,我们需要使用Split()函数分隔参数(分隔字符为空格)但还有一个问题,当文件名或路径中包含空格时,用户输入路径时需要将文件完整路径使用双引号引起来如:我的记事本.exe "D:\Program Files\Microsoft Visual Studio\VB98\NWIND.MDB"这时如果直接使用空格分隔就有问题,在这里,其实我们只传了一个文件名,但使用空格分隔就会分出四个参数来我现在的示例并没有考虑以上两个问题以下是源代码,要的也可以留下邮箱工程中有一个窗体:frmEdit,窗体上有一个TextBox控件:txtText(为了配合以下代码,或者你可以将以下代码中的控件、窗体名称改成你的)还有一个模块,名字随便'模块代码部分Option ExplicitPrivate Declare Function RegOpenKey Lib "advapi32.dll" Alias "RegOpenKeyA" ( _    ByVal hKey As Long, ByVal lpSubKey As String, phkResult As Long) As LongPrivate Declare Function RegQueryValueEx Lib "advapi32.dll" Alias "RegQueryValueExA" ( _    ByVal hKey As Long, ByVal lpValueName As String, ByVal lpReserved As Long, _    lpType As Long, lpData As Any, lpcbData As Long) As Long         ' Note that if you declare the lpData parameter as String, you must pass it By Value.Private Declare Function RegCreateKey Lib "advapi32.dll" Alias "RegCreateKeyA" ( _    ByVal hKey As Long, ByVal lpszSubKey As String, lphKey As Long) As LongPrivate Declare Function RegSetValue Lib "advapi32.dll" Alias "RegSetValueA" ( _    ByVal hKey As Long, ByVal lpszSubKey As String, ByVal fdwType As Long, _    ByVal lpszValue As String, ByVal dwLength As Long) As Long    Private Declare Function RegCloseKey Lib "advapi32.dll" (ByVal hKey As Long) As LongPrivate Const ERROR_SUCCESS = 0&Private Const ERROR_BADDB = 1&Private Const ERROR_BADKEY = 2&Private Const ERROR_CANTOPEN = 3&Private Const ERROR_CANTREAD = 4&Private Const ERROR_CANTWRITE = 5&Private Const ERROR_OUTOFMEMORY = 6&Private Const ERROR_INVALID_PARAMETER = 7&Private Const ERROR_ACCESS_DENIED = 8&Private Const HKEY_CLASSES_ROOT = &H80000000Private Const HKEY_LOCAL_MACHINE = &H80000002Private Const MAX_PATH = 256&Private Const REG_SZ = 1Private Const RFT_APP_NAME = "我的记事本"Private Const RFT_FILE_TYPE = "ZZZfiles"Private Const RFT_FILE_EXT_NAME = ".zzz"Public strCmdLine As String'注册文件类型,这里每次运行都会去注册,
1 下一页