Tetris

  • Hallo,

    Ich habe bis jetzt folgendes Script:

    Spoiler anzeigen
    [autoit]

    #NoTrayIcon
    #include <GUIConstants.au3>

    [/autoit] [autoit][/autoit] [autoit]

    AutoItSetOption("MustDeclareVars", 1)

    [/autoit] [autoit][/autoit] [autoit]

    Global $pieces = 1

    [/autoit] [autoit][/autoit] [autoit]

    Global $points

    [/autoit] [autoit][/autoit] [autoit]

    Global Const $BOARD_WIDTH = 10
    Global Const $BOARD_HEIGHT = 20
    Global Const $EMPTY_COLOUR = -0xFfffff
    Global Const $TOWER_COLOUR = 0x40e0d0
    Global Const $BOX_COLOUR = 0xffff00
    Global Const $PYRAMID_COLOUR = 0xff00ff
    Global Const $LLEANER_COLOUR = 0xff0000
    Global Const $RLEANER_COLOUR = 0x00ff00
    Global Const $LKNIGHT_COLOUR = 0xffa500
    Global Const $RKNIGHT_COLOUR = 0x0000CD

    [/autoit] [autoit][/autoit] [autoit]

    Global $g_lblGameBoard[$BOARD_WIDTH][$BOARD_HEIGHT]
    Global $g_lblPreviewBoard[4][4]
    Global $g_lblPreviewBoard2[4][4]
    Global $g_lblPreviewBoard3[4][4]
    Global $g_aBoard[$BOARD_WIDTH][$BOARD_HEIGHT]
    Global $g_aGameShape[4][4], $g_aPreShape[4][4], $g_aPreShape2[4][4], $g_aPreShape3[4][4]
    Global $g_nShapeX, $g_nShapeY
    Global $g_nGameTick
    Global $g_lblScore
    Global $g_btnMoveLeft, $g_btnMoveRight
    Global $g_btnRotate, $g_btnDrop
    Global $g_btnStart
    Global $g_bGameStarted = False
    Global $msg
    Global $lbLost
    Global $lost = False

    [/autoit] [autoit][/autoit] [autoit]

    GUICreate("Häcker'sches Tetris", 490, 560)

    [/autoit] [autoit][/autoit] [autoit]

    _DrawGameBoard()
    _DrawPreviewBoard()

    [/autoit] [autoit][/autoit] [autoit]

    $g_lblScore = GUICtrlCreateLabel("SCORE: 0", 350, 450, 165, 20)
    GUICtrlSetFont(-1, 10, 800)
    GUICtrlSetColor(-1, 0x00FF00)
    GUISetBkColor(0x000000)

    [/autoit] [autoit][/autoit] [autoit]

    $g_btnStart = GUICtrlCreateButton("START)", 350, 400, 100, 35)
    GUICtrlSetState(-1, $GUI_FOCUS)

    [/autoit] [autoit][/autoit] [autoit]

    GUISetState(@SW_SHOW)

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func _NewGame()
    GUICtrlDelete($lbLost)
    $lost = False
    Local $i, $j

    [/autoit] [autoit][/autoit] [autoit]

    AdlibUnRegister()
    HotKeySet("{LSHIFT}","_HoldShape")
    HotKeySet("{LEFT}", "_MoveShapeLeft")
    HotKeySet("{RIGHT}", "_MoveShapeRight")
    HotKeySet("{UP}", "_RotateShape")
    HotKeySet("{DOWN}","_MoveShapeDown")
    HotKeySet("{SPACE}", "_DropShape")
    $g_bGameStarted = False
    For $i = 0 To $BOARD_WIDTH-1
    For $j = 0 To $BOARD_HEIGHT-1
    $g_aBoard[$i][$j] = $EMPTY_COLOUR
    GUICtrlSetBkColor($g_lblGameBoard[$i][$j], $GUI_BKCOLOR_TRANSPARENT)
    Next
    Next
    _NewShape()
    $g_bGameStarted = True
    _DrawGameShape()
    $g_nGameTick = 1500
    AdlibRegister("_MoveShapeDown", $g_nGameTick)
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func _IsPressed($hexKey)
    Local $hDll = DllOpen("user32.dll");
    Local $aR, $bRv
    $aR = DllCall($hDll, "int", "GetAsyncKeyState", "int", $hexKey)

    [/autoit] [autoit][/autoit] [autoit]

    If $aR[0] <> 0 Then
    $bRv = 1
    Else
    $bRv = 0
    EndIf
    Return $bRv
    EndFunc

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    While 1
    $msg = GuiGetMsg()
    Select
    Case $msg = $GUI_EVENT_CLOSE
    ExitLoop
    Case $msg = $g_btnStart
    GUICtrlSetState($g_btnStart, $GUI_DISABLE)
    _NewGame()
    EndSelect
    WEnd
    GUIDelete()

    [/autoit] [autoit][/autoit] [autoit]

    Func _HoldShape()
    SoundPlay("hold.mp3")
    EndFunc

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func _NewShape()
    Local $nShape, $i, $j

    [/autoit] [autoit][/autoit] [autoit]

    For $i = 0 To 3
    For $j = 0 To 3
    $g_aGameShape[$i][$j] = $EMPTY_COLOUR
    Next
    Next

    [/autoit] [autoit][/autoit] [autoit]

    $g_nShapeX = ($BOARD_WIDTH/2)-2
    $g_nShapeY = 0
    If Not $g_bGameStarted Then
    $nShape = Random(1, 7, 1)
    ; Block Arten
    ; 1 2 3 4 5 6 7
    ; X
    ; X XX X XX XX XX XX
    ; X XX XXX XX XX X X
    ; X X X
    Switch $nShape
    Case 1
    ; Turm (hellblau)
    $g_aGameShape[1][0] = $TOWER_COLOUR
    $g_aGameShape[1][1] = $TOWER_COLOUR
    $g_aGameShape[1][2] = $TOWER_COLOUR
    $g_aGameShape[1][3] = $TOWER_COLOUR
    $g_nShapeY = 0
    Case 2
    ; Kasten (gelb)
    $g_aGameShape[1][1] = $BOX_COLOUR
    $g_aGameShape[1][2] = $BOX_COLOUR
    $g_aGameShape[2][1] = $BOX_COLOUR
    $g_aGameShape[2][2] = $BOX_COLOUR
    case 3
    ; T (violett)
    $g_aGameShape[1][1] = $PYRAMID_COLOUR
    $g_aGameShape[0][2] = $PYRAMID_COLOUR
    $g_aGameShape[1][2] = $PYRAMID_COLOUR
    $g_aGameShape[2][2] = $PYRAMID_COLOUR
    case 4
    ; versetzt (rot)
    $g_aGameShape[0][1] = $LLEANER_COLOUR
    $g_aGameShape[1][1] = $LLEANER_COLOUR
    $g_aGameShape[1][2] = $LLEANER_COLOUR
    $g_aGameShape[2][2] = $LLEANER_COLOUR
    case 5
    ; versetzt (grün)
    $g_aGameShape[2][1] = $RLEANER_COLOUR
    $g_aGameShape[1][1] = $RLEANER_COLOUR
    $g_aGameShape[1][2] = $RLEANER_COLOUR
    $g_aGameShape[0][2] = $RLEANER_COLOUR
    case 6
    ; L (orange)
    $g_aGameShape[1][1] = $LKNIGHT_COLOUR
    $g_aGameShape[2][1] = $LKNIGHT_COLOUR
    $g_aGameShape[2][2] = $LKNIGHT_COLOUR
    $g_aGameShape[2][3] = $LKNIGHT_COLOUR
    case 7
    ; gespiegeltes L (dunkelblau)
    $g_aGameShape[2][1] = $RKNIGHT_COLOUR
    $g_aGameShape[1][1] = $RKNIGHT_COLOUR
    $g_aGameShape[1][2] = $RKNIGHT_COLOUR
    $g_aGameShape[1][3] = $RKNIGHT_COLOUR
    EndSwitch
    Else

    [/autoit] [autoit][/autoit] [autoit]

    For $i = 0 To 3
    For $j = 0 To 3
    $g_aGameShape[$i][$j] = $g_aPreShape[$i][$j]
    Next
    Next
    If $g_aGameShape[1][0] = $TOWER_COLOUR Then $g_nShapeY = 0
    EndIf
    For $i = 0 To 3
    For $j = 0 To 3
    $g_aPreShape[$i][$j] = $EMPTY_COLOUR
    Next
    Next

    [/autoit] [autoit][/autoit] [autoit]

    ; nächstes Teil anzeigen

    [/autoit] [autoit][/autoit] [autoit]

    $nShape = Random(1, 7, 1)
    Switch $nShape
    Case 1

    [/autoit] [autoit][/autoit] [autoit]

    $g_aPreShape[1][0] = $TOWER_COLOUR
    $g_aPreShape[1][1] = $TOWER_COLOUR
    $g_aPreShape[1][2] = $TOWER_COLOUR
    $g_aPreShape[1][3] = $TOWER_COLOUR
    Case 2

    [/autoit] [autoit][/autoit] [autoit]

    $g_aPreShape[1][1] = $BOX_COLOUR
    $g_aPreShape[1][2] = $BOX_COLOUR
    $g_aPreShape[2][1] = $BOX_COLOUR
    $g_aPreShape[2][2] = $BOX_COLOUR
    case 3

    [/autoit] [autoit][/autoit] [autoit]

    $g_aPreShape[1][1] = $PYRAMID_COLOUR
    $g_aPreShape[0][2] = $PYRAMID_COLOUR
    $g_aPreShape[1][2] = $PYRAMID_COLOUR
    $g_aPreShape[2][2] = $PYRAMID_COLOUR
    case 4

    [/autoit] [autoit][/autoit] [autoit]

    $g_aPreShape[0][1] = $LLEANER_COLOUR
    $g_aPreShape[1][1] = $LLEANER_COLOUR
    $g_aPreShape[1][2] = $LLEANER_COLOUR
    $g_aPreShape[2][2] = $LLEANER_COLOUR
    case 5

    [/autoit] [autoit][/autoit] [autoit]

    $g_aPreShape[2][1] = $RLEANER_COLOUR
    $g_aPreShape[1][1] = $RLEANER_COLOUR
    $g_aPreShape[1][2] = $RLEANER_COLOUR
    $g_aPreShape[0][2] = $RLEANER_COLOUR
    case 6

    [/autoit] [autoit][/autoit] [autoit]

    $g_aPreShape[1][1] = $LKNIGHT_COLOUR
    $g_aPreShape[2][1] = $LKNIGHT_COLOUR
    $g_aPreShape[2][2] = $LKNIGHT_COLOUR
    $g_aPreShape[2][3] = $LKNIGHT_COLOUR
    case 7

    [/autoit] [autoit][/autoit] [autoit]

    $g_aPreShape[2][1] = $RKNIGHT_COLOUR
    $g_aPreShape[1][1] = $RKNIGHT_COLOUR
    $g_aPreShape[1][2] = $RKNIGHT_COLOUR
    $g_aPreShape[1][3] = $RKNIGHT_COLOUR
    EndSwitch

    [/autoit] [autoit][/autoit] [autoit]

    For $i = 0 To 3
    For $j = 0 To 3
    If $g_aPreShape[$i][$j] = $EMPTY_COLOUR Then
    GUICtrlSetBkColor($g_lblPreviewBoard[$i][$j], $GUI_BKCOLOR_TRANSPARENT)
    Else

    [/autoit] [autoit][/autoit] [autoit]

    GUICtrlSetBkColor($g_lblPreviewBoard[$i][$j], $g_aPreShape[$i][$j])
    EndIf
    Next
    Next

    [/autoit] [autoit][/autoit] [autoit]

    ; übernächstes Teil anzeigen
    If $pieces >=2 Then
    For $i = 0 To 3
    For $j = 0 To 3
    $g_aPreShape2[$i][$j] = $EMPTY_COLOUR
    Next
    Next
    $nShape = Random(1, 7, 1)
    Switch $nShape
    Case 1

    [/autoit] [autoit][/autoit] [autoit]

    $g_aPreShape2[1][0] = $TOWER_COLOUR
    $g_aPreShape2[1][1] = $TOWER_COLOUR
    $g_aPreShape2[1][2] = $TOWER_COLOUR
    $g_aPreShape2[1][3] = $TOWER_COLOUR
    Case 2

    [/autoit] [autoit][/autoit] [autoit]

    $g_aPreShape2[1][1] = $BOX_COLOUR
    $g_aPreShape2[1][2] = $BOX_COLOUR
    $g_aPreShape2[2][1] = $BOX_COLOUR
    $g_aPreShape2[2][2] = $BOX_COLOUR
    case 3

    [/autoit] [autoit][/autoit] [autoit]

    $g_aPreShape2[1][1] = $PYRAMID_COLOUR
    $g_aPreShape2[0][2] = $PYRAMID_COLOUR
    $g_aPreShape2[1][2] = $PYRAMID_COLOUR
    $g_aPreShape2[2][2] = $PYRAMID_COLOUR
    case 4

    [/autoit] [autoit][/autoit] [autoit]

    $g_aPreShape2[0][1] = $LLEANER_COLOUR
    $g_aPreShape2[1][1] = $LLEANER_COLOUR
    $g_aPreShape2[1][2] = $LLEANER_COLOUR
    $g_aPreShape2[2][2] = $LLEANER_COLOUR
    case 5

    [/autoit] [autoit][/autoit] [autoit]

    $g_aPreShape2[2][1] = $RLEANER_COLOUR
    $g_aPreShape2[1][1] = $RLEANER_COLOUR
    $g_aPreShape2[1][2] = $RLEANER_COLOUR
    $g_aPreShape2[0][2] = $RLEANER_COLOUR
    case 6

    [/autoit] [autoit][/autoit] [autoit]

    $g_aPreShape2[1][1] = $LKNIGHT_COLOUR
    $g_aPreShape2[2][1] = $LKNIGHT_COLOUR
    $g_aPreShape2[2][2] = $LKNIGHT_COLOUR
    $g_aPreShape2[2][3] = $LKNIGHT_COLOUR
    case 7

    [/autoit] [autoit][/autoit] [autoit]

    $g_aPreShape2[2][1] = $RKNIGHT_COLOUR
    $g_aPreShape2[1][1] = $RKNIGHT_COLOUR
    $g_aPreShape2[1][2] = $RKNIGHT_COLOUR
    $g_aPreShape2[1][3] = $RKNIGHT_COLOUR
    EndSwitch
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    For $i = 0 To 3
    For $j = 0 To 3
    If $g_aPreShape2[$i][$j] = $EMPTY_COLOUR Then
    GUICtrlSetBkColor($g_lblPreviewBoard2[$i][$j], $GUI_BKCOLOR_TRANSPARENT)
    Else
    GUICtrlSetBkColor($g_lblPreviewBoard2[$i][$j], $g_aPreShape2[$i][$j])
    EndIf
    Next
    Next

    [/autoit] [autoit][/autoit] [autoit]

    ; über-übernächstes Teil anzeigen
    If $pieces >=3 Then
    For $i = 0 To 3
    For $j = 0 To 3
    $g_aPreShape3[$i][$j] = $EMPTY_COLOUR
    Next
    Next
    $nShape = Random(1, 7, 1)
    Switch $nShape
    Case 1

    [/autoit] [autoit][/autoit] [autoit]

    $g_aPreShape2[1][0] = $TOWER_COLOUR
    $g_aPreShape2[1][1] = $TOWER_COLOUR
    $g_aPreShape2[1][2] = $TOWER_COLOUR
    $g_aPreShape2[1][3] = $TOWER_COLOUR
    Case 2

    [/autoit] [autoit][/autoit] [autoit]

    $g_aPreShape2[1][1] = $BOX_COLOUR
    $g_aPreShape2[1][2] = $BOX_COLOUR
    $g_aPreShape2[2][1] = $BOX_COLOUR
    $g_aPreShape2[2][2] = $BOX_COLOUR
    case 3

    [/autoit] [autoit][/autoit] [autoit]

    $g_aPreShape2[1][1] = $PYRAMID_COLOUR
    $g_aPreShape2[0][2] = $PYRAMID_COLOUR
    $g_aPreShape2[1][2] = $PYRAMID_COLOUR
    $g_aPreShape2[2][2] = $PYRAMID_COLOUR
    case 4

    [/autoit] [autoit][/autoit] [autoit]

    $g_aPreShape2[0][1] = $LLEANER_COLOUR
    $g_aPreShape2[1][1] = $LLEANER_COLOUR
    $g_aPreShape2[1][2] = $LLEANER_COLOUR
    $g_aPreShape2[2][2] = $LLEANER_COLOUR
    case 5

    [/autoit] [autoit][/autoit] [autoit]

    $g_aPreShape2[2][1] = $RLEANER_COLOUR
    $g_aPreShape2[1][1] = $RLEANER_COLOUR
    $g_aPreShape2[1][2] = $RLEANER_COLOUR
    $g_aPreShape2[0][2] = $RLEANER_COLOUR
    case 6

    [/autoit] [autoit][/autoit] [autoit]

    $g_aPreShape2[1][1] = $LKNIGHT_COLOUR
    $g_aPreShape2[2][1] = $LKNIGHT_COLOUR
    $g_aPreShape2[2][2] = $LKNIGHT_COLOUR
    $g_aPreShape2[2][3] = $LKNIGHT_COLOUR
    case 7

    [/autoit] [autoit][/autoit] [autoit]

    $g_aPreShape2[2][1] = $RKNIGHT_COLOUR
    $g_aPreShape2[1][1] = $RKNIGHT_COLOUR
    $g_aPreShape2[1][2] = $RKNIGHT_COLOUR
    $g_aPreShape2[1][3] = $RKNIGHT_COLOUR
    EndSwitch
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    For $i = 0 To 3
    For $j = 0 To 3
    If $g_aPreShape3[$i][$j] == $EMPTY_COLOUR Then
    GUICtrlSetBkColor($g_lblPreviewBoard3[$i][$j], $GUI_BKCOLOR_TRANSPARENT)
    Else
    GUICtrlSetBkColor($g_lblPreviewBoard3[$i][$j], $g_aPreShape3[$i][$j])
    EndIf
    Next
    Next

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func _MoveShapeLeft()
    _MoveShape(-1, 0)
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func _MoveShapeRight()
    _MoveShape(1, 0)
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func _MoveShapeDown()
    _MoveShape(0, 1)
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func _DropShape()
    AdlibUnRegister()
    AdlibRegister("_MoveShapeDown", 1)
    SoundPlay("drop.mp3")
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func _MoveShape($nMoveX, $nMoveY)
    Local $nCollision, $i, $j
    Local $bFilled, $x, $y
    Local $sScoreText, $nScore

    [/autoit] [autoit][/autoit] [autoit]

    If _CollisionTest($nMoveX, $nMoveY) Then
    If $nMoveY = 1 Then
    If $g_nShapeY < 1 Then
    AdlibUnRegister()
    If $lost == False Then
    Global $lbLost = GUICtrlCreateLabel("Game over", 30, 180, 350, 78)
    GUICtrlSetBkColor(-1, $GUI_BKCOLOR_TRANSPARENT)
    GUICtrlSetFont(-1, 45, 400, 0, "@Arial Unicode MS")
    GUICtrlSetColor(-1, 0xFF0000)
    $lost = true
    EndIf
    GUICtrlSetState($g_btnStart, $GUI_ENABLE)
    HotKeySet("{LEFT}")
    HotKeySet("{RIGHT}")
    HotKeySet("{DOWN}")
    HotKeySet("{SPACE}")
    Return
    Else

    [/autoit] [autoit][/autoit] [autoit]

    For $i = 0 To 3
    For $j = 0 To 3
    If $g_aGameShape[$i][$j] <> $EMPTY_COLOUR Then
    $g_aBoard[$g_nShapeX+$i][$g_nShapeY+$j] = $g_aGameShape[$i][$j]
    EndIf
    Next
    Next

    [/autoit] [autoit][/autoit] [autoit]

    For $j = 0 To ($BOARD_HEIGHT-1)
    $bFilled = True
    For $i = 0 To ($BOARD_WIDTH-1)
    If $g_aBoard[$i][$j] = $EMPTY_COLOUR Then
    $bFilled = False
    ExitLoop
    EndIf
    Next
    If $bFilled Then
    SoundPlay("clear.mp3")
    $sScoreText = GUICtrlRead($g_lblScore)
    $points = 100
    $nScore = Number(StringRight($sScoreText, StringLen($sScoreText)-7))+$points

    [/autoit] [autoit][/autoit] [autoit]

    If Mod($nScore, 50) = 0 Then
    $g_nGameTick -= 10
    EndIf
    GUICtrlSetData($g_lblScore, "SCORE: " & $nScore)
    For $x = 0 To ($BOARD_WIDTH-1)
    For $y = $j To 1 Step -1
    $g_aBoard[$x][$y] = $g_aBoard[$x][$y-1]
    Next
    Next
    _RedrawGameBoard()
    EndIf
    Next
    AdlibUnRegister()
    _NewShape()
    _DrawGameShape()
    AdlibRegister("_MoveShapeDown", $g_nGameTick)
    EndIf
    EndIf
    Else
    _DrawGameShape(True)
    If $nMoveX <> 0 Then $g_nShapeX += $nMoveX
    If $nMoveY <> 0 Then $g_nShapeY += $nMoveY
    _DrawGameShape()
    EndIf
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func _RotateShape()
    Local $i, $j, $aTempShape[4][4]

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    For $i = 0 To 3
    For $j = 0 To 3
    $aTempShape[3-$j][$i] = $g_aGameShape[$i][$j]
    Next
    Next

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    For $i = 0 To 3
    For $j = 0 To 3
    If $aTempShape[$i][$j] <> $EMPTY_COLOUR Then
    If ($g_nShapeX+$i) < 0 Or ($g_nShapeX+$i) > ($BOARD_WIDTH- 1) Or _
    ($g_nShapeY+$j) < 0 Or ($g_nShapeY+$j) > ($BOARD_HEIGHT-1) Then
    Return
    EndIf
    EndIf
    Next
    Next

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    For $x = 0 To ($BOARD_WIDTH-1)
    For $y = 0 To ($BOARD_HEIGHT-1)
    If $x >= $g_nShapeX And $x < ($g_nShapeX+4) Then
    If $y >= $g_nShapeY And $y < ($g_nShapeY+4) Then
    If $g_aBoard[$x][$y] <> $EMPTY_COLOUR Then
    If $aTempShape[$x-$g_nShapeX][$y-$g_nShapeY] <> $EMPTY_COLOUR Then
    Return
    EndIf
    EndIf
    EndIf
    EndIf
    Next
    Next

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    _DrawGameShape(True)

    [/autoit] [autoit][/autoit] [autoit]

    For $i = 0 To 3
    For $j = 0 To 3
    $g_aGameShape[$i][$j] = $aTempShape[$i][$j]
    Next
    Next
    _DrawGameShape()
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func _CollisionTest($nMoveX, $nMoveY)
    Local $nNewX = $g_nShapeX+$nMoveX
    Local $nNewY = $g_nShapeY+$nMoveY
    Local $i, $j, $x, $y

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    For $i = 0 To 3
    For $j = 0 To 3
    If $g_aGameShape[$i][$j] <> $EMPTY_COLOUR Then
    If ($nNewX+$i) < 0 Or ($nNewX+$i) > ($BOARD_WIDTH-1) Or _
    ($nNewY+$j) < 0 Or ($nNewY+$j) > ($BOARD_HEIGHT-1) Then
    Return True
    EndIf
    EndIf
    Next
    Next

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    For $x = 0 To ($BOARD_WIDTH-1)
    For $y = 0 To ($BOARD_HEIGHT-1)
    If $x >= $nNewX And $x < ($nNewX+4) Then
    If $y >= $nNewY And $y < ($nNewY+4) Then
    If $g_aBoard[$x][$y] <> $EMPTY_COLOUR Then
    If $g_aGameShape[$x-$nNewX][$y-$nNewY] <> $EMPTY_COLOUR Then
    Return True
    EndIf
    EndIf
    EndIf
    EndIf
    Next
    Next
    Return False
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func _DrawGameShape($bRemove = False)
    Local $i, $j

    [/autoit] [autoit][/autoit] [autoit]

    For $i = 0 To 3
    For $j = 0 To 3
    If $g_aGameShape[$i][$j] <> $EMPTY_COLOUR Then
    If $bRemove Then
    GUICtrlSetBkColor($g_lblGameBoard[$g_nShapeX+$i][$g_nShapeY+$j], $GUI_BKCOLOR_TRANSPARENT)
    Else
    GUICtrlSetBkColor($g_lblGameBoard[$g_nShapeX+$i][$g_nShapeY+$j], $g_aGameShape[$i][$j])
    EndIf
    EndIf
    Next
    Next
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func _DrawGameBoard()
    Local $i, $j
    Local $x, $y

    [/autoit] [autoit][/autoit] [autoit]

    $x = 20
    $y = 20
    For $i = 0 To $BOARD_WIDTH-1
    For $j = 0 To $BOARD_HEIGHT-1
    GUICtrlCreateLabel("", $x, $y, 25, 25, $SS_BLACKFRAME)
    $g_lblGameBoard[$i][$j] = GUICtrlCreateLabel("", $x+1, $y+1, 23, 23)
    GUICtrlSetColor(-1, 0x00FF00)

    [/autoit] [autoit][/autoit] [autoit]

    GUICtrlSetBkColor(-1, $GUI_BKCOLOR_TRANSPARENT)
    $y = $y+26
    Next
    $x = $x+26
    $y = 20
    Next
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func _DrawPreviewBoard()
    Local $i, $j
    Local $x, $y

    [/autoit] [autoit][/autoit] [autoit]

    $x = 340
    $y = 40
    GUICtrlCreateLabel("Next Shape:", $x, 20, 104, 18)
    For $i = 0 To 3
    For $j = 0 To 3
    GUICtrlCreateLabel("", $x, $y, 25, 25)
    GUICtrlSetColor(-1, 0x00FF00)
    $g_lblPreviewBoard[$i][$j] = GUICtrlCreateLabel("", $x+1, $y+1, 23, 23)
    GUICtrlSetColor(-1, 0x00FF00)
    GUICtrlSetBkColor(-1, $GUI_BKCOLOR_TRANSPARENT)
    $g_lblPreviewBoard2[$i][$j] = GUICtrlCreateLabel("", $x+1, $y+120, 23, 23)
    GUICtrlSetColor(-1, 0x00FF00)
    GUICtrlSetBkColor(-1, $GUI_BKCOLOR_TRANSPARENT)
    $g_lblPreviewBoard3[$i][$j] = GUICtrlCreateLabel("", $x+1, $y+240, 23, 23)
    GUICtrlSetColor(-1, 0x00FF00)
    GUICtrlSetBkColor(-1, $GUI_BKCOLOR_TRANSPARENT)
    $y = $y+26
    Next
    $x = $x+26
    $y = 40
    Next
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func _RedrawGameBoard()
    Local $i, $j

    [/autoit] [autoit][/autoit] [autoit]

    For $i = 0 To $BOARD_WIDTH-1
    For $j = 0 To $BOARD_HEIGHT-1
    If $g_aBoard[$i][$j] = $EMPTY_COLOUR Then
    GUICtrlSetBkColor($g_lblGameBoard[$i][$j], $GUI_BKCOLOR_TRANSPARENT)
    Else
    GUICtrlSetBkColor($g_lblGameBoard[$i][$j], $g_aBoard[$i][$j])
    EndIf
    Next
    Next
    EndFunc

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit]

    Jetzt möchte ich die nächsten 3 Teile anzeigen lassen und das mit dem Shift einfügen, aber ich tue mich etwas schwer, das Problem anzugehen.
    Eigentlich war das Script ja nur für das nächste Teil gedacht, deshalb habe ich leider garkeine Ahnung, wie ich das jetzt für die nächsten beiden machen soll...
    Meine Ansätze habe ich schonmal, so weit es ging eingebaut.

    Anforderungsdefinition:
    In ein, soweit funktionierendes Tetris-Spiel sollen folgende Features implementiert werden:
    - die nächsten 3 Teile werden rechts vom Spielfeld angezeigt
    - per Hotkey (Shift) kann man ein Teil einlagern (für später aufheben) und wieder abrufen

    Hier ein Bild, mit 2 Teilen rechts, allerdings wird in Wirklichkeit nur das nächste korrekt angezeigt, das übernächste wurde zufällig generiert:
    [Blockierte Grafik: http://puu.sh/73GPw.png
    Das zweite soll eingebunden werden und ein drittes hinzugefügt.

    Ich würde mich über Antworten freuen

    LG
    Captain09

    9 Mal editiert, zuletzt von Captain09 (26. Februar 2014 um 17:03)

  • Du hast 600 Zeilen Code - unkommentiert - hochgeladen. Da musst du den Köpfen hier auch mal Zeit lassen.
    Wenn jemand Zeit & Lust hat wird er antworten ;)

    Es gibt sehr viele Leute, die glauben. Aber aus Aberglauben.
    - Blaise Pascal

  • Du hast 600 Zeilen Code - unkommentiert - hochgeladen. Da musst du den Köpfen hier auch mal Zeit lassen.
    Wenn jemand Zeit & Lust hat wird er antworten ;)


    Das Problem ist eher die dürftige Beschreibung was er denn nun eigentlich will. Nach zweimal lesen habe ichs jedenfalls immernoch nicht verstanden. Vermutlich wird es klarer wenn man den Code ausführt, aber nur anhand des Postings wundert es mich nicht, dass noch kein Feedback hier kam.

    Ich würde hier einen Screenshot empfehlen der zeigt was geändert oder eingebaut werden soll. Plus anständige Beschreibung was vorhanden ist, was genau nicht vorhanden ist und wie es genau sein soll. Nicht jeder hat Bock erstmal den Code auszuprobieren und durchzuwühlen nur um das Problem zu verstehen.

  • Sorry, bei so einem langen Code lese ich mich nicht großartig ein. ^^
    Ich gebe dir mal einen Ansatz bzw. Idee um dir selber die Features noch zu programmieren.

    Versuch deine Steine die rechts angezeigt werden in ein Array zu speichern.
    [0] = Anzeige Stein 1
    [1] = Anzeige Stein 2
    [2] = Anzeige Stein 3
    [3] = Gespeicherter Stein

    Nun brauchst du nur noch folgendes zu machen:

    Ist der Aktuelle Stein unten, dann holst du Element [0] heraus und verschiebst [1] nach [0] und [2] nach [1]. In [2] kannst du einen neuen Stein generieren.

    Wird die Shift Taste gedrückt, tauscht du einfach den Inhalt von [0] und [3] aus. Das setzt aber voraus, dass du einen zufälligen Stein vor Beginn in die Ablage generierst.


    Der Code dazu ist nicht alt zu schwierig. Ich weiß nicht wie du es in deinem Skript hast, aber so würde ich das Problem lösen.

  • Vielen Dank, das ist eine große Hilfe :)
    Jetzt muss ich das nurnoch umsetzten, aber mit etwas Zeit schaffe ich das hoffentlich :S

    LG
    Captain09

  • SCORE 490 xD

    Also hab das jetzt nur 3 mal gespielt und hat mit deinem Problem nix zu tun aber da sind zum teil schwebende imaginäre Blöcke. Die haben keine Wirkung die andern fallen einfach durch die hindurch und z.t. "putzen" die sie weg.

    Nach Game Over > Neustart bleibt manchmal der Game Over Balken/Schrift vor dem Spielfeld.

    und manchmal crasht es einfach spontan mit

    ==> Array variable has incorrect number of subscripts or subscript dimension range exceeded.:
    GUICtrlSetBkColor($g_lblGameBoard[$g_nShapeX+$i][$g_nShapeY+$j], $g_aGameShape[$i][$j])
    GUICtrlSetBkColor(^ ERROR

    autoit.de/wcf/attachment/24276/autoit.de/wcf/attachment/24277/autoit.de/wcf/attachment/24278/

  • ööööhm xD
    ich bin überfragt :D

  • Der Bug wo GAME OVER über dem Feld bleibt kann reproduziert werden wenn man einfach Pfeil nach unter drück und hält.
    Game Over wird dann scheinbar mehrmals übereinander gelegt und bei Neustart nur einmal entfernt. (Nur ne Theorie basierend auf der Beobachtung nicht dem Code ;) )

  • Nach kurzem überfliegen hab ich eine hässliche fast ohne Kommentare oder errorhandling versehene version gemacht. Die genau so schlecht zum lesen ist wie das Original :D aber die gewollten Funktionen enthällt

    Spoiler anzeigen
    [autoit]

    #NoTrayIcon
    #include <GUIConstants.au3>
    #include <Array.au3>

    [/autoit] [autoit][/autoit] [autoit]

    AutoItSetOption("MustDeclareVars", 1)

    [/autoit] [autoit][/autoit] [autoit]

    Global $pieces = 3

    [/autoit] [autoit][/autoit] [autoit]

    Global $points

    [/autoit] [autoit][/autoit] [autoit]

    Global Const $BOARD_WIDTH = 10
    Global Const $BOARD_HEIGHT = 20
    Global Const $EMPTY_COLOUR = -0xFfffff
    Global Const $TOWER_COLOUR = 0x40e0d0
    Global Const $BOX_COLOUR = 0xffff00
    Global Const $PYRAMID_COLOUR = 0xff00ff
    Global Const $LLEANER_COLOUR = 0xff0000
    Global Const $RLEANER_COLOUR = 0x00ff00
    Global Const $LKNIGHT_COLOUR = 0xffa500
    Global Const $RKNIGHT_COLOUR = 0x0000CD

    [/autoit] [autoit][/autoit] [autoit]

    Global $g_lblGameBoard[$BOARD_WIDTH][$BOARD_HEIGHT]
    Global $g_lblPreviewBoard[4][4]
    Global $g_lblPreviewBoard2[4][4]
    Global $g_lblPreviewBoard3[4][4]
    Global $g_aBoard[$BOARD_WIDTH][$BOARD_HEIGHT]
    Global $g_aGameShape[4][4], $g_aPreShape[4][4], $g_aPreShape2[4][4], $g_aPreShape3[4][4]
    Global $g_nShapeX, $g_nShapeY
    Global $g_nGameTick
    Global $g_lblScore
    Global $g_btnMoveLeft, $g_btnMoveRight
    Global $g_btnRotate, $g_btnDrop
    Global $g_btnStart
    Global $g_bGameStarted = False
    Global $msg
    Global $lbLost
    Global $lost = False
    Global $iShape_1 = -1, $iShape_2 = -1, $iShape_3 = -1, $hold = -1, $iShape_HOLD = -1; neue Variablen
    GUICreate("Häcker'sches Tetris", 490, 560)

    [/autoit] [autoit][/autoit] [autoit]

    _DrawGameBoard()
    _DrawPreviewBoard()

    [/autoit] [autoit][/autoit] [autoit]

    $g_lblScore = GUICtrlCreateLabel("SCORE: 0", 350, 450, 165, 20)
    GUICtrlSetFont(-1, 10, 800)
    GUICtrlSetColor(-1, 0x00FF00)
    GUISetBkColor(0x000000)

    [/autoit] [autoit][/autoit] [autoit]

    $g_btnStart = GUICtrlCreateButton("START)", 350, 400, 100, 35)
    GUICtrlSetState(-1, $GUI_FOCUS)

    [/autoit] [autoit][/autoit] [autoit]

    GUISetState(@SW_SHOW)

    [/autoit] [autoit][/autoit] [autoit]

    Func _NewGame()
    GUICtrlDelete($lbLost)
    $lost = False
    Local $i, $j

    [/autoit] [autoit][/autoit] [autoit]

    AdlibUnRegister()
    HotKeySet("{NUMPADADD}", "_HoldShape")
    HotKeySet("{LEFT}", "_MoveShapeLeft")
    HotKeySet("{RIGHT}", "_MoveShapeRight")
    HotKeySet("{UP}", "_RotateShape")
    HotKeySet("{DOWN}", "_MoveShapeDown")
    HotKeySet("{SPACE}", "_DropShape")
    $g_bGameStarted = False
    For $i = 0 To $BOARD_WIDTH - 1
    For $j = 0 To $BOARD_HEIGHT - 1
    $g_aBoard[$i][$j] = $EMPTY_COLOUR
    GUICtrlSetBkColor($g_lblGameBoard[$i][$j], $GUI_BKCOLOR_TRANSPARENT)
    Next
    Next
    _NewShape()
    $g_bGameStarted = True
    _DrawGameShape()
    $g_nGameTick = 1500
    AdlibRegister("_MoveShapeDown", $g_nGameTick)
    EndFunc ;==>_NewGame

    [/autoit] [autoit][/autoit] [autoit]

    Func _IsPressed($hexKey)
    Local $hDll = DllOpen("user32.dll");
    Local $aR, $bRv
    $aR = DllCall($hDll, "int", "GetAsyncKeyState", "int", $hexKey)

    [/autoit] [autoit][/autoit] [autoit]

    If $aR[0] <> 0 Then
    $bRv = 1
    Else
    $bRv = 0
    EndIf
    Return $bRv
    EndFunc ;==>_IsPressed

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    While 1
    $msg = GUIGetMsg()
    Select
    Case $msg = $GUI_EVENT_CLOSE
    ExitLoop
    Case $msg = $g_btnStart
    GUICtrlSetState($g_btnStart, $GUI_DISABLE)
    _NewGame()
    EndSelect
    WEnd
    GUIDelete()

    [/autoit] [autoit][/autoit] [autoit]

    Func _HoldShape();nur Block nummer gespeichert
    ; hold shape speichert das nächste nicht das aktuelle teil und setzt es bei erneutem shift hinten (pos 3) wider an
    If $hold = -1 Then
    $hold = $iShape_1
    For $i = 0 To 3
    For $j = 0 To 3
    $g_aPreShape[$i][$j] = $EMPTY_COLOUR;altes löschen
    $g_aPreShape2[$i][$j] = $EMPTY_COLOUR;altes löschen
    $g_aPreShape3[$i][$j] = $EMPTY_COLOUR;altes löschen
    Next
    Next
    $iShape_1 = _RandomShape($g_aPreShape, $g_lblPreviewBoard, $iShape_2)
    $iShape_2 = _RandomShape($g_aPreShape2, $g_lblPreviewBoard2, $iShape_3)
    $iShape_3 = _RandomShape($g_aPreShape3, $g_lblPreviewBoard3)
    Else
    $iShape_HOLD = $hold
    $hold = -1
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    EndFunc ;==>_HoldShape
    Func _NewShape()
    Local $i, $j

    [/autoit] [autoit][/autoit] [autoit]

    For $i = 0 To 3
    For $j = 0 To 3
    $g_aGameShape[$i][$j] = $EMPTY_COLOUR
    Next
    Next

    [/autoit] [autoit][/autoit] [autoit]

    $g_nShapeX = ($BOARD_WIDTH / 2) - 2
    $g_nShapeY = 0
    If Not $g_bGameStarted Then
    Local $__temp
    _RandomShape($g_aGameShape, $__temp, $iShape_1)
    Else
    For $i = 0 To 3
    For $j = 0 To 3
    $g_aGameShape[$i][$j] = $g_aPreShape[$i][$j]
    Next
    Next
    If $g_aGameShape[1][0] = $TOWER_COLOUR Then $g_nShapeY = 0
    EndIf

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    For $i = 0 To 3
    For $j = 0 To 3
    $g_aPreShape[$i][$j] = $EMPTY_COLOUR
    Next
    Next

    [/autoit] [autoit][/autoit] [autoit]

    ; nächstes Teil anzeigen
    $iShape_1 = _RandomShape($g_aPreShape, $g_lblPreviewBoard, $iShape_2)
    ; übernächstes Teil anzeigen
    If $pieces >= 2 Then
    For $i = 0 To 3
    For $j = 0 To 3
    $g_aPreShape2[$i][$j] = $EMPTY_COLOUR
    Next
    Next
    $iShape_2 = _RandomShape($g_aPreShape2, $g_lblPreviewBoard2, $iShape_3)
    EndIf
    ; über-übernächstes Teil anzeigen
    If $pieces >= 3 Then
    For $i = 0 To 3
    For $j = 0 To 3
    $g_aPreShape3[$i][$j] = $EMPTY_COLOUR
    Next
    Next
    If $iShape_HOLD = -1 Then
    $iShape_3 = _RandomShape($g_aPreShape3, $g_lblPreviewBoard3)
    Else
    $iShape_3 = _RandomShape($g_aPreShape3, $g_lblPreviewBoard3, $iShape_HOLD)
    $iShape_HOLD = -1
    EndIf
    EndIf
    EndFunc ;==>_NewShape
    Func _RandomShape(ByRef $aArray, ByRef $aPreview, $nShape = -1);erzeugt neue Blöcke und schreibt sie in das preview Board, 3. parameter um blöcke von platz 3 auf 2, 1...
    ; Block Arten
    ; 1 2 3 4 5 6 7
    ; X
    ; X XX X XX XX XX XX
    ; X XX XXX XX XX X X
    ; X X X
    If $nShape = -1 Then $nShape = Random(1, 7, 1)
    Switch $nShape
    Case 1
    $aArray[1][0] = $TOWER_COLOUR
    $aArray[1][1] = $TOWER_COLOUR
    $aArray[1][2] = $TOWER_COLOUR
    $aArray[1][3] = $TOWER_COLOUR
    Case 2
    $aArray[1][1] = $BOX_COLOUR
    $aArray[1][2] = $BOX_COLOUR
    $aArray[2][1] = $BOX_COLOUR
    $aArray[2][2] = $BOX_COLOUR
    Case 3
    $aArray[1][1] = $PYRAMID_COLOUR
    $aArray[0][2] = $PYRAMID_COLOUR
    $aArray[1][2] = $PYRAMID_COLOUR
    $aArray[2][2] = $PYRAMID_COLOUR
    Case 4
    $aArray[0][1] = $LLEANER_COLOUR
    $aArray[1][1] = $LLEANER_COLOUR
    $aArray[1][2] = $LLEANER_COLOUR
    $aArray[2][2] = $LLEANER_COLOUR
    Case 5
    $aArray[2][1] = $RLEANER_COLOUR
    $aArray[1][1] = $RLEANER_COLOUR
    $aArray[1][2] = $RLEANER_COLOUR
    $aArray[0][2] = $RLEANER_COLOUR
    Case 6
    $aArray[1][1] = $LKNIGHT_COLOUR
    $aArray[2][1] = $LKNIGHT_COLOUR
    $aArray[2][2] = $LKNIGHT_COLOUR
    $aArray[2][3] = $LKNIGHT_COLOUR
    Case 7
    $aArray[2][1] = $RKNIGHT_COLOUR
    $aArray[1][1] = $RKNIGHT_COLOUR
    $aArray[1][2] = $RKNIGHT_COLOUR
    $aArray[1][3] = $RKNIGHT_COLOUR
    EndSwitch

    [/autoit] [autoit][/autoit] [autoit]

    If IsArray($aPreview) Then
    For $i = 0 To 3
    For $j = 0 To 3
    If $aArray[$i][$j] == $EMPTY_COLOUR Then
    GUICtrlSetBkColor($aPreview[$i][$j], $GUI_BKCOLOR_TRANSPARENT)
    Else
    GUICtrlSetBkColor($aPreview[$i][$j], $aArray[$i][$j])
    EndIf
    Next
    Next
    EndIf
    Return $nShape
    EndFunc ;==>_RandomShape

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func _MoveShapeLeft()
    _MoveShape(-1, 0)
    EndFunc ;==>_MoveShapeLeft

    [/autoit] [autoit][/autoit] [autoit]

    Func _MoveShapeRight()
    _MoveShape(1, 0)
    EndFunc ;==>_MoveShapeRight

    [/autoit] [autoit][/autoit] [autoit]

    Func _MoveShapeDown()
    _MoveShape(0, 1)
    EndFunc ;==>_MoveShapeDown

    [/autoit] [autoit][/autoit] [autoit]

    Func _DropShape()
    AdlibUnRegister()
    AdlibRegister("_MoveShapeDown", 1)
    SoundPlay("drop.mp3")
    EndFunc ;==>_DropShape

    [/autoit] [autoit][/autoit] [autoit]

    Func _MoveShape($nMoveX, $nMoveY)
    Local $nCollision, $i, $j
    Local $bFilled, $x, $y
    Local $sScoreText, $nScore

    [/autoit] [autoit][/autoit] [autoit]

    If _CollisionTest($nMoveX, $nMoveY) Then
    If $nMoveY = 1 Then
    If $g_nShapeY < 1 Then
    AdlibUnRegister()
    If $lost == False Then
    Global $lbLost = GUICtrlCreateLabel("Game over", 30, 180, 350, 78)
    GUICtrlSetBkColor(-1, $GUI_BKCOLOR_TRANSPARENT)
    GUICtrlSetFont(-1, 45, 400, 0, "@Arial Unicode MS")
    GUICtrlSetColor(-1, 0xFF0000)
    $lost = True
    EndIf
    GUICtrlSetState($g_btnStart, $GUI_ENABLE)
    HotKeySet("{LEFT}")
    HotKeySet("{RIGHT}")
    HotKeySet("{DOWN}")
    HotKeySet("{SPACE}")
    Return
    Else

    [/autoit] [autoit][/autoit] [autoit]

    For $i = 0 To 3
    For $j = 0 To 3
    If $g_aGameShape[$i][$j] <> $EMPTY_COLOUR Then
    $g_aBoard[$g_nShapeX + $i][$g_nShapeY + $j] = $g_aGameShape[$i][$j]
    EndIf
    Next
    Next

    [/autoit] [autoit][/autoit] [autoit]

    For $j = 0 To ($BOARD_HEIGHT - 1)
    $bFilled = True
    For $i = 0 To ($BOARD_WIDTH - 1)
    If $g_aBoard[$i][$j] = $EMPTY_COLOUR Then
    $bFilled = False
    ExitLoop
    EndIf
    Next
    If $bFilled Then
    SoundPlay("clear.mp3")
    $sScoreText = GUICtrlRead($g_lblScore)
    $points = 100
    $nScore = Number(StringRight($sScoreText, StringLen($sScoreText) - 7)) + $points

    [/autoit] [autoit][/autoit] [autoit]

    If Mod($nScore, 50) = 0 Then
    $g_nGameTick -= 10
    EndIf
    GUICtrlSetData($g_lblScore, "SCORE: " & $nScore)
    For $x = 0 To ($BOARD_WIDTH - 1)
    For $y = $j To 1 Step -1
    $g_aBoard[$x][$y] = $g_aBoard[$x][$y - 1]
    Next
    Next
    _RedrawGameBoard()
    EndIf
    Next
    AdlibUnRegister()
    _NewShape()
    _DrawGameShape()
    AdlibRegister("_MoveShapeDown", $g_nGameTick)
    EndIf
    EndIf
    Else
    _DrawGameShape(True)
    If $nMoveX <> 0 Then $g_nShapeX += $nMoveX
    If $nMoveY <> 0 Then $g_nShapeY += $nMoveY
    _DrawGameShape()
    EndIf
    EndFunc ;==>_MoveShape

    [/autoit] [autoit][/autoit] [autoit]

    Func _RotateShape()
    Local $i, $j, $aTempShape[4][4]

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    For $i = 0 To 3
    For $j = 0 To 3
    $aTempShape[3 - $j][$i] = $g_aGameShape[$i][$j]
    Next
    Next

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    For $i = 0 To 3
    For $j = 0 To 3
    If $aTempShape[$i][$j] <> $EMPTY_COLOUR Then
    If ($g_nShapeX + $i) < 0 Or ($g_nShapeX + $i) > ($BOARD_WIDTH - 1) Or _
    ($g_nShapeY + $j) < 0 Or ($g_nShapeY + $j) > ($BOARD_HEIGHT - 1) Then
    Return
    EndIf
    EndIf
    Next
    Next

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    For $x = 0 To ($BOARD_WIDTH - 1)
    For $y = 0 To ($BOARD_HEIGHT - 1)
    If $x >= $g_nShapeX And $x < ($g_nShapeX + 4) Then
    If $y >= $g_nShapeY And $y < ($g_nShapeY + 4) Then
    If $g_aBoard[$x][$y] <> $EMPTY_COLOUR Then
    If $aTempShape[$x - $g_nShapeX][$y - $g_nShapeY] <> $EMPTY_COLOUR Then
    Return
    EndIf
    EndIf
    EndIf
    EndIf
    Next
    Next
    _DrawGameShape(True)
    For $i = 0 To 3
    For $j = 0 To 3
    $g_aGameShape[$i][$j] = $aTempShape[$i][$j]
    Next
    Next
    _DrawGameShape()
    EndFunc ;==>_RotateShape

    [/autoit] [autoit][/autoit] [autoit]

    Func _CollisionTest($nMoveX, $nMoveY)
    Local $nNewX = $g_nShapeX + $nMoveX
    Local $nNewY = $g_nShapeY + $nMoveY
    Local $i, $j, $x, $y
    For $i = 0 To 3
    For $j = 0 To 3
    If $g_aGameShape[$i][$j] <> $EMPTY_COLOUR Then
    If ($nNewX + $i) < 0 Or ($nNewX + $i) > ($BOARD_WIDTH - 1) Or _
    ($nNewY + $j) < 0 Or ($nNewY + $j) > ($BOARD_HEIGHT - 1) Then
    Return True
    EndIf
    EndIf
    Next
    Next
    For $x = 0 To ($BOARD_WIDTH - 1)
    For $y = 0 To ($BOARD_HEIGHT - 1)
    If $x >= $nNewX And $x < ($nNewX + 4) Then
    If $y >= $nNewY And $y < ($nNewY + 4) Then
    If $g_aBoard[$x][$y] <> $EMPTY_COLOUR Then
    If $g_aGameShape[$x - $nNewX][$y - $nNewY] <> $EMPTY_COLOUR Then
    Return True
    EndIf
    EndIf
    EndIf
    EndIf
    Next
    Next
    Return False
    EndFunc ;==>_CollisionTest

    [/autoit] [autoit][/autoit] [autoit]

    Func _DrawGameShape($bRemove = False)
    Local $i, $j

    [/autoit] [autoit][/autoit] [autoit]

    For $i = 0 To 3
    For $j = 0 To 3
    If $g_aGameShape[$i][$j] <> $EMPTY_COLOUR Then
    If $bRemove Then
    GUICtrlSetBkColor($g_lblGameBoard[$g_nShapeX + $i][$g_nShapeY + $j], $GUI_BKCOLOR_TRANSPARENT)
    Else
    GUICtrlSetBkColor($g_lblGameBoard[$g_nShapeX + $i][$g_nShapeY + $j], $g_aGameShape[$i][$j])
    EndIf
    EndIf
    Next
    Next
    EndFunc ;==>_DrawGameShape

    [/autoit] [autoit][/autoit] [autoit]

    Func _DrawGameBoard()
    Local $i, $j
    Local $x, $y

    [/autoit] [autoit][/autoit] [autoit]

    $x = 20
    $y = 20
    For $i = 0 To $BOARD_WIDTH - 1
    For $j = 0 To $BOARD_HEIGHT - 1
    GUICtrlCreateLabel("", $x, $y, 25, 25, $SS_BLACKFRAME)
    $g_lblGameBoard[$i][$j] = GUICtrlCreateLabel("", $x + 1, $y + 1, 23, 23)
    GUICtrlSetColor(-1, 0x00FF00)

    [/autoit] [autoit][/autoit] [autoit]

    GUICtrlSetBkColor(-1, $GUI_BKCOLOR_TRANSPARENT)
    $y = $y + 26
    Next
    $x = $x + 26
    $y = 20
    Next
    EndFunc ;==>_DrawGameBoard

    [/autoit] [autoit][/autoit] [autoit]

    Func _DrawPreviewBoard()
    Local $i, $j
    Local $x, $y
    $x = 340
    $y = 40
    GUICtrlCreateLabel("Next Shape:", $x, 20, 104, 18)
    For $i = 0 To 3
    For $j = 0 To 3
    GUICtrlCreateLabel("", $x, $y, 25, 25)
    GUICtrlSetColor(-1, 0x00FF00)
    $g_lblPreviewBoard[$i][$j] = GUICtrlCreateLabel("", $x, $y, 23, 23)
    GUICtrlSetColor(-1, 0x00FF00)
    GUICtrlSetBkColor(-1, $GUI_BKCOLOR_TRANSPARENT)
    $g_lblPreviewBoard2[$i][$j] = GUICtrlCreateLabel("", $x, $y + 120, 23, 23)
    GUICtrlSetColor(-1, 0x00FF00)
    GUICtrlSetBkColor(-1, $GUI_BKCOLOR_TRANSPARENT)
    $g_lblPreviewBoard3[$i][$j] = GUICtrlCreateLabel("", $x, $y + 240, 23, 23)
    GUICtrlSetColor(-1, 0x00FF00)
    GUICtrlSetBkColor(-1, $GUI_BKCOLOR_TRANSPARENT)
    $y = $y + 26
    Next
    $x = $x + 26
    $y = 40
    Next
    EndFunc ;==>_DrawPreviewBoard

    [/autoit] [autoit][/autoit] [autoit]

    Func _RedrawGameBoard()
    Local $i, $j

    [/autoit] [autoit][/autoit] [autoit]

    For $i = 0 To $BOARD_WIDTH - 1
    For $j = 0 To $BOARD_HEIGHT - 1
    If $g_aBoard[$i][$j] = $EMPTY_COLOUR Then
    GUICtrlSetBkColor($g_lblGameBoard[$i][$j], $GUI_BKCOLOR_TRANSPARENT)
    Else
    GUICtrlSetBkColor($g_lblGameBoard[$i][$j], $g_aBoard[$i][$j])
    EndIf
    Next
    Next
    EndFunc ;==>_RedrawGameBoard

    [/autoit]


    Ich würde dir raten das du dein code immer mit kommentaren versiehst, jetzt ist es eventuell noch verständlich ...und jetzt schon nicht mehr :D


    €:
    1. Der Fehler für die Anzeige der 3 nächsten blocks wahr das du sie immer neu zufällig erzeugt hast und sie nicht durchlaufen lassen hast ( immer nur der letzte Block wird neu generiert die anderen erhalten den Block der vorhergehenden position)
    2. Einen Block zurückhalten hab ich einmal so primitiv wie möglich eingefügt hoffentlich spricht der Code für sich ohne kommentare :D (der Hotkey wurde auf Numpad+ geändert)

    Einmal editiert, zuletzt von bollen (26. Februar 2014 um 20:44)