#cs ----------------------------------------------------------------------------
AutoIt Version: 3.3.0.0
Author: Aping Ge
Script Function:
Template AutoIt script.
#ce ----------------------------------------------------------------------------
#include <GUIConstants.au3>
HotKeySet("{Esc}","GameExit")
HotKeySet("{left}","MoveLeft")
HotKeySet("{right}","MoveRight")
HotKeySet("{space}","SpeedUp")
HotKeySet("{Up}","Turn90")
HotKeySet("s","MoveLeft")
HotKeySet("f","MoveRight")
HotKeySet("d","SpeedUp")
HotKeySet("j","Turn90")
;HotKeySet("{space}","GamePause")
HotKeySet("^+z","DebugValue")
Global $paused
Dim $JPGfile = @TempDir&"/S2.jpg"
FileInstall("S1.jpg",$JPGfile)
Dim $Score = 0
Dim $R_Image
Dim $R_PreImage
Dim $SquareLength = 20
Dim $Board[23][12]
Dim $BoardPic[23][12]
Dim $PreImage[4][4]
Dim $PreImagePic[4]
Dim $ImageBak[4][4]
Dim $Image[4][4] ;-- 4 squares set
Dim $ImagePic[4] ;-- each square control ID
Dim $ImagePicPos[4][2] ;-- each square position X,Y
Dim $Image_X
Dim $Image_Y
Dim $KeyGet = False
Dim $KeyDown = False
Dim $AutoDown = False
Dim $DownDelay = False
;Dim $LeftDelay = False
;Dim $RightDelay = False
Dim $DropTime = 400
GUICreate("Square2.0 - gapkiller",370,420)
GUICtrlCreateGroup("Score",230,110,120,60)
GUICtrlSetFont(-1,15,700)
$ScoreRecord = GUICtrlCreateLabel($Score,250,135,80,27)
GUICtrlSetBkColor(-1,0x408080)
GUICtrlSetFont(-1,20,700)
GUICtrlCreateGroup ("",-99,-99,1,1)
CreateBoard()
InitBoard()
PreImageRandom()
GUISetState()
;-- initial ==========================================================================
Func CreateBoard()
GUICtrlCreateGraphic(10,10,200,400)
GUICtrlSetBkColor(-1,0xc8ff96)
GUICtrlSetGraphic(-1,$Gui_Gr_Pensize,2)
GUICtrlSetGraphic(-1,$GUI_GR_COLOR,0x666666)
GUICtrlSetGraphic(-1,$GUI_GR_MOVE,-2,-1)
GUICtrlSetGraphic(-1,$GUI_GR_LINE,201,-2)
GUICtrlSetGraphic(-1,$GUI_GR_MOVE,-1,0)
GUICtrlSetGraphic(-1,$GUI_GR_LINE,-1,401)
GUICtrlSetGraphic(-1,$GUI_GR_COLOR,0xFFFFFF)
GUICtrlSetGraphic(-1,$GUI_GR_LINE,201,401)
GUICtrlSetGraphic(-1,$GUI_GR_LINE,201,-1)
GUICtrlSetGraphic(-1,$Gui_Gr_Pensize,1)
GUICtrlCreateGraphic(220,10,90,90)
GUICtrlSetBkColor(-1,0xB96AFF)
GUICtrlSetGraphic(-1,$Gui_Gr_Pensize,2)
GUICtrlSetGraphic(-1,$GUI_GR_COLOR,0xFFFFFF)
GUICtrlSetGraphic(-1,$GUI_GR_MOVE,-3,-1)
GUICtrlSetGraphic(-1,$GUI_GR_LINE,90,-2)
GUICtrlSetGraphic(-1,$GUI_GR_MOVE,-2,0)
GUICtrlSetGraphic(-1,$GUI_GR_LINE,-2,90)
GUICtrlSetGraphic(-1,$GUI_GR_COLOR,0x666666)
GUICtrlSetGraphic(-1,$GUI_GR_LINE,90,90)
GUICtrlSetGraphic(-1,$GUI_GR_LINE,90,-1)
GUICtrlSetGraphic(-1,$Gui_Gr_Pensize,1)
EndFunc
Func InitBoard()
For $i=0 to 22 Step 1
$Board[$i][0] = 1
$Board[$i][11] = 1
Next
For $i=1 to 10 Step 1
$Board[22][$i] = 1
Next
For $i=0 to 21 Step 1
For $j=1 to 10 Step 1
$Board[$i][$j] = 0
$BoardPic[$i][$j] = 0
Next
Next
EndFunc
Func PreImageRandom()
For $i=0 to 3 step 1
For $j=0 to 3 step 1
$PreImage[$i][$j]=0
Next
Next
;create a image randomly by $R_Image
$R_PreImage = Random(1,7,1)
;$R_PreImage = 8
Switch $R_PreImage
Case 1
$PreImage[1][1]=1 ; [][]
$PreImage[1][2]=1 ; []
$PreImage[2][2]=1 ; []
$PreImage[3][2]=1 ;---------------
Case 2
$PreImage[1][1]=1 ; []
$PreImage[2][1]=1 ; [][]
$PreImage[2][2]=1 ; []
$PreImage[3][2]=1 ;---------------
Case 3
$PreImage[1][2]=1 ; []
$PreImage[2][1]=1 ; [][]
$PreImage[2][2]=1 ; []
$PreImage[3][2]=1 ;---------------
Case 4
$PreImage[1][2]=1 ; []
$PreImage[2][1]=1 ; [][]
$PreImage[2][2]=1 ; []
$PreImage[3][1]=1 ;---------------
Case 5
$PreImage[2][1]=1 ;
$PreImage[2][2]=1 ; [][]
$PreImage[3][1]=1 ; [][]
$PreImage[3][2]=1 ;---------------
Case 6
$PreImage[1][1]=1 ; [][]
$PreImage[1][2]=1 ; []
$PreImage[2][1]=1 ; []
$PreImage[3][1]=1 ;---------------
Case 7
$PreImage[0][1]=1 ; []
$PreImage[1][1]=1 ; []
$PreImage[2][1]=1 ; []
$PreImage[3][1]=1 ;---[]----------
Case 8
$PreImage[1][1]=1 ; [][]
;$PreImage[1][0]=1 ; []
$PreImage[2][2]=1 ; []
$PreImage[3][2]=1 ;-------------
Case 9
$PreImage[1][2]=1 ; [][]
;$PreImage[1][0]=1 ; []
$PreImage[2][1]=1 ; []
$PreImage[3][1]=1 ;-------------
EndSwitch
CreatePreImage()
EndFunc
Func CreatePreImage()
If $PreImagePic[0] Then
For $z = 0 To 3 Step 1
GUICtrlDelete($PreImagePic[$z])
Next
EndIf
$x = 0
For $i=0 to 3 step 1
For $j=0 to 3 step 1
If $PreImage[$i][$j]=1 Then
If $R_PreImage = 5 Then
$PreImagePic[$x] = GUICtrlCreatePic($JPGfile,225+$j*20,$i*20-5,$SquareLength,$SquareLength)
ElseIf $R_PreImage = 7 Then
$PreImagePic[$x] = GUICtrlCreatePic($JPGfile,235+$j*20,$i*20+15,$SquareLength,$SquareLength)
Else
$PreImagePic[$x] = GUICtrlCreatePic($JPGfile,225+$j*20,$i*20+5,$SquareLength,$SquareLength)
EndIf
$x += 1
EndIf
Next
Next
EndFunc
Func ImageRandom()
$R_Image = $R_PreImage
$Image_X = 70
If $R_Image = 5 Then
$Image_Y = -30
ElseIf $R_Image = 7 Then
$Image_Y = 10
Else
$Image_Y = -10
EndIf
$image = $PreImage
CreateImage()
EndFunc
Func CreateImage()
$k = 0
For $i=0 to 3 step 1
For $j=0 to 3 step 1
If $Image[$i][$j] = 1 Then
$ImagePicPos[$k][0] = $i
$ImagePicPos[$k][1] = $j
$ImagePic[$k] = GUICtrlCreatePic($JPGfile,$Image_X+$j*20,$Image_Y+$i*20,$SquareLength,$SquareLength)
$k += 1
EndIf
Next
Next
EndFunc
;-- main process **********************************************************************
While 1
ImageRandom()
PreImageRandom()
GameOverCheck()
$KeyGet = True
While 1
sleep($DropTime)
If Not GoDownOK() Then ExitLoop
If $KeyDown Then ContinueLoop
DropDown()
If $DownDelay Then SpeedUp()
$DownDelay = False
WEnd
$KeyGet = False
UpdateBoard()
WEnd
;-- main process **********************************************************************
Func DropDown()
$AutoDown = True
$Image_Y += 20
For $k = 0 to 3 Step 1
GUICtrlSetPos($ImagePic[$k],$Image_X+20*$ImagePicPos[$k][1],$Image_Y+20*$ImagePicPos[$k][0])
Next
$AutoDown = False
EndFunc
Func UpdateBoard()
$sum1 = 0
For $i=2 to 21 Step 1
For $j=1 to 10 Step 1
If $Board[$i][$j] = 1 Then $sum1 += 1
Next
Next
For $i=0 To 3 Step 1
For $j=0 To 3 Step 1
If $Image[$i][$j]=1 Then
$Board[($Image_Y+20*$i+30)/20][($Image_X+20*$j+10)/20]=1
For $k=0 To 3 Step 1
If $ImagePicPos[$k][0]=$i And $ImagePicPos[$k][1]=$j Then
$BoardPic[($Image_Y+20*$i+30)/20][($Image_X+20*$j+10)/20] = $ImagePic[$k]
EndIf
Next
EndIf
Next
Next
$sum2 = 0
For $i=2 to 21 Step 1
For $j=1 to 10 Step 1
If $Board[$i][$j] = 1 Then $sum2 += 1
Next
Next
If $sum2-$sum1<>4 Then MsgBox(64,"","sum1:"&$sum1&@LF&"sum2:"&$sum2)
$Deletelines = 0
;-- if some line values are all 1, delete this line
For $i=2 to 21 Step 1
$Sum = 0
For $j=1 to 10 Step 1
$Sum += $Board[$i][$j]
Next
;-- all squares above the line drop down
If $Sum = 10 Then
$Deletelines += 1
For $j=1 To 10 Step 1
For $k=$i To 3 Step -1
If $Board[$k-1][$j]=1 Then ContinueLoop
If NoSquareAbove($k,$j) Then
GUICtrlDelete($BoardPic[$k][$j])
$Board[$k][$j] = 0
$BoardPic[$k][$j] = 0
ExitLoop
Else
;MsgBox(0,$k,$j)
For $l=$k-1 To 3 Step -1
If $Board[$l][$j]=1 Then
GUICtrlSetPos($BoardPic[$k][$j],20*$j-10,20*($l+1)-30)
$Board[$l+1][$j] = $Board[$k][$j]
$BoardPic[$l+1][$j] = $BoardPic[$k][$j]
$BoardPic[$k][$j] = 0
$Board[$k][$j] = 0
$k = $l+1
ExitLoop
EndIf
Next
EndIf
Next
Next
;For $x=$i-1 To 2
; for $y=1 to 10
; If $Board[$x][$y]=1 Then GUICtrlSetPos($Board[$x][]
;For $m=$i-1 to 1 Step -1
; For $n=1 to 10 Step 1
; If $Board[$m][$n]=1 Then GUICtrlSetPos($BoardPic[$m][$n],20*$n-10,20*$m-10)
; $Board[$m+1][$n] = $Board[$m][$n]
; $BoardPic[$m+1][$n] = $BoardPic[$m][$n]
; Next
;Next
EndIf
Next
If $Deletelines Then
SoundPlay("C:/Users/lily/Desktop/autoit/mywav/delete.wav")
$Score += $Deletelines^2*10
GUICtrlSetData($ScoreRecord,$Score)
EndIf
EndFunc
Func NoSquareAbove($s,$t)
For $x=$s-1 To 0 Step -1
If $Board[$x][$t]=1 Then Return False
Next
Return True
EndFunc
Func GameOverCheck()
For $i=0 To 3 Step 1
For $j=0 To 3 Step 1
If $Image[$i][$j]=1 And $Board[($Image_Y+20*$i+30)/20][($Image_X+20*$j+10)/20]=1 Then
$Msg = MsgBox(4,"GameOver","You are so stupid"&@LF&"Retry?")
;MsgBox(0,"",$Msg)
If $Msg = 7 Then Exit
If $Msg = 6 Then
For $i = 2 To 21
For $j = 1 To 10
;MsgBox(0,$i&" "&$j,$BoardPic[$i][$j])
If $BoardPic[$i][$j] Then GUICtrlDelete($BoardPic[$i][$j])
Next
Next
InitBoard()
$Score = 0
GUICtrlSetData($ScoreRecord,$Score)
ExitLoop 2
EndIf
EndIf
Next
Next
EndFunc
Func GoLeftOK()
For $i=0 To 3 Step 1
For $j=0 To 3 Step 1
If $Image[$i][$j]=1 And $Board[($Image_Y+20*$i+30)/20][($Image_X+20*$j+10)/20-1]=1 Then Return False
Next
Next
Return True
EndFunc
Func GoRightOK()
For $i=0 To 3 Step 1
For $j=0 To 3 Step 1
If $Image[$i][$j]=1 And $Board[($Image_Y+20*$i+30)/20][($Image_X+20*$j+10)/20+1]=1 Then Return False
Next
Next
Return True
EndFunc
Func GoDownOK()
For $i=0 To 3 Step 1
For $j=0 To 3 Step 1
If $Image[$i][$j]=1 And $Board[($Image_Y+20*$i+30)/20+1][($Image_X+20*$j+10)/20]=1 Then Return False
Next
Next
Return True
EndFunc
Func ContinueOK()
For $i=0 To 3 Step 1
For $j=0 To 3 Step 1
If $ImageBak[$i][$j]=1 And $Board[($Image_Y+20*$i+30)/20][($Image_X+20*$j+10)/20]=1 Then Return False
Next
Next
Return True
EndFunc
;-- HotKey set ==========================================================================
Func MoveLeft()
If GoLeftOK() And $KeyGet=True Then
$Image_X -= 20
For $k = 0 to 3 Step 1
GUICtrlSetPos($ImagePic[$k],$Image_X+20*$ImagePicPos[$k][1],$Image_Y+20*$ImagePicPos[$k][0])
Next
EndIf
EndFunc
Func MoveRight()
If GoRightOK() And $KeyGet=True Then
$Image_X += 20
For $k = 0 to 3 Step 1
GUICtrlSetPos($ImagePic[$k],$Image_X+20*$ImagePicPos[$k][1],$Image_Y+20*$ImagePicPos[$k][0])
Next
EndIf
EndFunc
Func Turn90()
If $KeyGet = True Then
$ToRight = False
$ToBottom = False
$ImageBak = $image ;-- backup $image values
;-- turn 90 degree, swap $image values
If $R_Image <> 7 then
$swap1=$ImageBak[1][0]
$swap2=$ImageBak[2][0]
$ImageBak[1][0] = $ImageBak[3][0]
$ImageBak[3][0] = $ImageBak[3][2]
$ImageBak[3][2] = $ImageBak[1][2]
$ImageBak[1][2] = $swap1
$ImageBak[2][0] = $ImageBak[3][1]
$ImageBak[3][1] = $ImageBak[2][2]
$ImageBak[2][2] = $ImageBak[1][1]
$ImageBak[1][1] = $swap2
If $ImageBak[1][2]=0 And $ImageBak[2][2]=0 And $ImageBak[3][2]=0 Then
For $i = 1 To 3 Step 1
$ImageBak[$i][2] = $ImageBak[$i][1]
$ImageBak[$i][1] = $ImageBak[$i][0]
$ImageBak[$i][0] = 0
Next
$ToRight = True
EndIf
If $ImageBak[3][0]=0 And $ImageBak[3][1]=0 And $ImageBak[3][2]=0 Then
For $i = 0 To 2 Step 1
$ImageBak[3][$i] = $ImageBak[2][$i]
$ImageBak[2][$i] = $ImageBak[1][$i]
$ImageBak[1][$i] = 0
Next
$ToBottom = True
EndIf
If ContinueOK() Then
$ImageBak2 = $image
$image = $ImageBak
$k = 0
For $i = 1 To 3 Step 1
For $j = 0 To 2 Step 1
;MsgBox(0,$i&$j,$image[$i][$j]&@LF&$k)
If $ImageBak2[$i][$j]=1 Then
;MsgBox(0,"",$ImagePicPos[1][0]&$ImagePicPos[1][1])
Switch($i&$j)
Case "10"
$ImagePicPos[$k][0] = 1
$ImagePicPos[$k][1] = 2
GUICtrlSetPos($ImagePic[$k],$Image_X+20*$ImagePicPos[$k][1],$Image_Y+20*$ImagePicPos[$k][0])
Case "11"
$ImagePicPos[$k][0] = 2
$ImagePicPos[$k][1] = 2
GUICtrlSetPos($ImagePic[$k],$Image_X+20*$ImagePicPos[$k][1],$Image_Y+20*$ImagePicPos[$k][0])
Case "12"
$ImagePicPos[$k][0] = 3
$ImagePicPos[$k][1] = 2
GUICtrlSetPos($ImagePic[$k],$Image_X+20*$ImagePicPos[$k][1],$Image_Y+20*$ImagePicPos[$k][0])
Case "20"
$ImagePicPos[$k][0] = 1
$ImagePicPos[$k][1] = 1
GUICtrlSetPos($ImagePic[$k],$Image_X+20*$ImagePicPos[$k][1],$Image_Y+20*$ImagePicPos[$k][0])
Case "21"
$ImagePicPos[$k][0] = 2
$ImagePicPos[$k][1] = 1
GUICtrlSetPos($ImagePic[$k],$Image_X+20*$ImagePicPos[$k][1],$Image_Y+20*$ImagePicPos[$k][0])
Case "22"
$ImagePicPos[$k][0] = 3
$ImagePicPos[$k][1] = 1
GUICtrlSetPos($ImagePic[$k],$Image_X+20*$ImagePicPos[$k][1],$Image_Y+20*$ImagePicPos[$k][0])
Case "30"
$ImagePicPos[$k][0] = 1
$ImagePicPos[$k][1] = 0
GUICtrlSetPos($ImagePic[$k],$Image_X+20*$ImagePicPos[$k][1],$Image_Y+20*$ImagePicPos[$k][0])
Case "31"
$ImagePicPos[$k][0] = 2
$ImagePicPos[$k][1] = 0
GUICtrlSetPos($ImagePic[$k],$Image_X+20*$ImagePicPos[$k][1],$Image_Y+20*$ImagePicPos[$k][0])
Case "32"
;BoardValue()
$ImagePicPos[$k][0] = 3
$ImagePicPos[$k][1] = 0
GUICtrlSetPos($ImagePic[$k],$Image_X+20*$ImagePicPos[$k][1],$Image_Y+20*$ImagePicPos[$k][0])
EndSwitch
;-- after turn 90 degree, move towards left if Image left is null
If $ToRight Then
$ImagePicPos[$k][1] += 1
GUICtrlSetPos($ImagePic[$k],$Image_X+20*$ImagePicPos[$k][1],$Image_Y+20*$ImagePicPos[$k][0])
EndIf
;-- after turn 90 degree, move towards bottom if Image bottom is null
If $ToBottom Then
$ImagePicPos[$k][0] += 1
GUICtrlSetPos($ImagePic[$k],$Image_X+20*$ImagePicPos[$k][1],$Image_Y+20*$ImagePicPos[$k][0])
EndIf
$k += 1
EndIf
Next
Next
;$image = $ImageBak
EndIf
Else
For $i = 0 To 3
$swap = $ImageBak[2][$i]
$ImageBak[2][$i] = $ImageBak[3-$i][1]
$ImageBak[3-$i][1] = $swap
Next
If ContinueOK() Then
$ImageBak2 = $image
$image = $ImageBak
If $imagebak2[0][1]=1 Then
For $i=0 To 3 Step 1
$ImagePicPos[$i][0] = 2
$ImagePicPos[$i][1] = 3-$i
GUICtrlSetPos($ImagePic[$i],$Image_X+20*$ImagePicPos[$i][1],$Image_Y+20*$ImagePicPos[$i][0])
Next
ElseIf $imagebak2[2][0]=1 Then
For $i=0 To 3 Step 1
$ImagePicPos[$i][0] = $i
$ImagePicPos[$i][1] = 1
GUICtrlSetPos($ImagePic[$i],$Image_X+20*$ImagePicPos[$i][1],$Image_Y+20*$ImagePicPos[$i][0])
Next
EndIf
;$image = $ImageBak
EndIf
EndIf
EndIf
EndFunc
Func SpeedUp()
If Not $KeyDown Then
;$KeyGet = False
$KeyDown = True
If $AutoDown Then
$DownDelay = True
Else
While GoDownOK() And $KeyGet = True
$Image_Y += 20
For $i=0 To 3 Step 1
GUICtrlSetPos($ImagePic[$i],$Image_X+20*$ImagePicPos[$i][1],$Image_Y+20*$ImagePicPos[$i][0])
Next
WEnd
EndIf
$KeyDown = False
EndIf
EndFunc
Func GamePause()
$paused = Not $paused
while $paused
sleep(1000)
WEnd
EndFunc
Func GameExit()
FileDelete($JPGfile)
Exit 0
EndFunc
Func DebugValue()
$DebugValues=""
For $i = 0 To 3
For $j = 0 To 3
If $image[$i][$j]=1 Then $Board[($Image_Y+20*$i+30)/20][($Image_X+20*$j+10)/20]=1
Next
Next
For $i = 2 To 21
For $j = 1 To 10
$DebugValues &= " "&$Board[$i][$j]
Next
$DebugValues &= @LF
Next
MsgBox(0,"",$DebugValues)
For $i = 0 To 3
For $j = 0 To 3
If $image[$i][$j]=1 Then $Board[($Image_Y+20*$i+30)/20][($Image_X+20*$j+10)/20]=0
Next
Next
EndFunc