au3 贪吃蛇游戏 研究与学习

贪吃蛇小游戏  部分函数要点

起定时器,$speed为每分钟调用次数   ,不知道

有参数的怎么处理
AdlibRegister("movesnake", $speed)

产生随机数
Random(0, $pos[0] / 14 - 1, 1)

疑问:
ReDim $labelarray[$count][3]
不会丢失之前的数据么,查资料是要加上保留属性的  如 ReDim   Preserve   X(10,   10,   15)

注册事件处理函数
GUIRegisterMsg(0x0100, "mykeydown") ;$WM_KEYDOWN = 0x0100

附代码:

Const $speed = 200, $dirfuhao[4][2] = [[0, -1],[1, 0],[0, 1],[-1, 0]] ;up,right,down,left
Local $count = 4, $movedir = 1, $turndir = 0
Local $top = IniRead(@ScriptDir & "\snakecfg.ini", "config", "top", 0)
Local $labelarray[$count][3], $lastnum = $count - 1, $randpoint[3], $pos[2] = [280, 196] ;280/14=20列,196/14=14行

$Form1 = GUICreate("Form1", $pos[0], $pos[1], -1, -1, 0x80000000) ;,0x80000000
For $i = 0 To $lastnum
    $labelarray[$i][0] = $pos[0] / 2 - 14 * $i ;x pos
    $labelarray[$i][1] = $pos[1] / 2 ;y pos
    $labelarray[$i][2] = GUICtrlCreateLabel("□", $labelarray[$i][0], $labelarray[$i][1], 14, 14, 0x0201)
    GUICtrlSetFont(-1, 15)
    GUICtrlSetState(-1, 128)
    GUICtrlSetBkColor(-1, 0x01CC01)
Next

myrand()
AdlibRegister("movesnake", $speed)
GUIRegisterMsg(0x0100, "mykeydown") ;$WM_KEYDOWN = 0x0100
GUISetState(@SW_SHOW)
MsgBox(0, "贪吃蛇", "开始游戏(需要使用wasd来表示方向)")
While True
    GUIGetMsg()
WEnd

Func movesnake()
    If $turndir And Mod($turndir - $movedir, 2) Then
        $movedir = $turndir - 4
        $turndir = 0
    EndIf
    If eatpoint() Then Return
    Switch $movedir
        Case 1 ;turn right
            If $labelarray[Mod($lastnum + 1, $count)][0] + 28 > $pos[0] Or checksame(1) Then myexit()
        Case 2 ;go down
            If $labelarray[Mod($lastnum + 1, $count)][1] + 28 > $pos[1] Or checksame(2) Then myexit()
        Case 3 ;turn left
            If $labelarray[Mod($lastnum + 1, $count)][0] - 14 < 0 Or checksame(3) Then myexit()
        Case 0 ;go up
            If $labelarray[Mod($lastnum + 1, $count)][1] - 14 < 0 Or checksame(0) Then myexit()
    EndSwitch
    $labelarray[$lastnum][0] = $labelarray[Mod($lastnum + 1, $count)][0] + $dirfuhao[$movedir][0] * 14
    $labelarray[$lastnum][1] = $labelarray[Mod($lastnum + 1, $count)][1] + $dirfuhao[$movedir][1] * 14
    GUICtrlSetPos($labelarray[$lastnum][2], $labelarray[$lastnum][0], $labelarray[$lastnum][1])
    If $lastnum Then
        $lastnum -= 1
    Else
        $lastnum = $count - 1
    EndIf
EndFunc   ;==>movesnake

Func myexit()
    AdlibUnRegister("movesnake")
    GUIRegisterMsg(0x0100, "")
    If $count > Number($top) Then
        IniWrite(@ScriptDir & "\snakecfg.ini", "config", "top", $count)
        MsgBox(0, "恭喜", "你创造了新记录:" & $count & "块" & @CR & "你的速度是" & $speed & "ms/step")
    Else
        MsgBox(0, "", "游戏结束")
    EndIf
    GUIDelete($Form1)
    Exit
EndFunc   ;==>myexit

Func mykeydown($hWnd, $iMsg, $wParam, $lParam)
    Switch $wParam
        Case 0x057 ;w up
            $turndir = 4
        Case 0x053 ;s down
            $turndir = 6
        Case 0x041 ;a left
            $turndir = 7
        Case 0x044 ;d right
            $turndir = 5
        Case Else
            Return
    EndSwitch
EndFunc   ;==>mykeydown

Func checksame($dir)
    For $i = 0 To $count - 1
        If $i = $lastnum Or $i = Mod($lastnum + 1, $count) Then ContinueLoop
        If $labelarray[Mod($lastnum + 1, $count)][0] + $dirfuhao[$dir][0] * 14 = $labelarray[$i][0] And $labelarray[Mod($lastnum + 1, $count)][1] + $dirfuhao[$dir][1] * 14 = $labelarray[$i][1] Then Return 1
    Next
    Return 0
EndFunc   ;==>checksame

Func myrand()
    While True
        $randpoint[0] = Random(0, $pos[0] / 14 - 1, 1)
        $randpoint[1] = Random(0, $pos[1] / 14 - 1, 1)
        For $i = 0 To $count - 1
            If $randpoint[0] * 14 = $labelarray[$i][0] And $randpoint[1] * 14 = $labelarray[$i][1] Then ExitLoop
        Next
        If $i = $count Then ExitLoop
    WEnd
    $randpoint[0] *= 14
    $randpoint[1] *= 14
    $randpoint[2] = GUICtrlCreateLabel("□", $randpoint[0], $randpoint[1], 14, 14, 0x0201)
    GUICtrlSetFont(-1, 15)
    GUICtrlSetState(-1, 128)
    GUICtrlSetBkColor(-1, 0x01CC01)
EndFunc   ;==>myrand

Func eatpoint()
    If $labelarray[Mod($lastnum + 1, $count)][0] + $dirfuhao[$movedir][0] * 14 <> $randpoint[0] Or $labelarray[Mod($lastnum + 1, $count)][1] + $dirfuhao[$movedir][1] * 14 <> $randpoint[1] Then Return 0
    $count += 1
    ReDim $labelarray[$count][3]
    If $lastnum + 2 < $count Then
        For $i = $count - 1 To $lastnum + 2 Step -1
            $labelarray[$i][0] = $labelarray[$i - 1][0]
            $labelarray[$i][1] = $labelarray[$i - 1][1]
            $labelarray[$i][2] = $labelarray[$i - 1][2]
        Next
    EndIf
    $labelarray[$lastnum + 1][0] = $randpoint[0]
    $labelarray[$lastnum + 1][1] = $randpoint[1]
    $labelarray[$lastnum + 1][2] = $randpoint[2]
    myrand()
    Return 1
EndFunc   ;==>eatpoint
时间: 2024-10-14 18:09:55

au3 贪吃蛇游戏 研究与学习的相关文章

Qt版贪吃蛇游戏

Qt版贪吃蛇游戏 转载请标明出处:牟尼的专栏 http://blog.csdn.net/u012027907 最近在学习Qt,用了一个多月的时间掌握了Qt中最基本的知识,也完成了<Qt版音乐播放器>.<Qt版贪吃蛇游戏>.<Qt版双人俄罗斯方块>以及<Qt版科学计算器>等,之前在VC下写过这些程序,所以在Qt下只是改变了显示等语句,我写过<C++版贪吃蛇游戏>.<VC版贪吃蛇游戏>,当时将与显示等无关的东西封装起来,在Qt下直接用,只

【141030】VC++贪吃蛇游戏源码(Win32+API)

不错的贪吃蛇游戏,运用了Win32的API.完整源代码,在VS2005下编译通过.内附有编程要点,很好的学习范例. 游戏源码下载地址:点击下载

贪吃蛇游戏

学习C语言也差不多学完了想做一个游戏,而贪吃蛇和俄罗斯方块都是非常经典的游戏,在网上也找到了许多相关的参考资料,便动手做了,这个游戏室控制台版的 游戏流程图 函数模块 函数名 函数功能 CursorPosition 光标定位函数 CreateSnake 蛇初始化函数 ShowWall 显示墙体 UpdateSnake 更新界面上的蛇体.分数.等级.食物 CollisionDetection 判断蛇是否咬到自己 RandFood 随机产生食物 Move 控制方向 程序代码 #include <st

贪吃蛇 游戏

结队作业  结队人 郑丁鹏(负责 (二)流程图和(四)游戏测试 ) 我负责 (二)游戏需求分析 与(三)游戏代码 贪吃蛇游戏程序设计 一.基本内容描述 运用java技术开发出贪吃蛇游戏,这个程序是用一个小矩形表示蛇的一节身体,身体每长一节,增加一个矩形块.移动时必须从蛇头开始,也就是蛇尾不能改作蛇头.当游戏者按了方向键后,蛇头朝着指定的方向移动,一步移动一节身体.图形的实现是从蛇头的新位置开始画出蛇.用户可以用上下左右键控制蛇头的方向,用空格键暂停或继续,非常简单! 可以实现如下功能: 贪吃蛇游

基于控制台实现贪吃蛇游戏

1).引言 学习编程,我个人觉得最好的办法就是根据自己的水平不断的给自己设定一个小目标.而这个小目标就是一个有意思的项目,通过完成这个项目,对自己的成果(也包括失败的)进行分析总结,从中提炼出对应的技术并分享出来,不断的往复,如此,为的就是让我们永远保持编写程序的兴趣和热情,完了,还提高我们的技术.而本文就是总结自己的一个小目标(基于控制台实现的贪吃蛇游戏而写的总结) 2).技术实现 大家小时候一定玩过贪吃蛇的游戏.贪吃蛇游戏的控制过程其实也不复杂.简单的可以概括为以下4个部分. 1.1  .组

使用Love2D引擎开发贪吃蛇游戏

今天来介绍博主最近捣腾的一个小游戏[贪吃蛇],贪吃蛇这个游戏相信大家都不会感到陌生吧.今天博主将通过Love2D这款游戏引擎来为大家实现一个简单的贪吃蛇游戏,在本篇文章当中我们将会涉及到贪吃蛇的基本算法.Lua语言编程等基本的内容,希望能够对大家开发类似的游戏提供借鉴和思考,文章中如有不足之处,还希望大家能够谅解,因为博主的游戏开发基本就是这样慢慢摸索着学习,所以难免会有不足的地方. 游戏算法 我们首先来看看贪吃蛇是怎么移动的? 通过这四张图的演示,我们可以发现这样一个规律: 蛇的移动其实是将蛇

Android快乐贪吃蛇游戏实战项目开发教程-01项目概述

一.项目简介贪吃蛇是一个很经典的游戏,也很适合用来学习.本教程将和大家一起做一个Android版的贪吃蛇游戏.我已经将做好的案例上传到了应用宝,大家可以下载下来把玩一下.为了和其它的贪吃蛇区别开来,我取名叫“快乐贪吃蛇”.应用宝链接:http://sj.qq.com/myapp/detail.htm?apkName=net.chengyujia.happysnake这里上两张截图先睹为快,哈哈.怎么玩大家应该都知道,不过我还是要多提一下.通过屏幕上的方向键控制蛇的前进方向.蛇每吃到一个食物身体会

贪吃蛇游戏程序设计

一.基本内容描述 运用java技术开发出贪吃蛇游戏,这个程序是用一个小矩形表示蛇的一节身体,身体每长一节,增加一个矩形块.移动时必须从蛇头开始,也就是蛇尾不能改作蛇头.当游戏者按了方向键后,蛇头朝着指定的方向移动,一步移动一节身体.图形的实现是从蛇头的新位置开始画出蛇.用户可以用上下左右键控制蛇头的方向,用空格键暂停或继续,非常简单! 可以实现如下功能: 贪吃蛇游戏是大家很常见的小游戏,在生活工作之余大家可以玩它,已达到放松各种压力的目的. 游戏可以进行升级,也就是增加吃食物的难度,以便使大家更

【视频】半小时内编写一个贪吃蛇游戏

贪吃蛇编写提纲 致谢: 感谢 Ronnie Mooney ,我是在学习了他的视频后完成这个视频的,你可以在 [C#] Creating a Snake Game - Less than an Hour 找到他的视频(需翻墙,请自备梯子). 编写 Input 静态类 初始化静态变量 private static readonly Hashtable _keys = new Hashtable() 编写方法 public static void ChangeState(Keys key, bool