#AutoIt3Wrapper_OutFile=2048.exe #AutoIt3Wrapper_Icon=2048.ico #AutoIt3Wrapper_Res_LegalCopyright=Copyright (c) afan 2015 #AutoIt3Wrapper_UseUpx=y #AutoIt3Wrapper_Res_Fileversion=1.0 #AutoIt3Wrapper_Res_ProductVersion=1.0 #AutoIt3Wrapper_Res_Language=2052 #AutoIt3Wrapper_Res_Field=作者|Afan #AutoIt3Wrapper_Res_Comment=2048小游戏 #AutoIt3Wrapper_Res_Description=2048小游戏 Local $hGui = GUICreate('2048 By Afan', 352, 530) GUISetBkColor(0xFFFFFF) GUISetFont(20, 800, 0, '微软雅黑') GUICtrlCreateLabel('', 0, 40, 382, 445) GUICtrlSetBkColor(-1, 0xCBCED5) GUICtrlSetState(-1, 128) GUICtrlCreateLabel('得分:', 10, 15, 40, 18) GUICtrlSetFont(-1, 10, 0, 0, '微软雅黑') Local $nzVal = 0 Local $iInfo = GUICtrlCreateLabel($nzVal, 50, 5, 100, 30) GUICtrlSetColor(-1, 0x88AAbb) GUICtrlCreateLabel('下张:', 260, 15, 40, 18) GUICtrlSetFont(-1, 10, 0, 0, '微软雅黑') Local $nNext = 0 Local $iNext = GUICtrlCreateLabel($nNext, 300, 15, 100, 20) GUICtrlSetFont(-1, 12, 800, 0, '微软雅黑') GUICtrlSetColor(-1, 0x8B8E95) GUICtrlCreateLabel('通过键盘↑↓←→移动牌格,相同的数值将合并', 50, 500, 400, 18) GUICtrlSetFont(-1, 10, 0, 0, '微软雅黑') GUICtrlSetColor(-1, 0x8B8E95) Global $aPos[17][5] ;---- 总数组 Local $iNumber = 4 Local $iButtonW = 66, $iButtonW_Jx = 16, $iButtonH = 88, $iButtonH_Jx = 20 Local $iLeft = 20, $iTop = 55 Local $iSpacingX = $iButtonW + $iButtonW_Jx, $iSpacingY = $iButtonH + $iButtonH_Jx Local $i, $IsOver For $i = 0 To 15 GUICtrlCreateLabel('', $iSpacingX * Mod($i, $iNumber) + $iLeft - 5, $iSpacingY * Floor($i / $iNumber) + $iTop - 5, $iButtonW + 10, $iButtonH + 10, 0x201) GUICtrlSetBkColor(-1, 0xDBDEE5) GUICtrlSetState(-1, 128) $aPos[$i + 1][1] = $iSpacingX * Mod($i, $iNumber) + $iLeft $aPos[$i + 1][2] = $iSpacingY * Floor($i / $iNumber) + $iTop $aPos[$i + 1][4] = 0 $aPos[$i + 1][0] = GUICtrlCreateLabel($aPos[$i + 1][3], $aPos[$i + 1][1], $aPos[$i + 1][2], $iButtonW, $iButtonH, 0x201) GUICtrlSetColor(-1, 0x88AA88) GUICtrlSetState(-1, 32) Next GUISetState() Local $aNumCz[10] = [2, 2, 4, 2, 2, 2, 2, 2, 4, 2] $nNext = $aNumCz[Random(0, 9, 1)] _ShowOne() Local $iBtn_U = GUICtrlCreateDummy(), $iBtn_D = GUICtrlCreateDummy(), $iBtn_L = GUICtrlCreateDummy(), $iBtn_R = GUICtrlCreateDummy() Local $aHK[4][2] = [['{UP}', $iBtn_U],['{DOWN}', $iBtn_D],['{LEFT}', $iBtn_L],['{RIGHT}', $iBtn_R]] GUISetAccelerators($aHK) Local $a2DPl0[4][4] = [[1, 5, 9, 13],[2, 6, 10, 14],[3, 7, 11, 15],[4, 8, 12, 16]] Local $a2DPl1[4][4] = [[13, 9, 5, 1],[14, 10, 6, 2],[15, 11, 7, 3],[16, 12, 8, 4]] Local $a2DPl2[4][4] = [[1, 2, 3, 4],[5, 6, 7, 8],[9, 10, 11, 12],[13, 14, 15, 16]] Local $a2DPl3[4][4] = [[4, 3, 2, 1],[8, 7, 6, 5],[12, 11, 10, 9],[16, 15, 14, 13]] Local $a3DPl[4] = [$a2DPl0, $a2DPl1, $a2DPl2, $a2DPl3] While 1 $msg = GUIGetMsg() Switch $msg Case -3 Exit Case $iBtn_U To $iBtn_R If Not $IsOver Then _JsMain($msg - $iBtn_U) Else MsgBox(48, 'Game over!', '你已经玩完了 ~~~~ ', 0, $hGui) EndIf EndSwitch WEnd Func _FindnNext() Local $x, $iZs = 0 While 1 $x = Random(1, 16, 1) If Not $aPos[$x][4] Then $nNext = $aNumCz[Random(0, 9, 1)] GUICtrlSetData($iNext, $nNext) ExitLoop Else $iZs += 1 If $iZs > 16 Then Return SetError(1) EndIf WEnd EndFunc ;==>_FindnNext Func _ShowOne() Local $i, $xx = 0, $x, $iZs = 0 For $i = 1 To 16 If Not $aPos[$i][4] Then $xx = 1 Exitloop Else $iZs += 1 If $iZs > 16 Then Return SetError(1) EndIf Next If Not $xx Then Return While 1 $x = Random(1, 16, 1) If Not $aPos[$x][4] Then GUICtrlSetData($aPos[$x][0], $nNext) GUICtrlSetState($aPos[$x][0], 16) $aPos[$x][4] = 1 ExitLoop EndIf WEnd _FindnNext() If @Error Then Return SetError(2) EndFunc ;==>_ShowOne Func _JsMain($Direction) Switch $Direction Case 0 Dim $x = $a3DPl[0] Case 1 Dim $x = $a3DPl[1] Case 2 Dim $x = $a3DPl[2] Case 3 Dim $x = $a3DPl[3] EndSwitch Local $i, $iMoveFlag = 0 For $i = 0 To 3 Local $aMove = 0, $j = 0, $add = 1 While $j < 4 If Not $aPos[$x[$i][$j]][4] Then If Not IsArray($aMove) Then Dim $aMove[3] = [$x[$i][$j], $aPos[$x[$i][$j]][1], $aPos[$x[$i][$j]][2]] $add = 1 Else $add += 1 EndIf Else If IsArray($aMove) Then GUICtrlSetState($aPos[$x[$i][$j]][0], 32) $aPos[$x[$i][$j]][4] = 0 GUICtrlSetPos($aPos[$aMove[0]][0], $aPos[$x[$i][$j]][1], $aPos[$x[$i][$j]][2]) GUICtrlSetData($aPos[$aMove[0]][0], GUICtrlRead($aPos[$x[$i][$j]][0])) GUICtrlSetState($aPos[$aMove[0]][0], 16) GUICtrlSetPos($aPos[$aMove[0]][0], $aMove[1], $aMove[2]) $aPos[$aMove[0]][4] = 1 $aMove = 0 $j -= $add $iMoveFlag = 1 EndIf EndIf $j += 1 WEnd Local $aMove = 0, $j = 0, $add = 1, $vNum = 0, $iLast While $j < 4 If Not $aPos[$x[$i][$j]][4] Then ExitLoop $vNum = GUICtrlRead($aPos[$x[$i][$j]][0]) If IsArray($aMove) And $aMove[3] = $vNum Then GUICtrlSetState($aPos[$x[$i][$j]][0], 32) $aPos[$x[$i][$j]][4] = 0 GUICtrlSetPos($aPos[$aMove[0]][0], $aPos[$x[$i][$j]][1], $aPos[$x[$i][$j]][2]) GUICtrlSetData($aPos[$aMove[0]][0], $vNum * 2) GUICtrlSetState($aPos[$aMove[0]][0], 16) GUICtrlSetPos($aPos[$aMove[0]][0], $aMove[1], $aMove[2]) $aPos[$aMove[0]][4] = 1 $nzVal += $vNum * 2 GUICtrlSetData($iInfo, $nzVal) $iMoveFlag = 1 $j0 = $j + 1 While $j0 < 4 If Not $aPos[$x[$i][$j0]][4] Then ExitLoop GUICtrlSetState($aPos[$x[$i][$j0]][0], 32) $aPos[$x[$i][$j0]][4] = 0 $iLast = $x[$i][$j0 - 1] GUICtrlSetData($aPos[$iLast][0], GUICtrlRead($aPos[$x[$i][$j0]][0])) GUICtrlSetState($aPos[$iLast][0], 16) $aPos[$iLast][4] = 1 $j0 += 1 WEnd $aMove[3] = 0 $j -= $add Else Dim $aMove[4] = [$x[$i][$j], $aPos[$x[$i][$j]][1], $aPos[$x[$i][$j]][2], $vNum] EndIf $j += 1 WEnd Next If $iMoveFlag = 1 Then Sleep(100) _ShowOne() If @Error And Not _CkMove() Then Msgbox(64, 'Game over', '玩完了~~ ' & @LF & '总分:' & $nzVal) EndIf EndFunc ;==>_JsMain Func _CkMove() For $i = 0 To 3 If __CkMoveZx($a3DPl[$i]) Then Return 1 Next $IsOver = 1 Return 0 EndFunc ;==>_CkMove Func __CkMoveZx($x) Local $iZs, $i, $j For $i = 0 To 3 Local $vNumLast = 0, $vNum For $j = 0 To 3 If Not $aPos[$x[$i][$j]][4] Then ContinueLoop $vNum = GUICtrlRead($aPos[$x[$i][$j]][0]) If $vNumLast = $vNum Then Return 1 Else $vNumLast = $vNum $iZs += 1 EndIf Next Next If $iZs < 16 Then Return 1 Return 0 EndFunc ;==>__CkMoveZx