VisualFreeBasic的编程文档和教程
论坛的首页 勇芳的软件
教程和帮助
  • VisualFreeBasic编程文档
  • 勇芳系列软件帮助说明教程
  • 留言或交流 登录
    登录
    侧边栏壁纸
    博主头像
    勇芳

    • 累计撰写 332 篇文章
    • 累计收到 0 条评论
    • 首页
    • 栏目
      • 论坛的首页
      • 勇芳的软件
      • 教程和帮助
        • VisualFreeBasic编程文档
        • 勇芳系列软件帮助说明教程
      • 留言或交流
      • 登录
    VisualFreeBasic编程文档
    • VisualFreeBasic游戏趣味编程_9.2_应用字符数组存储关卡数据 2026-1-22
      VisualFreeBasic游戏趣味编程_9.2_应用字符数组存储关卡数据 推箱子游戏效果如图9-4所示。 图9-4中的“推箱子”游戏一共有表9-1所示的几种元素。 表9-1 元素图片 功能描述 英文名称 缩写字符 空白区域:玩家可以穿过,箱子可以推上去 empty 'e' 墙:玩家不能经过,箱子不能推过去 wall 'w' 箱子:在前方没有障碍物的情况下,玩家可以推动 box 'b' 空白目标:需要玩家将箱子推上去 target 't' 完成目标:一个箱子在目标上的叠加状态 achieved 'a' 游戏角色:可以键盘控制移动,推动箱子到达目标 player 'p' 我们可以采用二维字符数组的形式描述关卡地图数据。用表9-1中对应的缩写字符,图9-4的地图可以表示为: Dim level(63) As String = _ {"w", "w", "w", "w", "w", "w", "w", "w", _ "w", "w", "w", "t", "b", "e", "e", "w", _ "w", "e", "e", "e", "e", "e", "e", "w", _ "w", "e", "e", "e", "e", "e", "e", "w", _ "w", "e", "e", "e", "e", "e", "e", "w", _ "w", "e", "e", "p", "a", "e", "e", "w", _ "w", "e", "e", "e", "w", "w", "w", "w", _ "w", "w", "w", "w", "w", "w", "w", "w"} 用字符串的形式对二维数组初始化,代码可写为: Dim level(7) As String = {"wwwwwwww", "wwwtbeew", "weeeeeew", "weeeeeew", "weeeeeew", "weepaeew", "weeewwww", "wwwwwwww"} dim level(7) 是有8个数据,0~7 8个。 定义全局变量level储存地图数据,在show()函数中根据level的值绘制出表9-1中的对应图案,完整代码如9-2所示。 #define B_SIZE 32 ' 方块大小 #define B_NUM 8 ' 方块个数,一共8*8个方块 '用字符型二维数组存储地图数据 'e: empty w: wall t: target b: box a: achieved p:player '全局变量定义 Dim Shared level(B_NUM -1) As ZString * B_NUM + 1 = {"wwwwwwww", "wwwtbeew", "weeeeeew", "weeeeeew", "weeeeeew", "weepaeew", "weeewwww", "wwwwwwww"} Sub startup() '初始化函数 End Sub Sub show(gg As yGDI) '绘制函数 gg.Cls BGR(150,150,150) '灰色背景。 Dim i As Long, j As Long For i = 0 To B_NUM -1 '遍历关卡二维数组数据 For j=0 To B_NUM -1 If Chr(level(i) [j]) = "e" Then 'empty元素是空白区域 gg.Pen 0,0 '框 gg.Brush BGR(150, 150, 150) '绘制灰色地面 gg.DrawFrame j*B_SIZE,i*B_SIZE,B_SIZE,B_SIZE ElseIf Chr(level(i) [j]) = "w" Then 'wall元素是墙 gg.Pen 1,BGR(120, 120, 120) '框 gg.Brush BGR(155, 0, 0) '绘制淡红色、灰色线的方框 gg.DrawFrame j*B_SIZE,i*B_SIZE,B_SIZE,B_SIZE ElseIf Chr(level(i) [j]) = "b" Then 'box元素是可移动的箱子 gg.Pen 1,BGR(150, 150, 150) '框 gg.Brush BGR(255, 255, 0) '绘制一个黄色的方块 gg.DrawFrame j*B_SIZE,i*B_SIZE,B_SIZE,B_SIZE ElseIf Chr(level(i) [j]) = "t" Then 'target元素是目标 gg.Pen 0,0 '框 gg.Brush BGR(255,255,255) gg.DrawFrame (j+0.25)*B_SIZE,(i+0.25)*B_SIZE,B_SIZE*0.5,B_SIZE*0.5 ElseIf Chr(level(i) [j]) = "a" Then 'achieved 元素是已完成目标 gg.Pen 0,0 '框 gg.Brush BGR(255, 255, 0) '绘制一个黄色的方块 gg.DrawFrame j *B_SIZE, i *B_SIZE, B_SIZE, B_SIZE gg.Pen 1,BGR(150, 150, 150) '框 gg.Brush BGR(255,255,255) gg.DrawFrame (j+0.25)*B_SIZE,(i+0.25)*B_SIZE,B_SIZE*0.5,B_SIZE*0.5 ElseIf Chr(level(i) [j]) = "p" Then 'player 元素是玩家,绘制一个人脸图案 '一个红色圆脸 gg.Pen 0,0 '框 gg.Brush BGR(255,0,0) '一个红色圆脸 gg.DrawEllipse (j+0.1)*B_SIZE,(i+0.1)*B_SIZE,B_SIZE*0.8,B_SIZE*0.8 '两个黑色眼睛 gg.Brush BGR(90, 90, 90) 'GDI的颜色值。 gg.DrawEllipse (j+0.2)*B_SIZE,(i+0.35)*B_SIZE,B_SIZE*0.25,B_SIZE*0.25 gg.DrawEllipse (j+0.55)*B_SIZE,(i+0.35)*B_SIZE,B_SIZE*0.25,B_SIZE*0.25 '一个深灰色嘴巴 gg.DrawFrame (j+0.3)*B_SIZE,(i+0.7)*B_SIZE,B_SIZE*0.4,B_SIZE*0.1 End If Next Next gg.Redraw End Sub Sub updateWithoutInput() '与输入无关的更新 Sleep 10 '暂停若干毫秒 End Sub Sub updateWithInput(hWndForm As hWnd, gg As ygdi) ' 和输入有关的更新 End Sub Sub 游戏执行过程(hWndForm As hWnd) Dim gg As yGDI = hWndForm startup() Do show(gg) updateWithInput(hWndForm, gg) updateWithoutInput() Loop End Sub
      • 2026年-1月-22日
      • 95 阅读
      • 0 评论
      VisualFreeBasic编程文档
    • VisualFreeBasic游戏趣味编程_9.1_字符串与字符数组 2026-1-22
      VisualFreeBasic游戏趣味编程_9.1_字符串与字符数组 语句print ("hello") 中双引号包含的多个字符,在FB语言中称为字符串。字符串也可以用字符型数组进行存储,输入并运行以下代码: Sub 游戏执行过程(hWndForm As hWnd) Dim str1 As String = "hello" Print str1 Dim str2 As ZString * 5 = "hello" Print str2 Dim str3 As WString * 5 = "中文五个字" Print str3 End Sub 程序运行后输出: hello hell 中文五个 其中: Dim str1 As String 是随意装任意长度的字符串,装多少显示多少 Dim str2 As ZString * 5 是定长字符串, 5 表示最多5个字符,为了于C语言兼容,最后一个是 0字符串,实际可以装 4个字符串 `Dim str3 As WString 5` 是Unicode编码 字符串,简单的说,ZString 是ASCII 编码,一个英文占1个空间,一个中文占2个字符空间,而 WString 不管中文英文,都占1个空间。 要存储多个字符串,也可以应用字符型二维数组。 Sub 游戏执行过程(hWndForm As hWnd) Dim str1(2) As String = {"Wuhan","Beijing","Shanghai"} Dim i As Long '通过二维数组元素输出 For i = 0 To 2 Print str1(i) Next End Sub 程序运行后输出: Wuhan Beijing Shanghai 提示 字符在内存中实际存储的也是一个整数值,该整数值称为该字符的ASCII码。读者可以尝试输入并运行以下代码: Dim str1 As String ="Wuhan" print str1[0],str1[1],str1[2],str1[3],str1[4] 程序运行后输出:87 | 117 | 104 | 97 | 110 可以网上搜索ASCII码,W=87 u=117 h=104 a=97 n=110 为了处理中文等复杂字符,Unicode编码 的 WString Sub 游戏执行过程(hWndForm As hWnd) Dim str1 As ZString *10 = "Wu中文" Dim str2 As WString *10 = "Wu中文" Print str1[0], str1[1], str1[2], str1[3], str1[4], str1[5] Print str2[0], str2[1], str2[2], str2[3] End Sub 程序运行后输出: 87 | 117 | 214 | 208 | 206 | 196 87 | 117 | 20013 | 25991 ZString 是ASCII码,一个中文是2个字符,WString 是Unicode编码,一个中文是1个字符 ZString WString 必须先指定 n容量,然后最多装指定的 n容量 -1 的字符。 String 是变长字符,可以装任何长度,当然内存有限,实际装 1.8G字符软件就崩溃。 String 实际是数据容器,默认 ASCII码字符串,可以装任何内容。
      • 2026年-1月-22日
      • 76 阅读
      • 0 评论
      VisualFreeBasic编程文档
    • VisualFreeBasic游戏趣味编程_第9章_“推箱子”游戏 2026-1-22
      VisualFreeBasic游戏趣味编程_第9章_“推箱子”游戏 在本章我们将探讨如何编写“推箱子”游戏,即玩家通过键盘控制游戏角色将所有黄色箱子推到白色方块处,效果如图9-1所示。 在本章我们将探讨如何编写“推箱子”游戏,即玩家通过键盘控制游戏角色将所有黄色箱子推到白色方块处,效果如图9-1所示。
      • 2026年-1月-22日
      • 112 阅读
      • 0 评论
      VisualFreeBasic编程文档
    • VisualFreeBasic游戏趣味编程_8.6_操作步数与旋转度数 2026-1-22
      VisualFreeBasic游戏趣味编程_8.6_操作步数与旋转度数 首先定义全局变量step记录还剩下的操作步数,score记录一共旋转的度数: Dim Shared 步数 As Long '还剩下的操作步数 Dim Shared 得分 As Long '得分,也就是一共旋转了多少度 在startup( )函数中进行初始化: Sub startup() '初始化函数 步数 = 10 ' 一共可以操作10步 得分 = 0 ' 初始为0度 在show()函数中输出相关的文字信息: gg.Font "黑体", 24 gg.SetColor BGR(255,255,255) 'GDI的颜色值。 gg.DrawString 280,60, 步数 & " 步" gg.DrawString 280, 100, 得分 & " 度" gg.Font "黑体", 10 gg.DrawString 10,245, "点击一个圆圈 其指针顺时针旋转90度之后 指向的指针依次旋转" 每旋转一次,得分增加90度: Sub rotateRound(i As Long, j As Long) 得分 +=90 update()函数中鼠标每操作一次,step减1: 步数 -=1 完整代码如下 Type Round '定义结构体,用来表示带角度指示的小圆圈 As Long x, y '小圆圈的圆心坐标 As Long r ' 小圆圈半径 angleNum As Long ' 对应的角度种类,只能是0、90、180、270,表示对应的4个角度值 End Type '全局变量定义 Dim Shared Rounds(4, 4) As Round '定义结构体变量 Dim Shared 步数 As Long '还剩下的操作步数 Dim Shared 得分 As Long '得分,也就是一共旋转了多少度 Sub startup() '初始化函数 步数 = 10 ' 一共可以操作10步 得分 = 0 ' 初始为0度 Dim i As Long Dim j As Long For i = 0 To 4 For j = 0 To 4 Rounds(i, j).x = j * 45 + 45 '设定小圆圈的圆心坐标 Rounds(i, j).y = i * 45 + 45 Rounds(i, j).r = 15 '设定小圆圈的半径 Rounds(i, j).angleNum = 270 Next Next End Sub Sub show(gg As yGDI) '绘制函数 gg.Cls BGR(0, 0, 0) '背景为黑色 Dim i As Long Dim j As Long '对所有小圆圈遍历 For i = 0 To 4 For j = 0 To 4 gg.Pen 1, BGR(255, 255, 255) '设置圆圈颜色为白灰色 gg.Brush '无填充 gg.DrawEllipse Rounds(i, j).x - Rounds(i, j).r, Rounds(i, j).y - Rounds(i, j).r, Rounds(i, j).r * 2, Rounds(i, j).r * 2 '画小圆圈 '用三角函数,画出这根红线 gg.Pen 1, BGR(255, 51, 51) 'GDI的颜色值。 gg.DrawLine Rounds(i, j).x, Rounds(i, j).y, Rounds(i, j).x + Rounds(i, j).r *Cos(Rounds(i, j).angleNum * (3.1415926 / 180)), _ Rounds(i, j).y + Rounds(i, j).r *Sin(Rounds(i, j).angleNum * (3.1415926 / 180)) Next Next gg.Font "黑体", 24 gg.SetColor BGR(255,255,255) 'GDI的颜色值。 gg.DrawString 280,60, 步数 & " 步" gg.DrawString 280, 100, 得分 & " 度" gg.Font "黑体", 10 gg.DrawString 10,245, "点击一个圆圈 其指针顺时针旋转90度之后 指向的指针依次旋转" gg.Redraw End Sub Sub updateWithoutInput() '与输入无关的更新 Sleep 10 '暂停若干毫秒 End Sub Sub rotateRound(i As Long, j As Long) 得分 +=90 If i >= 0 And j >= 0 And i < 5 And j < 5 Then Rounds(i, j).angleNum += 90 If Rounds(i, j).angleNum >= 360 Then Rounds(i, j).angleNum = 0 End If End Sub Sub updateWithInput(hWndForm As hWnd, gg As ygdi) ' 和输入有关的更新 Static pp As Long '预防鼠标一直按住,造成一直点击 If IsKeyPress(VK_LBUTTON) Then '鼠标左键点击 If pp = 0 Then pp = 1 '表示鼠标按下 Dim ps As Point GetCursorPos(@ps) '获取鼠标在屏幕的位置 MapWindowPoints HWND_DESKTOP, hWndForm, @ps, 1 '将鼠标位置从屏幕转换到游戏窗口的位置 ps.x = DpiUnScaleI(ps.x) '响应系统DPI ps.y = DpiUnScaleI(ps.y) Dim clicked_i As Long = Int(ps.y -45) / 45 Dim clicked_j As Long = int(ps.x -45) / 45 If clicked_i >= 0 And clicked_j >= 0 And clicked_i < 5 And clicked_j < 5 And 步数>0 Then '表示点中圆圈 步数 -= 1 rotateRound(clicked_i, clicked_j) '把当前圆圈顺时针旋转90度 Dim indexes(1) As Long = {clicked_i, clicked_j} '数组存储点击小圆圈的行列序号 While GetNextIndexes(indexes()) show(gg) Sleep 800 rotateRound(indexes(0), indexes(1)) Wend End If End If Else pp = 0 '表示鼠标放开 End If End Sub ' 获得当前圆圈指向的下一个圆圈的序号 ' 当前圆圈序号存储在数组int indexes[2]中,下一个圆圈序号也存储在这个数组中 ' 如果有下一个指向的圆圈,则返回1;如果指向边界了,则返回0 Function GetNextIndexes(indexes() As Long) As Long Dim i As Long = indexes(0) '当前圆圈的i、j序号 dim j as long = indexes(1) ' 根据当前圆圈的角度,获得下一个小圆圈的序号 If (Rounds(i,j).angleNum = 0) Then ' 指向右边的小圆圈 j += 1 ' right ElseIf (Rounds(i,j).angleNum = 90) Then ' 指向下边的小圆圈 i += 1 ' down ElseIf (Rounds(i,j).angleNum = 180) Then _ ' 指向左边的小圆圈 j -= 1 ' left ElseIf (Rounds(i,j).angleNum = 270) Then _ ' 指向上边的小圆圈 i -= 1 ' up End If indexes(0) = i ' 在数组中更新指向的下一个圆圈的序号 indexes(1) = j If (i >= 0 And i < 5 And j >= 0 And j < 5) Then ' 如果序号没有越界 Return 1 ' 说明指向了一个圆圈,返回1 Else Return 0 ' 没有指向有效圆圈,返回0 End If End Function Sub 游戏执行过程(hWndForm As hWnd) Dim gg As yGDI = hWndForm startup() Do show(gg) updateWithInput(hWndForm, gg) updateWithoutInput() Loop End Sub
      • 2026年-1月-22日
      • 81 阅读
      • 0 评论
      VisualFreeBasic编程文档
    • VisualFreeBasic游戏趣味编程_8.5_旋转的传播 2026-1-22
      VisualFreeBasic游戏趣味编程_8.5_旋转的传播 当鼠标点中一个小圆圈时,小圆圈顺时针旋转90度,然后其指向的下一个圆圈继续旋转90度,如此迭代下去,直到不指向任何小圆圈为止(此时指向边界),如图8-7所示。 首先定义一维数组indexes存储被鼠标点中的小圆圈在二维数组rounds中的行列序号: Dim indexes(1) As Long '数组存储点击小圆圈的行列序号 定义函数int GetNextIndexes(int indexes[2]),根据当前小圆圈的序号indexes[0]、indexes[1]和当前小圆圈的角度angleNum,首先求出其指向的小圆圈的序号。如果指向的小圆圈超出边界,函数返回0;如果指向一个有效的小圆圈,就把其序号更新到数组indexes中,函数返回1。 ' 获得当前圆圈指向的下一个圆圈的序号 ' 当前圆圈序号存储在数组int indexes[2]中,下一个圆圈序号也存储在这个数组中 ' 如果有下一个指向的圆圈,则返回1;如果指向边界了,则返回0 Function GetNextIndexes(indexes() As Long) As Long Dim i As Long = indexes(0) '当前圆圈的i、j序号 dim j as long = indexes(1) ' 根据当前圆圈的角度,获得下一个小圆圈的序号 If (Rounds[i][j].angleNum = = 0) Then ' 指向右边的小圆圈 j += 1 ' right ElseIf (Rounds[i][j].angleNum = 3) Then ' 指向下边的小圆圈 i += 1 ' down ElseIf (Rounds[i][j].angleNum = 2) Then _ ' 指向左边的小圆圈 j -= 1 ' left ElseIf (rounds[i][j].angleNum = 1) Then _ ' 指向上边的小圆圈 i -= 1 ' up End If indexes(0) = i ' 在数组中更新指向的下一个圆圈的序号 indexes(1) = j If (i >= 0 And i < 5 And j >= 0 And j < 5) Then ' 如果序号没有越界 Return 1 ' 说明指向了一个圆圈,返回1 Else Return 0 ' 没有指向有效圆圈,返回0 End If End Function 循环调用GetNextIndexes( )函数,即实现了旋转的迭代传播: Dim indexes(1) As Long={clicked_i, clicked_j} '数组存储点击小圆圈的行列序号 While GetNextIndexes(indexes()) rotateRound(indexes(0),indexes(1)) show(gg) Sleep 800 Wend 完整代码 Type Round '定义结构体,用来表示带角度指示的小圆圈 As Long x, y '小圆圈的圆心坐标 As Long r ' 小圆圈半径 angleNum As Long ' 对应的角度种类,只能是0、90、180、270,表示对应的4个角度值 End Type '全局变量定义 Dim Shared Rounds(4, 4) As Round '定义结构体变量 Sub startup() '初始化函数 Dim i As Long Dim j As Long For i = 0 To 4 For j = 0 To 4 Rounds(i, j).x = j * 45 + 45 '设定小圆圈的圆心坐标 Rounds(i, j).y = i * 45 + 45 Rounds(i, j).r = 15 '设定小圆圈的半径 Rounds(i, j).angleNum = 270 Next Next End Sub Sub show(gg As yGDI) '绘制函数 gg.Cls BGR(0, 0, 0) '背景为黑色 Dim i As Long Dim j As Long '对所有小圆圈遍历 For i = 0 To 4 For j = 0 To 4 gg.Pen 1, BGR(255, 255, 255) '设置圆圈颜色为白灰色 gg.Brush '无填充 gg.DrawEllipse Rounds(i, j).x - Rounds(i, j).r, Rounds(i, j).y - Rounds(i, j).r, Rounds(i, j).r * 2, Rounds(i, j).r * 2 '画小圆圈 '用三角函数,画出这根红线 gg.Pen 1, BGR(255, 51, 51) 'GDI的颜色值。 gg.DrawLine Rounds(i, j).x, Rounds(i, j).y, Rounds(i, j).x + Rounds(i, j).r *Cos(Rounds(i, j).angleNum * (3.1415926 / 180)), _ Rounds(i, j).y + Rounds(i, j).r *Sin(Rounds(i, j).angleNum * (3.1415926 / 180)) Next Next gg.Redraw End Sub Sub updateWithoutInput() '与输入无关的更新 Sleep 10 '暂停若干毫秒 End Sub Sub rotateRound(i As Long, j As Long) If i >= 0 And j >= 0 And i < 5 And j < 5 Then Rounds(i, j).angleNum += 90 If Rounds(i, j).angleNum >= 360 Then Rounds(i, j).angleNum = 0 End If End Sub Sub updateWithInput(hWndForm As hWnd,gg As ygdi ) ' 和输入有关的更新 Static pp As Long '预防鼠标一直按住,造成一直点击 If IsKeyPress(VK_LBUTTON) Then '鼠标左键点击 If pp = 0 Then pp = 1 '表示鼠标按下 Dim ps As Point GetCursorPos(@ps) '获取鼠标在屏幕的位置 MapWindowPoints HWND_DESKTOP, hWndForm, @ps, 1 '将鼠标位置从屏幕转换到游戏窗口的位置 ps.x = DpiUnScaleI(ps.x) '响应系统DPI ps.y = DpiUnScaleI(ps.y) Dim clicked_i As Long = Int(ps.y -45) / 45 Dim clicked_j As Long = int(ps.x -45) / 45 rotateRound(clicked_i, clicked_j) '把当前圆圈顺时针旋转90度 Dim indexes(1) As Long={clicked_i, clicked_j} '数组存储点击小圆圈的行列序号 While GetNextIndexes(indexes()) rotateRound(indexes(0),indexes(1)) show(gg) Sleep 800 Wend End If Else pp = 0 '表示鼠标放开 End If End Sub ' 获得当前圆圈指向的下一个圆圈的序号 ' 当前圆圈序号存储在数组int indexes[2]中,下一个圆圈序号也存储在这个数组中 ' 如果有下一个指向的圆圈,则返回1;如果指向边界了,则返回0 Function GetNextIndexes(indexes() As Long) As Long Dim i As Long = indexes(0) '当前圆圈的i、j序号 dim j as long = indexes(1) ' 根据当前圆圈的角度,获得下一个小圆圈的序号 If (Rounds(i,j).angleNum = 0) Then ' 指向右边的小圆圈 j += 1 ' right ElseIf (Rounds(i,j).angleNum = 90) Then ' 指向下边的小圆圈 i += 1 ' down ElseIf (Rounds(i,j).angleNum = 180) Then _ ' 指向左边的小圆圈 j -= 1 ' left ElseIf (Rounds(i,j).angleNum = 270) Then _ ' 指向上边的小圆圈 i -= 1 ' up End If indexes(0) = i ' 在数组中更新指向的下一个圆圈的序号 indexes(1) = j If (i >= 0 And i < 5 And j >= 0 And j < 5) Then ' 如果序号没有越界 Return 1 ' 说明指向了一个圆圈,返回1 Else Return 0 ' 没有指向有效圆圈,返回0 End If End Function Sub 游戏执行过程(hWndForm As hWnd) Dim gg As yGDI = hWndForm startup() Do show(gg) updateWithInput(hWndForm, gg) updateWithoutInput() Loop End Sub
      • 2026年-1月-22日
      • 93 阅读
      • 0 评论
      VisualFreeBasic编程文档
    • VisualFreeBasic游戏趣味编程_8.4_函数的参数传递 2026-1-22
      VisualFreeBasic游戏趣味编程_8.4_函数的参数传递 在本节我们介绍一般变量、数组元素、数组名作为函数参数的几种情况。输入并运行以下代码: Sub fun(a As Long) a += 1 Print a End Sub Sub 游戏执行过程(hWndForm As hWnd) Dim x As Long = 1 Print x fun(x) Print x End Sub 程序运行后输出: 1 2 1 程序从主函数开始运行,首先定义变量x并初始化为1,print x 输出1。 接着执行fun(x) 进入fun()函数,为变量a分配内存空间,将实际参数x的值赋给形式参数a。执行fun()函数内部的语句a+=1 ,print a 输出2。fun()运行结束后,收回变量a的内存空间。 回到主函数中,x的值没有改变,print x 仍然输出1。 一般变量作为函数的参数,这种调用方式称为单向值调用,函数内形式参数的值改变不会影响主函数中对应实际参数的值。 以下代码将数组元素传递给函数: Sub fun(i As Long,j As Long ) i += 1 j+=1 End Sub Sub 游戏执行过程(hWndForm As hWnd) Dim x(1) As Long = {1,2} Print x(0),x(1) fun(x(0),x(1)) Print x(0),x(1) End Sub 程序运行后输出: 1 2 1 2 数组元素作为函数实际参数的用法和一般变量作为实际参数的用法一样,都是单向的值传递。 为了能在函数中修改实际参数的值,我们可以把数组名作为参数进行传递。输入并运行以下代码: Sub fun(a() As Long) a(0) = 3 a(1) = 4 End Sub Sub 游戏执行过程(hWndForm As hWnd) Dim x(1) As Long = {1,2} Print x(0),x(1) fun( x() ) Print x(0),x(1) End Sub 程序运行后输出: 1 2 3 4 在下一节我们将讲解利用数组作为函数的参数,实现圆圈旋转的迭代传播。
      • 2026年-1月-22日
      • 80 阅读
      • 0 评论
      VisualFreeBasic编程文档
    • VisualFreeBasic游戏趣味编程_8.3_被鼠标点击后旋转 2026-1-22
      VisualFreeBasic游戏趣味编程_8.3_被鼠标点击后旋转 鼠标点击位置的坐标为(m.x,m.y),根据图8-3中5行5列小圆圈的坐标设置(代码8-1-2.cpp),被鼠标点中的小圆圈在二维数组rounds中的行、列序号为: Dim clicked_i As Long = Int(ps.y -45)/45 Dim clicked_j As Long = int(ps.x -45)/45 被点中的小圆圈需要顺时针旋转90度,如图8-6所示。 只需要将其angleNum值依次+90即可: Rounds(i, j).angleNum += 90 If Rounds(i, j).angleNum >= 360 Then Rounds(i, j).angleNum = 0 其中“+=”为复合运算符,x += 1等价于x = x ++ 1。 练习题8-2:写出以下程序并运行结果。 Dim a As Long = 1 a += 4 Print a a -= 2 Print a a *= 3 Print a a /= 2 Print a a Mod= 3 Print a 把小圆圈顺时针旋转的功能封装在函数rotateRound( )中,修改代码如下: Sub updateWithInput(hWndForm As hWnd) ' 和输入有关的更新 Static pp As Long '预防鼠标一直按住,造成一直点击 If IsKeyPress(VK_LBUTTON) Then '鼠标左键点击 If pp = 0 Then pp = 1 '表示鼠标按下 Dim ps As Point GetCursorPos(@ps) '获取鼠标在屏幕的位置 MapWindowPoints HWND_DESKTOP, hWndForm, @ps, 1 '将鼠标位置从屏幕转换到游戏窗口的位置 ps.x = DpiUnScaleI(ps.x) '响应系统DPI ps.y = DpiUnScaleI(ps.y) Dim clicked_i As Long = Int(ps.y -45) / 45 Dim clicked_j As Long = int(ps.x -45) / 45 rotateRound(clicked_i, clicked_j) '把当前圆圈顺时针旋转90度 End If Else pp = 0 '表示鼠标放开 End If End Sub
      • 2026年-1月-22日
      • 79 阅读
      • 0 评论
      VisualFreeBasic编程文档
    • VisualFreeBasic游戏趣味编程_8.2_鼠标交互 2026-1-22
      VisualFreeBasic游戏趣味编程_8.2_鼠标交互 回顾7.4节中讲解的键盘交互处理函数: Sub updateWithInput(moveDirection As String) ' 和输入有关的更新 If IsKeyPress(&H57) Then moveDirection = "上" ElseIf IsKeyPress(&H53) Then moveDirection = "下" ElseIf IsKeyPress(&H41) Then moveDirection = "左" ElseIf IsKeyPress(&H44) Then moveDirection = "右" End If End Sub 对于很多游戏,鼠标交互是一种更加自然的交互方式。和键盘交互代码结构类似,我们也可以实现基于鼠标的交互处理: Sub updateWithInput() ' 和输入有关的更新 If IsKeyPress(VK_LBUTTON) Then '鼠标左键点击 Dim ps As Point GetCursorPos(@ps) '获取鼠标位置 '执行相应的操作 'ps.x 当前鼠标的x坐标 ps.y 为当前鼠标的y坐标 End If End Sub 以下代码实现点击鼠标时,在鼠标位置绘制一个红色圆圈: Sub 游戏执行过程(hWndForm As hWnd) Dim gg As yGDI = hWndForm Do If IsKeyPress(VK_LBUTTON) Then '鼠标左键点击 Dim ps As Point GetCursorPos(@ps) '获取鼠标在屏幕的位置 MapWindowPoints HWND_DESKTOP, hWndForm, @ps, 1 '将鼠标位置从屏幕转换到游戏窗口的位置 ps.x = DpiUnScaleI(ps.x) '响应系统DPI ps.y = DpiUnScaleI(ps.y) gg.Brush BGR(229, 0, 0) 'GDI的颜色值。 gg.DrawEllipse ps.x - 10, ps.y - 10, 20, 20 '画小圆圈 gg.Redraw End If Sleep 10 Loop End Sub 程序运行后输出如图所示。 同样,也可以实现鼠标移动时,绘制一系列绿色的小圆圈: Sub 游戏执行过程(hWndForm As hWnd) Dim gg As yGDI = hWndForm Do Dim ps As Point GetCursorPos(@ps) '获取鼠标在屏幕的位置 MapWindowPoints HWND_DESKTOP, hWndForm, @ps, 1 '将鼠标位置从屏幕转换到游戏窗口的位置 If ps.x >= 0 and ps.x <= Form1.ScaleWidth And ps.y >= 0 and ps.y < Form1.ScaleHeight then ps.x = DpiUnScaleI(ps.x) '响应系统DPI ps.y = DpiUnScaleI(ps.y) gg.Brush BGR(0, 204, 0) 'GDI的颜色值。 gg.DrawEllipse ps.x - 5, ps.y - 5, 10, 10 '画小圆圈 gg.Redraw End If Sleep 10 Loop End Sub
      • 2026年-1月-22日
      • 94 阅读
      • 0 评论
      VisualFreeBasic编程文档
    • VisualFreeBasic游戏趣味编程_8.1_结构体 2026-1-22
      VisualFreeBasic游戏趣味编程_8.1_结构体 图8-1中的绘制单元由一个白色圆圈、一个红色指针组成。记录白色圆圈的信息需要定义3个变量: Dim As Long x,y '小圆圈的圆心坐标 Dim As Long r ' 小圆圈半径 红色指针起点在圆心,长度为圆半径,其角度只能有0、90、180、270 这4种可能。定义取值范围为[0,3]的整型变量angleNum Dim As Long angleNum ' 对应的角度种类,只能是0、1、2、3,表示对应的4个角度值 要记录图8-1中的5行5列所有圆圈信息,我们可以采用数组的形式: Dim As Long x(24),y(24) '小圆圈的圆心坐标 Dim As Long r(24) ' 小圆圈半径 Dim As Long angleNum(24) ' 对应的角度种类,只能是0、1、2、3,表示对应的4个角度值 数组可以处理大量的同类型数据,其中每一个元素都属于同一种数据类型。而利用结构体,可以将一个物体的不同类型数据集合在一起,形成一个整体,使代码更加直观、简洁: Type Round '定义结构体,用来表示带角度指示的小圆圈 As Long x, y '小圆圈的圆心坐标 As Long r ' 小圆圈半径 angleNum As Long ' 对应的角度种类,只能是0、1、2、3,表示对应的4个角度值 End Type 其中,Type 是定义结构体的关键词,Round是自定义的结构体类型名。 内定义了结构体的成员变量,成员变量的数据类型可以不同。最后 End Type 结束 定义结构体类型Round后,我们就可以用Round来定义变量: Dim Rounds As Round '定义结构体变量 Round 可以理解为一种Round类型的变量,可以通过如下形式设定round的成员变量: Rounds.x = 300 '设定小圆圈的圆心坐标 Rounds.y =300 Rounds.r=30 '设定小圆圈的半径 Rounds.angleNum = 270 也可以通过访问round的成员变量,绘制出对应的小圆圈: Sub show(gg As yGDI) '绘制函数 gg.Cls BGR(0, 0, 0) '背景为黑色 Dim Rounds As Round '定义结构体变量 Rounds.x = 100 '设定小圆圈的圆心坐标 Rounds.y = 100 Rounds.r = 30 '设定小圆圈的半径 Rounds.angleNum = 270 gg.Pen 1, BGR(255, 255, 255) '设置圆圈颜色为白灰色 gg.Brush '无填充 gg.DrawEllipse Rounds.x - Rounds.r, Rounds.y - Rounds.r, Rounds.r * 2, Rounds.r * 2 '画小圆圈 '用三角函数,画出这根红线 gg.Pen 1, BGR(255, 51, 51) 'GDI的颜色值。 gg.DrawLine Rounds.x, Rounds.y, Rounds.x + Rounds.r *Cos(Rounds.angleNum * (3.1415926 / 180)) ,Rounds.y + Rounds.r *Sin(Rounds.angleNum * (3.1415926 / 180)) gg.Redraw End Sub 绘制效果 进一步,定义结构体二维数组,存储图8-1中5行5列所有圆圈的信息: Rounds(i, j).x = 100 '设定小圆圈的圆心坐标 Rounds(i, j).y = 200 Rounds(i, j).r = 30 '设定小圆圈的半径 Rounds(i, j).angleNum = 270 利用结构体二维数组和游戏开发框架,实现代码如下 Type Round '定义结构体,用来表示带角度指示的小圆圈 As Long x, y '小圆圈的圆心坐标 As Long r ' 小圆圈半径 angleNum As Long ' 对应的角度种类,只能是0、90、180、270,表示对应的4个角度值 End Type '全局变量定义 Dim Shared Rounds(4, 4) As Round '定义结构体变量 Sub startup(gg As yGDI) '初始化函数 Dim i As Long Dim j As Long For i = 0 To 4 For j = 0 To 4 Rounds(i, j).x = j * 45 + 45 '设定小圆圈的圆心坐标 Rounds(i, j).y = i * 45 + 45 Rounds(i, j).r = 15 '设定小圆圈的半径 Rounds(i, j).angleNum = 270 Next Next End Sub Sub show(gg As yGDI) '绘制函数 gg.Cls BGR(0, 0, 0) '背景为黑色 Dim i As Long Dim j As Long '对所有小圆圈遍历 For i = 0 To 4 For j = 0 To 4 gg.Pen 1, BGR(255, 255, 255) '设置圆圈颜色为白灰色 gg.Brush '无填充 gg.DrawEllipse Rounds(i, j).x - Rounds(i, j).r, Rounds(i, j).y - Rounds(i, j).r, Rounds(i, j).r * 2, Rounds(i, j).r * 2 '画小圆圈 '用三角函数,画出这根红线 gg.Pen 1, BGR(255, 51, 51) 'GDI的颜色值。 gg.DrawLine Rounds(i, j).x, Rounds(i, j).y, Rounds(i, j).x + Rounds(i, j).r *Cos(Rounds(i, j).angleNum * (3.1415926 / 180)), _ Rounds(i, j).y + Rounds(i, j).r *Sin(Rounds(i, j).angleNum * (3.1415926 / 180)) Next Next gg.Redraw End Sub Sub updateWithoutInput() '与输入无关的更新 Sleep 10 '暂停若干毫秒 End Sub Sub updateWithInput() ' 和输入有关的更新 End Sub Sub 游戏执行过程(hWndForm As hWnd) Dim gg As yGDI = hWndForm startup(gg) '初始化函数,仅执行一次 Do show(gg) ' 进行绘制 updateWithInput() ' 和输入有关的更新 updateWithoutInput() ' 和输入无关的更新 Loop End Sub 程序运行后输出如图
      • 2026年-1月-22日
      • 81 阅读
      • 0 评论
      VisualFreeBasic编程文档
    • VisualFreeBasic游戏趣味编程_第8章_“十步万度”游戏 2026-1-22
      VisualFreeBasic游戏趣味编程_第8章_“十步万度”游戏 在本章我们将探讨如何编写“十步万度”游戏,效果如图8-1所示。用鼠标点击任意一个小圆圈,其指针顺时针旋转90度,后续被指向的圆圈指针也依次旋转,所有圆圈的旋转度数累积。玩家点击10次,尝试得到尽量高的旋转度数。 本章首先介绍了结构体的概念,并展示利用结构体数组存储所有小圆圈信息;然后讲解了鼠标交互的方法,以及如何实现被鼠标点中的小圆圈的旋转;接着讲解了数组作为函数的参数,以及如何实现旋转的迭代传播;最后解析了如何实现操作步数和旋转度数的统计与显示。
      • 2026年-1月-22日
      • 107 阅读
      • 0 评论
      VisualFreeBasic编程文档
    • 8
    • 9
    • 10
    • 11
    • 12
    博主栏壁纸
    博主头像 勇芳

    332 文章数
    0 评论量
    • 军旗记牌器双开,会有一方期会自己变成别的期
    人生倒计时
    最新评论
    链接
    • 公益·寻亲,让爱回家
    • Visual Basic6 语言和控件手册
    • CWindow类库帮助FreeBasic版
    • FreeBASIC 帮助文档中文版
    • Windows GDI 编程手册
    • Windows GDI+ 编程手册
    • SQLite3数据库API手册
    • WebBrowser控件编程手册
    • Win32API参考手册
    • Windows 编程宝典
    • WinHttp参考资料
    • WMI编程手册
    • VisualFreeBasic编程文档
    舔狗日记
    载入天数...载入时分秒...

    © 2025 勇芳软件工作室 版权所有

    ICP备案图标 浙ICP备11006222号-1 | 公安备案图标 33100402331731号

    powered by emlog 浙ICP备11006222号-1