一段很有意思的代码

 

Idears for life!

 

#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

Idears for life!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值