VisualFreeBasic游戏趣味编程_8.6_操作步数与旋转度数

2026-1-22 / 0 评论 / 37 阅读

首先定义全局变量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

评论一下?

OωO
取消