Что нового

[Script] Игра Пятнашки

dwerf

Использует ArchLinux
Сообщения
478
Репутация
219
AutoIt: 3.3.2.0+
Версия: 0.5

Категория: Игры (головоломка)
Описание: Оболочка для игры Пятнашки.

Код:
Код:
#include <Misc.au3>

Func CreateForm()
    Global $Ini = @ScriptDir & '\15Save.ini'

    Local $iWidth = 400
    Local $iHeight = 400

    Local $iFontSize = 20
    Local $sFont = 'Lucida Console'
    Local $iLblWidthMod = 1.5
    Local $iLblHeightMod = 1.1

    Local $iVerWidth = 2
    Local $iHorWidth = 2

    Local $bColorText = 0x00FF00
    Global $bColorTextBg = 0x003F00
    Global $bColorTextErrorBg = 0xFF3F00
    Global $bColorMainBg = 0x000000
    Local $bColorSeparator = 0x004400
    Global $bColorVoidHighlighting = 0x00FF00



    Local $iSquWidth = $iWidth/4
    While StringInStr($iSquWidth, '.')
        $iWidth += 1
        $iSquWidth = $iWidth/4
    WEnd

    Local $iSquHeight = $iHeight/4
    While StringInStr($iSquHeight, '.')
        $iHeight += 1
        $iSquHeight = $iHeight/4
    WEnd

    Local $iWidthT = $iWidth+$iVerWidth*5
    Local $iHeightT = $iHeight+$iHorWidth*5
    Local $iSumSquWidthVerWidth = $iSquWidth+$iVerWidth
    Local $iSumSquHeightHorWidth = $iSquHeight+$iHorWidth
    Local $iHorOffSet = $iVerWidth+($iSquWidth-$iFontSize*$iLblWidthMod)/2
    Local $iVerOffSet = $iHorWidth+($iSquHeight-$iFontSize*$iLblHeightMod)/2
    Local $iLblWidth = $iFontSize*$iLblWidthMod
    Local $iLblHeight = $iFontSize*$iLblHeightMod

    Global $Form1 = GUICreate('Пятнашки', $iWidthT, $iHeightT)

    GUISetBkColor($bColorMainBg)
    GUISetFont($iFontSize, Default, Default, $sFont)

    Global $aLabel[16], $aHorSeparator[5], $aVerSeparator[5]
    Local $iSumYna4i1, $iSumYnaSumSquHeightHorWidthiVerOffSet

    Global $iVoid = IniRead($Ini, '15', 'Void', -1)

    For $iY = 0 To 3 Step +1
        $aHorSeparator[$iY] = $iY*$iSumSquHeightHorWidth
        GUICtrlCreateLabel('', 0, $aHorSeparator[$iY], $iWidthT, $iHorWidth)
        GUICtrlSetBkColor(-1, $bColorSeparator)
        $iYna4 = $iY*4
        $iSumYna4i1 = $iYna4+1
        $iSumYnaSumSquHeightHorWidthiVerOffSet = $iY*$iSumSquHeightHorWidth+$iVerOffSet
        For $iX = 0 To 3 Step +1
            If $iVoid = -1 Then
                $iLblText = $iX+$iSumYna4i1
            Else
                $iLblText = IniRead($Ini, '15', $iX+$iYna4, -1)
                If $iLblText = -1 Then
					MsgBox(16, 'Error', 'Ini is corrupted:' & @CRLF & $Ini)
					Exit
				EndIf
            EndIf
            $aLabel[$iX+$iYna4] = GUICtrlCreateLabel($iLblText, $iX*$iSumSquWidthVerWidth+$iHorOffSet, $iSumYnaSumSquHeightHorWidthiVerOffSet, $iLblWidth, $iLblHeight, 1)
            GUICtrlSetColor(-1, $bColorText)
            GUICtrlSetBkColor(-1, $bColorTextBg)
        Next
    Next
    $aHorSeparator[4] = 4*$iSumSquHeightHorWidth
    GUICtrlCreateLabel('', 0, $aHorSeparator[4], $iWidthT, $iHorWidth)
    GUICtrlSetBkColor(-1, $bColorSeparator)

    For $iX = 0 To 4 Step +1
        $aVerSeparator[$iX] = $iX*$iSumSquWidthVerWidth
        GUICtrlCreateLabel('', $aVerSeparator[$iX], 0, $iVerWidth, $iHeightT)
        GUICtrlSetBkColor(-1, $bColorSeparator)
    Next

    If $iVoid = -1 Then $iVoid = 15

    GUICtrlSetData($aLabel[$iVoid], '')
    GUICtrlSetBkColor($aLabel[$iVoid], $bColorMainBg)
EndFunc

CreateForm()

Global $hDll = DllOpen('user32.dll')
OnAutoItExitRegister('CloseUser32dll')
Func CloseUser32dll()
    ConsoleWrite('CloseUser32dll' & @LF)
    DllClose($hDll)
EndFunc

Global $aCursor[5], $iKeyboard

If _IsPressed(01, $hDll) Or _IsPressed(01, $hDll) Then
    Global $MousePressed = 1
Else
    Global $MousePressed = 0
EndIf

If _IsPressed(25) Or _IsPressed(26) Or _IsPressed(27) Or _IsPressed(28) Then
    Global $KeyboardPressed = 1
Else
    Global $KeyboardPressed = 0
EndIf

Global $KeyboardHighlighting = IniRead($Ini, '15', 'KeyboardHighlighting', 0)
If $KeyboardHighlighting = 1 Then GUICtrlSetBkColor($aLabel[$iVoid], $bColorVoidHighlighting)

OnAutoItExitRegister('Save')
Func Save()
    ConsoleWrite('Save' & @LF)
    For $i = 0 To 15 Step +1
        IniWrite($Ini, '15', $i, GUICtrlRead($aLabel[$i]))
    Next
    IniWrite($Ini, '15', 'Void', $iVoid)
    IniWrite($Ini, '15', 'KeyboardHighlighting', $KeyboardHighlighting)
EndFunc

Global $iError = -1

GUISetState()

Do

    $aCursor = GUIGetCursorInfo($Form1)
    $iKeyboard = 0
    For $i = 1 To 4 Step +1
        If _IsPressed(24+$i) Then
            If $iKeyboard = 0 Then
                $iKeyboard = $i
            Else
                $iKeyboard = -1
                ExitLoop
            EndIf
        EndIf
    Next

    If $iKeyboard > 0 And $KeyboardPressed = 0 Then
        Switch $iKeyboard
            Case 1
                $i = -1
            Case 2
                $i = -4
            Case 3
                $i = +1
            Case 4
                $i = +4
        EndSwitch
        If $iVoid+$i >= 0 And $iVoid+$i <= 15 And Not ($i = -1 And ($iVoid = 4 Or $iVoid = 8 Or $iVoid = 12)) And Not ($i = +1 And ($iVoid = 3 Or $iVoid = 7 Or $iVoid = 11)) Then
            GUICtrlSetBkColor($aLabel[$iVoid], $bColorTextBg)
            GUICtrlSetData($aLabel[$iVoid], GUICtrlRead($aLabel[$iVoid+$i]))
            $iVoid += $i
            GUICtrlSetData($aLabel[$iVoid], '')
            If $KeyboardHighlighting = 0 Then
                GUICtrlSetBkColor($aLabel[$iVoid], $bColorMainBg)
            Else
                GUICtrlSetBkColor($aLabel[$iVoid], $bColorVoidHighlighting)
            EndIf
        EndIf
    EndIf

    If $iKeyboard = 0 Then
        If $KeyboardPressed = 1 Then $KeyboardPressed = 0
    Else
        If $KeyboardPressed = 0 Then
            $KeyboardPressed = 1
            If $KeyboardHighlighting = 0 Then
                GUICtrlSetBkColor($aLabel[$iVoid], $bColorVoidHighlighting)
                $KeyboardHighlighting = 1
            EndIf
            If $iError <> -1 Then
                GUICtrlSetBKColor($aLabel[$iError], $bColorTextBg)
                $iError = -1
            EndIf
        EndIf
    EndIf

    If $aCursor[2] = 1 Or $aCursor[3] = 1 Then
        If $MousePressed = 0 Then

            Switch $aCursor[0]
                Case $aVerSeparator[0] To $aVerSeparator[1]-1
                    $iX = 0
                Case $aVerSeparator[1] To $aVerSeparator[2]-1
                    $iX = 1
                Case $aVerSeparator[2] To $aVerSeparator[3]-1
                    $iX = 2
                Case $aVerSeparator[3] To $aVerSeparator[4]-1
                    $iX = 3
                Case Else
                    $iX = -1
            EndSwitch

            Switch $aCursor[1]
                Case $aHorSeparator[0] To $aHorSeparator[1]-1
                    $iY = 0
                Case $aHorSeparator[1] To $aHorSeparator[2]-1
                    $iY = 1
                Case $aHorSeparator[2] To $aHorSeparator[3]-1
                    $iY = 2
                Case $aHorSeparator[3] To $aHorSeparator[4]-1
                    $iY = 3
                Case Else
                    $iY = -1
            EndSwitch

            If $iX <> -1 And $iY <> -1 Then
                $i = $iY*4+$iX
                If $i <> $iError Then
                    If $KeyboardHighlighting = 1 Then
                        $KeyboardHighlighting = 0
                        GUICtrlSetBkColor($aLabel[$iVoid], $bColorMainBg)
                    EndIf
                    If $iError <> -1 Then
                        GUICtrlSetBKColor($aLabel[$iError], $bColorTextBg)
                        $iError = -1
                    EndIf
                    If ($i = $iVoid+1 And $iVoid <> 3 And $iVoid <> 7 And $iVoid <> 11) Or ($i = $iVoid-1 And $iVoid <> 4 And $iVoid <> 8 And $iVoid <> 12) Or $i = $iVoid+4 Or $i = $iVoid-4 Then
                        GUICtrlSetBkColor($aLabel[$iVoid], $bColorTextBg)
                        GUICtrlSetData($aLabel[$iVoid], GUICtrlRead($aLabel[$i]))
                        $iVoid = $i
                        GUICtrlSetData($aLabel[$iVoid], '')
                        GUICtrlSetBkColor($aLabel[$iVoid], $bColorMainBg)
                        If $KeyboardHighlighting = 0 Then
                            GUICtrlSetBkColor($aLabel[$iVoid], $bColorMainBg)
                        Else
                            GUICtrlSetBkColor($aLabel[$iVoid], $bColorVoidHighlighting)
                        EndIf
                    ElseIf $i <> $iVoid Then
                        GUICtrlSetBkColor($aLabel[$i], $bColorTextErrorBg)
                        $iError = $i
                    EndIf
                EndIf
                $MousePressed = 1
            EndIf
        EndIf
    Else
        If $MousePressed = 1 Then $MousePressed = 0
    EndIf
Until GUIGetMsg() = -3

История версий:
v0.5
Реализовано управление мышкой и клавиатурой (стрелки), обнаруженные баги исправлены, код грязноват, нет дополнительных функций (подсчёт времени, кол-во ходов, смешать головоломку итп)

Автор(ы): dwerf
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
dwerf
Я обновил твоё сообщение, оформил как положенно, возьми это как пример на будущее:

«AutoIt: 3.3.2.0+»
это нужно учитывать, у тебя в скрипте встречается OnAutoItExitRegister, в более ранних версиях этого небыло (читаем справку и список изменении).

«Версия: 0.5»
нужно указывать текущую версию примера/проекта.

«Категория: Игры (головоломка)»
“Головоломка” само по себе не может ыть категорией.

«Описание: Оболочка для игры Пятнашки.»
Должно быть описанием примера/проекта, а не ссылка на описание игры, тем более что на самом деле это ещё не игра ;).

«История версий:»
Тоже желательно помещать под спойлером.
 

DJ_Tommy

Продвинутый
Сообщения
236
Репутация
57
в 94 году я пятнашки на кубейсике с графикой писал. Мышь кстати то же поддерживалась. Еще было меню и история по времени и пользователям. Самое главное (как сейчас помню) это было сделать правильное перемешивание, т.к. существовали нескладываемые позиции. Для этого был сделан рандомайзер, который совершал Н-ое количество случайных переещений, но это давало гарантию на то, что такой разброс 100% когда нить сойдется.
 
Верх