[第九关]搞一个2048小游戏

任务

实现一个 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
}
;------------------------------

给TA捐赠
共{{data.count}}人
人已捐赠
其他近期更新

电子文件管理方案

2022-2-12 15:36:28

AHKV1其他社区推荐近期更新

[第1000关] ZigZag遍历二维数组

2022-2-15 22:16:01

3 条回复 A文章作者 M管理员
  1. user15352

    66666

  2. user14935

    怎样才能得到积分

  3. 月下马

    不会做,先玩起来了哈哈~!!

个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索