刘金玉的零基础VB教程070期:贪吃蛇游戏开发第六节 记分与故障排除

简介: 刘金玉的零基础VB教程070期:贪吃蛇游戏开发第六节 记分与故障排除

刘金玉的零基础VB教程070期:



贪吃蛇游戏开发第六节

记分与故障排除


故障点分析

蛇重新开始游戏后,会自动变短

原因:

键盘按下时记录的键盘的按键,变成了方向

解决故障:

Abs(currentDirect - KeyCode) < 4

因为四个按键的差值不会大于4


Move函数

Move 参数1[,参数2][,参数3][,参数4]

参数1:left

参数2:top

参数3:width

参数4:height


游戏记分

重新定义label控件

直接赋值显示出来即可

记分的变量是全局变量,数值类型


课堂总结

1、故障排除

2、move函数的应用

3、记分控件


源代码:

'定义颜色类型
Private Type Color
    R As Integer
    G As Integer
    B As Integer
End Type
'定义食物类型
Private Type Food
    X As Single
    Y As Single
    C As Color
End Type
Private Type Node '每一节蛇身
    D As Integer '37左38上39右40下
    X As Single 'left
    Y As Single 'top
    C As Color '表示蛇身颜色
End Type
Dim W As Integer '每一节蛇身宽度
Dim sno() As Node '声明一条蛇,是动态数组
Dim currentDirect As Integer '代表蛇运动的当前方向
Dim n As Long '代表蛇身结点数
Private WithEvents timer1 As Timer
Private WithEvents lblscore As Label '自定义一个标签控件记录分数
'声明分数变量
Dim score As Long
'声明食物
Dim goods As Food
'初始化一条蛇的各个参数
Function init()
AutoRedraw = True '自动重绘
W = 200
currentDirect = 39 '默认向右运动
n = 5
ReDim sno(n) As Node
'初始化蛇身颜色
Randomize
Dim R%, G%, B%
R = Int(Rnd * 256)
G = Int(Rnd * 256)
B = Int(Rnd * 256)
'初始化各个坐标点
Dim i As Long
For i = 0 To UBound(sno) Step 1
    sno(i).D = currentDirect
    sno(i).X = ScaleWidth / 2 + i * W
    sno(i).Y = ScaleHeight / 2
    '初始化蛇身颜色
    sno(i).C.R = R
    sno(i).C.G = G
    sno(i).C.B = B
Next i
'初始化食物数据
Call rndFood
End Function
'随机生成食物数据
Function rndFood()
Randomize
goods.X = Int(Rnd * (ScaleWidth - W))
goods.Y = Int(Rnd * (ScaleHeight - W))
goods.C.R = Int(Rnd * 256)
goods.C.G = Int(Rnd * 256)
goods.C.B = Int(Rnd * 256)
End Function
'画食物
Function drawFood()
Line (goods.X, goods.Y)-(goods.X + W, goods.Y + W), RGB(goods.C.R, goods.C.G, goods.C.B), BF
End Function
'画一条蛇
Function drawSnake()
Cls
Dim i As Long
For i = 0 To UBound(sno) Step 1
    Line (sno(i).X, sno(i).Y)-(sno(i).X + W, sno(i).Y + W), RGB(sno(i).C.R, sno(i).C.G, sno(i).C.B), BF
Next i
End Function
Private Sub Form_KeyUp(KeyCode As Integer, Shift As Integer)
If Abs(currentDirect - KeyCode) <> 2 And Abs(currentDirect - KeyCode) < 4 Then currentDirect = KeyCode
End Sub
Private Sub Form_Load()
Call init
Call drawSnake
'对时钟控件进行初始化
Set timer1 = Controls.Add("vb.timer", "timer1")
timer1.Interval = 100
timer1.Enabled = True
'对分数标签初始化
Set lblscore = Controls.Add("vb.label", "lblscore")
lblscore.AutoSize = True
lblscore.BackStyle = vbTransparent
lblscore.Caption = "得分:" & score
lblscore.Move 100, 100
lblscore.Visible = True
End Sub
'运动思路:插入头结点,删除尾节点
Function sport()
Dim i As Long
'将每一个节点数据向前移动一位
For i = 1 To UBound(sno) Step 1
    sno(i - 1) = sno(i)
Next i
'将头结点,也就是数组的最后一位重新复制
If currentDirect = 37 Then
    sno(UBound(sno)).X = sno(UBound(sno)).X - W
ElseIf currentDirect = 38 Then
    sno(UBound(sno)).Y = sno(UBound(sno)).Y - W
ElseIf currentDirect = 39 Then
    sno(UBound(sno)).X = sno(UBound(sno)).X + W
ElseIf currentDirect = 40 Then
    sno(UBound(sno)).Y = sno(UBound(sno)).Y + W
End If
End Function
'蛇的运动
Private Sub timer1_Timer()
Call sport
Call drawSnake
'判断是否撞到窗体边缘
If isCrashWall Then
    If MsgBox("GAME OVER !是否重新开始?", vbYesNo, "游戏结束") = vbYes Then
        Call init
    Else
        End
    End If
End If
'画食物
Call drawFood
'判断是否吃到食物
If isEatFood Then
    '增长蛇身
    n = n + 1
    score = score + 1
    lblscore.Caption = "得分:" & score
    ReDim Preserve sno(n)
    sno(n).D = currentDirect
    sno(n).C.R = goods.C.R
    sno(n).C.G = goods.C.G
    sno(n).C.B = goods.C.B
    If currentDirect = 37 Then
        sno(n).X = sno(n - 1).X - W
        sno(n).Y = sno(n - 1).Y
    ElseIf currentDirect = 39 Then
        sno(n).X = sno(n - 1).X + W
        sno(n).Y = sno(n - 1).Y
    ElseIf currentDirect = 38 Then
        sno(n).X = sno(n - 1).X
        sno(n).Y = sno(n - 1).Y - W
    ElseIf currentDirect = 40 Then
        sno(n).X = sno(n - 1).X
        sno(n).Y = sno(n - 1).Y + W
    End If
    '随机生成食物
    Call rndFood
End If
End Sub
'是否撞到窗体边缘,撞到返回true,否则就是false
Function isCrashWall() As Boolean
isCrashWall = False
If sno(UBound(sno)).X + W > ScaleWidth _
  Or sno(UBound(sno)).X < 0 _
  Or sno(UBound(sno)).Y < 0 _
  Or sno(UBound(sno)).Y + W > ScaleHeight Then
    isCrashWall = True '撞到了
End If
End Function
'是否吃到食物,true吃到,false没吃到
Function isEatFood()
'默认没有吃到
isEatFood = False
'判断是否吃到,就是判断蛇头与食物是否碰撞
If sno(UBound(sno)).X + W > goods.X _
   And sno(UBound(sno)).X < goods.X + W _
   And sno(UBound(sno)).Y + W > goods.Y _
   And sno(UBound(sno)).Y < goods.Y + W Then
    isEatFood = True
End If
End Function

界面:

image.png

相关文章
|
8月前
|
存储 弹性计算 缓存
阿里云高配置云服务器2核16G、4核32G、8核64G价格及性能测评参考
阿里云2核16G、4核32G、8核64G高配置云服务器,核心适配内存密集、高并发及大型业务场景,覆盖ECS通用型、计算型、内存型等实例系列。租用价格受实例类型、计费方式、地域及活动政策影响显著,同时阿里云对法兰克福、东京等海外地域部分规格族已下调价格,进一步优化长期使用成本。以下结合最新收费标准与活动规则,用通俗语言梳理各配置的价格明细、适用场景及优惠政策,为用户提供客观参考,全文不含营销表述,兼顾实用性与可读性。
709 9
|
8月前
|
人工智能 自然语言处理 运维
构建AI智能体:一百、AI模型选择与部署考量:从业务需求到实际落地的思考决策
本文系统介绍了AI模型生态分类与选型方法论。主要内容包括:1)AI模型分类体系,分为通用大语言模型、文本嵌入模型和专业领域模型三大类;2)业务需求分析方法,从功能、性能、用户体验等维度进行需求拆解;3)模型选型决策框架,基于参数量、序列长度等指标建立四阶段评估流程;4)典型场景的模型选择建议,如智能客服推荐中等规模对话模型,内容创作选择大模型等。文章强调模型选择需平衡业务需求、技术指标和资源约束,并提供了代码示例说明不同模型的使用方法。最终指出没有最优模型,只有最适合特定场景的模型选择方案。
1080 17
|
7月前
|
存储 传感器 监控
一文搞懂ERP、MES、WMS的区别与联系
本文深入解析制造业三大核心系统:ERP(企业“大脑”,统筹资源与计划)、MES(车间“神经中枢”,实时执行与监控)、WMS(仓储“执行能手”,高效物流与库存管理)。三者数据互通、业务协同,构建“计划—执行—物流”闭环,驱动企业数字化转型与智能制造升级。(239字)
|
9月前
|
存储 缓存 关系型数据库
常见索引类型
本文档系统梳理了数据库索引的多维度分类:按存储结构分为聚簇与非聚簇索引,按约束性分为普通、唯一及主键索引,按字段数量分为单列与组合索引,按功能支持全文与空间索引,按底层结构涵盖B+树与哈希索引,详述其定义、适用场景及核心特性。
|
11月前
|
机器学习/深度学习 存储 并行计算
大模型推理加速技术:FlashAttention原理与实现
本文深入解析大语言模型推理加速的核心技术——FlashAttention。通过分析传统注意力机制的计算瓶颈,详细阐述FlashAttention的IO感知算法设计、前向反向传播实现,以及其在GPU内存层次结构中的优化策略。文章包含完整的CUDA实现示例、性能基准测试和实际部署指南,为开发者提供高效注意力计算的全套解决方案。
1850 10
|
人工智能 Ubuntu 固态存储
《2核2G阿里云神操作!Ubuntu+Ollama低成本部署Deepseek模型实战》
本文详解如何在阿里云2核2G轻量服务器上,通过Ubuntu系统与Ollama框架部署Deepseek-R1-Distill-Qwen-1.5B大模型。涵盖环境搭建、Ollama安装、虚拟内存配置及模型运行全流程,助力开发者以极低成本实现AI模型云端运行。
1901 1
《2核2G阿里云神操作!Ubuntu+Ollama低成本部署Deepseek模型实战》
|
SQL 存储 OLAP
数据外置提速革命:轻量级开源SPL如何用文件存储实现MPP级性能?
传统交易型数据库在分析计算中常遇性能瓶颈,将数据迁至OLAP数据仓库虽可缓解,但成本高、架构复杂。SPL通过轻量级列存文件存储历史数据,提供强大计算能力,大幅简化架构并提升性能。它优化了列式存储、数据压缩与多线程并行处理,在常规及复杂计算场景中均表现优异,甚至单机性能超越集群。实际案例中,SPL在250亿行数据的时空碰撞问题上,仅用6分钟完成ClickHouse集群30分钟的任务。
数据外置提速革命:轻量级开源SPL如何用文件存储实现MPP级性能?
|
SQL JSON 前端开发
较为完整的SpringBoot项目结构
本文介绍了SpringBoot项目的分层结构与目录组成。项目分为四层:**controller层**(前端交互)、**service层**(业务逻辑处理)、**dao层**(数据库操作)和**model层**(实体类定义)。分层设计旨在实现关注点分离,降低耦合度,提高系统灵活性、可维护性和扩展性。此外,还详细说明了项目目录结构,包括`controller`、`service`、`dao`、`entity`、`param`、`util`等子目录的功能划分,便于团队协作开发。此架构有助于前后端分离,明确各模块职责,符合高内聚低耦合的设计原则。
7742 1
|
存储 机器学习/深度学习 算法
C 408—《数据结构》图、查找、排序专题考点(含解析)
408考研——《数据结构》图,查找和排序专题考点选择题汇总(含解析)。
1623 29
|
Linux 网络性能优化 网络安全
Linux(openwrt)下iptables+tc工具实现网络流量限速控制(QoS)
通过以上步骤,您可以在Linux(OpenWrt)系统中使用iptables和tc工具实现网络流量限速控制(QoS)。这种方法灵活且功能强大,可以帮助管理员有效管理网络带宽,确保关键业务的网络性能。希望本文能够为您提供有价值的参考。
3738 28

热门文章

最新文章