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

评论一下?