- 任务
实现一个 2D 滑动块益智游戏,其中带有数字的块组合在一起以添加它们的值。
- 游戏规则
-
- 规则是玩家必须在每一回合选择一个方向(上、下、左或右)。
- 所有的瓷砖都尽可能朝那个方向移动,有些移动得比其他的多。
- 具有匹配数字的两个相邻瓷砖(仅在该方向上)组合成一个带有这些数字总和的瓷砖。
- 当至少一个棋子可以移动时,移动是有效的,如果只是通过组合。
- 每回合结束时,在随机选择的空方格(如果有的话)处生成一个 值为 2的新图块。
- 在空白处添加新瓷砖。大多数情况下, 要添加一个新的2 ,偶尔( 10%的时间)会添加一个 4。
- 要获胜,玩家必须创建一个编号为 2048的图块。
- 如果没有有效的移动是可能的,玩家就输了。
该名称来自该游戏机制的流行开源实现2048。
- 要求
- “非贪婪”运动。
通过组合其他瓷砖创建的瓷砖不应在同一回合(移动)中再次组合。
也就是说,移动瓦片行的:
[2][2][2][2]
-
- 右侧应导致:
......[4][4]
-
- 并不是:
.........[8]
- “移动方向优先”。
如果可能有多个组合变体,则移动方向应指示哪种组合将生效。
例如,移动瓦片行:
...[2][2][2]
-
- 右侧应导致:
......[2][4]
-
- 并不是:
......[4][2]
- 检查有效的移动。玩家不应该通过尝试不改变棋盘的动作来跳过他们的回合。
- 检查获胜条件。
- 检查丢失情况。
参考代码
Grid := [], s := 16, w := h := S * 4.5
Gui, font, s%s%
Gui, add, text, y1
loop, 4
{
row := A_Index
loop, 4
{
col := A_Index
if col = 1
Gui, add, button, v%row%_%col% xs y+1 w%w% h%h% -TabStop, % Grid[row,col] := 0
else
Gui, add, button, v%row%_%col% x+1 yp w%w% h%h% -TabStop, % Grid[row,col] := 0
}
}
Gui, show,, 2048
;------------------------------
Start:
for row, obj in Grid
for col, val in obj
Grid[row,col] := 0
Grid[1,1]:=2
ShowGrid()
return
;------------------------------
GuiClose:
ExitApp
return
;------------------------------
#IfWinActive, 2048
;------------------------------
up::
move := false
loop, 4
{
col := A_Index
Loop, 3
{
row := A_Index
if Grid[row, col] && (Grid[row, col] = Grid[row+1, col])
Grid[row, col] *=2 , Grid[row+1, col] := 0, move := true
}
}
loop, 4
{
row := A_Index
loop, 4
{
col := A_Index
loop, 4
if !Grid[row, col]
loop, 3
if !Grid[row, col] && Grid[row+A_Index, col]
{
Grid[row, col] := Grid[row+A_Index, col] , Grid[row+A_Index, col] := 0, move := true
if (Grid[row, col] = Grid[row-1, col])
Grid[row-1, col] *=2 , Grid[row, col] := 0, move := true
}
}
}
gosub, AddNew
return
;------------------------------
Down::
move := false
loop, 4
{
col := A_Index
Loop, 3
{
row := 5-A_Index
if Grid[row, col] && (Grid[row, col] = Grid[row-1, col])
Grid[row, col] *=2 , Grid[row-1, col] := 0, move := true
}
}
loop, 4
{
row := 5-A_Index
loop, 4
{
col := A_Index
loop, 4
if !Grid[row, col]
loop, 3
if !Grid[row, col] && Grid[row-A_Index, col]
{
Grid[row, col] := Grid[row-A_Index, col] , Grid[row-A_Index, col] := 0, move := true
if (Grid[row, col] = Grid[row+1, col])
Grid[row+1, col] *=2 , Grid[row, col] := 0, move := true
}
}
}
gosub, AddNew
return
;------------------------------
Left::
move := false
loop, 4
{
row := A_Index
Loop, 3
{
col := A_Index
if Grid[row, col] && (Grid[row, col] = Grid[row, col+1])
Grid[row, col] *=2 , Grid[row, col+1] := 0, move := true
}
}
loop, 4
{
col := A_Index
loop, 4
{
row := A_Index
loop, 4
if !Grid[row, col]
loop, 3
if !Grid[row, col] && Grid[row, col+A_Index]
{
Grid[row, col] := Grid[row, col+A_Index] , Grid[row, col+A_Index] := 0, move := true
if (Grid[row, col] = Grid[row, col-1])
Grid[row, col-1] *=2 , Grid[row, col] := 0, move := true
}
}
}
gosub, AddNew
return
;------------------------------
Right::
move := false
loop, 4
{
row := A_Index
Loop, 3
{
col := 5-A_Index
if Grid[row, col] && (Grid[row, col] = Grid[row, col-1])
Grid[row, col] *=2 , Grid[row, col-1] := 0, move := true
}
}
loop, 4
{
col := 5-A_Index
loop, 4
{
row := A_Index
loop, 4
if !Grid[row, col]
loop, 3
if !Grid[row, col] && Grid[row, col-A_Index]
{
Grid[row, col] := Grid[row, col-A_Index] , Grid[row, col-A_Index] := 0, move := true
if (Grid[row, col] = Grid[row, col+1])
Grid[row, col+1] *=2 , Grid[row, col] := 0, move := true
}
}
}
gosub, AddNew
return
;------------------------------
#IfWinActive
;------------------------------
AddNew:
if EndOfGame()
{
MsgBox Done `nPress OK to retry
goto start
}
return
;------------------------------
EndOfGame(){
global
if Move
AddRandom()
ShowGrid()
for row, obj in Grid
for col, val in obj
if !grid[row,col]
return 0
for row, obj in Grid
for col, val in obj
if (grid[row,col] = grid[row+1,col]) || (grid[row,col] = grid[row-1,col]) || (grid[row,col] = grid[row,col+1]) || (grid[row,col] = grid[row,col-1])
return 0
return 1
}
;------------------------------
ShowGrid(){
global Grid
for row, obj in Grid
for col, val in obj
{
GuiControl,, %row%_%col%, %val%
if val
GuiControl, Show, %row%_%col%
else
GuiControl, Hide, %row%_%col%
}
}
;------------------------------
AddRandom(){
global Grid
ShowGrid()
Sleep, 200
for row, obj in Grid
for col, val in obj
if !grid[row,col]
list .= (list?"`n":"") row "," col
Sort, list, random
Rnd := StrSplit(list, "`n").1
Grid[StrSplit(rnd, ",").1, StrSplit(rnd, ",").2] := 2
}
;------------------------------
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。
不会做,先玩起来了哈哈~!!
怎样才能得到积分
66666