Shanghai Dynasty

  • So ich will dann mal mein 2. Spiel vorstellen.

    Es heißt Shanghai Dynasty und ist eine Variante von Mah-Jonng für den Computer und Einzelspieler.

    Eine "ausführliche" Beschreibung liegt bei.

    Viel Spaß!

    Hier noch für alle die denn Quelltext wollen

    Spoiler anzeigen
    [autoit]

    #include <guiconstants.au3>
    #include <array.au3>
    #include <Misc.au3>
    ;~---DEKLARATIONEN--------------------------

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

    Dim $f[17][9][6] ; Werte des Spielfeldes
    Dim $p[16][9][6] ; BilderID
    Dim $t[200] ; Feld in dem die bereits verwendeten Karten gespeichert werden
    Dim $w[4] ; Feld in dem eine angeklickte Karte gespeichert wird[0] x - Koord. [1] y - Koord . [2] z - Koord. [3] Wert

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

    ;~---DEFINITIONEN---------------------------
    Func karteerzeugen(ByRef $t , $pos )
    Do
    $anz = 0
    $z = Random(11,52,1)
    For $i = 1 To $pos+1
    If $t[$i] = $z Then $anz +=1
    Next
    Until ($anz = 0 ) Or ( ( $anz < 4 ) And ( $z < 45 ) )
    Return $z
    EndFunc

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

    Func kartenwerte(ByRef $f , ByRef $t )
    $pos = 1
    $f[7][4][5] = karteerzeugen($t,$pos)
    ;~ $f[8][4][5] = $f[7][4][5]
    ;~ $f[7][5][5] = $f[7][4][5]
    ;~ $f[8][5][5] = $f[7][4][5]
    For $i = 1 To 15
    $f[$i][5][1]= karteerzeugen($t,$pos)
    $t[$pos] = $f[$i][5][1]
    $pos +=1
    If ( $i > 1 ) And ( $i < 14 ) Then
    $f[$i][1][1]= karteerzeugen($t,$pos)
    $t[$pos] = $f[$i][1][1]
    $pos +=1
    $f[$i][4][1]= karteerzeugen($t,$pos)
    $t[$pos] = $f[$i][4][1]
    $pos +=1
    $f[$i][8][1]= karteerzeugen($t,$pos)
    $t[$pos] = $f[$i][8][1]
    $pos +=1
    EndIf
    If ( $i > 3 ) And ( $i < 12 ) Then
    $f[$i][2][1]= karteerzeugen($t,$pos)
    $t[$pos] = $f[$i][2][1]
    $pos +=1
    $f[$i][7][1]= karteerzeugen($t,$pos)
    $t[$pos] = $f[$i][7][1]
    $pos +=1
    EndIf
    If ( $i > 2 ) And ( $i < 13 ) Then
    $f[$i][3][1]= karteerzeugen($t,$pos)
    $t[$pos] = $f[$i][3][1]
    $pos +=1
    $f[$i][6][1]= karteerzeugen($t,$pos)
    $t[$pos] = $f[$i][6][1]
    $pos +=1
    EndIf
    If ( $i > 4 ) And ( $i < 11 ) Then
    $f[$i][2][2]= karteerzeugen($t,$pos)
    $t[$pos] = $f[$i][2][2]
    $pos +=1
    $f[$i][3][2]= karteerzeugen($t,$pos)
    $t[$pos] = $f[$i][3][2]
    $pos +=1
    $f[$i][4][2]= karteerzeugen($t,$pos)
    $t[$pos] = $f[$i][4][2]
    $pos +=1
    $f[$i][5][2]= karteerzeugen($t,$pos)
    $t[$pos] = $f[$i][5][2]
    $pos +=1
    $f[$i][6][2]= karteerzeugen($t,$pos)
    $t[$pos] = $f[$i][6][2]
    $pos +=1
    $f[$i][7][2]= karteerzeugen($t,$pos)
    $t[$pos] = $f[$i][7][2]
    $pos +=1
    EndIf
    If ( $i > 5 ) And ( $i < 10 ) Then
    $f[$i][3][3]= karteerzeugen($t,$pos)
    $t[$pos] = $f[$i][3][3]
    $pos +=1
    $f[$i][4][3]= karteerzeugen($t,$pos)
    $t[$pos] = $f[$i][4][3]
    $pos +=1
    $f[$i][5][3]= karteerzeugen($t,$pos)
    $t[$pos] = $f[$i][5][3]
    $pos +=1
    $f[$i][6][3]= karteerzeugen($t,$pos)
    $t[$pos] = $f[$i][6][3]
    $pos +=1
    EndIf
    If ( $i > 6 ) And ( $i < 9 ) Then
    $f[$i][4][4]= karteerzeugen($t,$pos)
    $t[$pos] = $f[$i][4][4]
    $pos +=1
    $f[$i][5][4]= karteerzeugen($t,$pos)
    $t[$pos] = $f[$i][5][4]
    $pos +=1
    EndIf
    Next
    EndFunc

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

    Func kartenbildererzeugen ( ByRef $p )
    For $i = 1 To 15
    ; 1. Reihe und 8. Reihe malen
    If ( $i > 1 ) And ( $i < 14 ) Then
    $p[$i][1][1] = GUICtrlCreatePic(@ScriptDir & "\Images\Karten\1\" & $f[$i][1][1] &".bmp",$i*48-45,3,48,60)
    $p[$i][8][1] = GUICtrlCreatePic(@ScriptDir & "\Images\Karten\1\" & $f[$i][8][1] &".bmp",$i*48-45,423,48,60)
    EndIf
    ; 2. Reihe und 7. Reihe malen
    if ( $i > 3 ) And ( $i < 12 ) Then
    $p[$i][2][1] = GUICtrlCreatePic(@ScriptDir & "\Images\Karten\1\" & $f[$i][2][1] &".bmp",$i*48-45,63,48,60)
    $p[$i][7][1] = GUICtrlCreatePic(@ScriptDir & "\Images\Karten\1\" & $f[$i][7][1] &".bmp",$i*48-45,363,48,60)
    EndIf
    If ( $i > 4 ) And ( $i < 11 ) Then
    $p[$i][2][2] = GUICtrlCreatePic(@ScriptDir & "\Images\Karten\2\" & $f[$i][2][2] &".bmp",$i*48-45,63,48,60)
    $p[$i][7][2] = GUICtrlCreatePic(@ScriptDir & "\Images\Karten\2\" & $f[$i][7][2] &".bmp",$i*48-45,363,48,60)
    EndIf
    ; 3. Reihe und 6. Reihe malen
    If ( $i > 2 ) And ( $i < 13 ) Then
    $p[$i][3][1] = GUICtrlCreatePic(@ScriptDir & "\Images\Karten\1\" & $f[$i][3][1] &".bmp",$i*48-45,123,48,60)
    $p[$i][6][1] = GUICtrlCreatePic(@ScriptDir & "\Images\Karten\1\" & $f[$i][6][1] &".bmp",$i*48-45,303,48,60)
    EndIf
    If ( $i > 4 ) And ( $i < 11 ) Then
    $p[$i][3][2] = GUICtrlCreatePic(@ScriptDir & "\Images\Karten\2\" & $f[$i][3][2] &".bmp",$i*48-45,123,48,60)
    $p[$i][6][2] = GUICtrlCreatePic(@ScriptDir & "\Images\Karten\2\" & $f[$i][6][2] &".bmp",$i*48-45,303,48,60)
    EndIf
    If ( $i > 5 ) And ( $i < 10 ) Then
    $p[$i][3][3] = GUICtrlCreatePic(@ScriptDir & "\Images\Karten\3\" & $f[$i][3][3] &".bmp",$i*48-45,123,48,60)
    $p[$i][6][3] = GUICtrlCreatePic(@ScriptDir & "\Images\Karten\3\" & $f[$i][6][3] &".bmp",$i*48-45,303,48,60)
    EndIf
    ; 4. Reihe malen
    If ( $i > 1 ) And ( $i < 14 ) Then $p[$i][4][1] = GUICtrlCreatePic(@ScriptDir & "\Images\Karten\1\" & $f[$i][4][1] &".bmp",$i*48-45,183,48,60)
    If ( $i > 4 ) And ( $i < 11 ) Then $p[$i][4][2] = GUICtrlCreatePic(@ScriptDir & "\Images\Karten\2\" & $f[$i][4][2] &".bmp",$i*48-45,183,48,60)
    If ( $i > 5 ) And ( $i < 10 ) Then $p[$i][4][3] = GUICtrlCreatePic(@ScriptDir & "\Images\Karten\3\" & $f[$i][4][3] &".bmp",$i*48-45,183,48,60)
    If ( $i > 6 ) And ( $i < 9 ) Then $p[$i][4][4] = GUICtrlCreatePic(@ScriptDir & "\Images\Karten\4\" & $f[$i][4][4] &".bmp",$i*48-45,183,48,60)
    ; 5. Reihe malen
    If ( $i > 1 ) And ( $i < 14 ) Then $p[$i][5][1] = GUICtrlCreatePic(@ScriptDir & "\Images\Karten\1\" & $f[$i][5][1] &".bmp",$i*48-45,243,48,60)
    If ( $i > 4 ) And ( $i < 11 ) Then $p[$i][5][2] = GUICtrlCreatePic(@ScriptDir & "\Images\Karten\2\" & $f[$i][5][2] &".bmp",$i*48-45,243,48,60)
    If ( $i > 5 ) And ( $i < 10 ) Then $p[$i][5][3] = GUICtrlCreatePic(@ScriptDir & "\Images\Karten\3\" & $f[$i][5][3] &".bmp",$i*48-45,243,48,60)
    If ( $i > 6 ) And ( $i < 9 ) Then $p[$i][5][4] = GUICtrlCreatePic(@ScriptDir & "\Images\Karten\4\" & $f[$i][5][4] &".bmp",$i*48-45,243,48,60)

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

    Next
    $p[ 1][5][1] = GUICtrlCreatePic(@ScriptDir & "\Images\Karten\1\" & $f[ 1][5][1] &".bmp", 3,213,48,60) ; Mitte links
    $p[14][5][1] = GUICtrlCreatePic(@ScriptDir & "\Images\Karten\1\" & $f[14][5][1] &".bmp",627,213,48,60) ; Mitte rechts
    $p[15][5][1] = GUICtrlCreatePic(@ScriptDir & "\Images\Karten\1\" & $f[15][5][1] &".bmp",675,213,48,60) ; Mitte rechts außen
    $p[ 7][4][5] = GUICtrlCreatePic(@ScriptDir & "\Images\Karten\5\" & $f[ 7][4][5] &".bmp",315,213,48,60) ; Mitte
    EndFunc

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

    Func kartenbilderzerstoeren( ByRef $p )
    GUICtrlDelete($p[ 1][5][1])
    GUICtrlDelete($p[14][5][1])
    GUICtrlDelete($p[15][5][1])
    GUICtrlDelete($p[ 7][4][5])
    For $i = 1 To 15
    If ( $i > 1 ) And ( $i < 14 ) Then
    GUICtrlDelete($p[$i][1][1])
    GUICtrlDelete($p[$i][8][1])
    EndIf
    if ( $i > 3 ) And ( $i < 12 ) Then
    GUICtrlDelete($p[$i][2][1])
    GUICtrlDelete($p[$i][7][1])
    EndIf
    If ( $i > 4 ) And ( $i < 11 ) Then
    GUICtrlDelete($p[$i][2][2])
    GUICtrlDelete($p[$i][7][2])
    EndIf
    If ( $i > 2 ) And ( $i < 13 ) Then
    GUICtrlDelete($p[$i][3][1])
    GUICtrlDelete($p[$i][6][1])
    EndIf
    If ( $i > 4 ) And ( $i < 11 ) Then
    GUICtrlDelete($p[$i][3][2])
    GUICtrlDelete($p[$i][6][2])
    EndIf
    If ( $i > 5 ) And ( $i < 10 ) Then
    GUICtrlDelete($p[$i][3][3])
    GUICtrlDelete($p[$i][6][3])
    EndIf
    If ( $i > 1 ) And ( $i < 14 ) Then GUICtrlDelete($p[$i][4][1])
    If ( $i > 4 ) And ( $i < 11 ) Then GUICtrlDelete($p[$i][4][2])
    If ( $i > 5 ) And ( $i < 10 ) Then GUICtrlDelete($p[$i][4][3])
    If ( $i > 6 ) And ( $i < 9 ) Then GUICtrlDelete($p[$i][4][4])
    If ( $i > 1 ) And ( $i < 14 ) Then GUICtrlDelete($p[$i][5][1])
    If ( $i > 4 ) And ( $i < 11 ) Then GUICtrlDelete($p[$i][5][2])
    If ( $i > 5 ) And ( $i < 10 ) Then GUICtrlDelete($p[$i][5][3])
    If ( $i > 6 ) And ( $i < 9 ) Then GUICtrlDelete($p[$i][5][4])

    Next

    EndFunc

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

    ;~---GUI------------------------------------
    GUICreate ("Shanghai Dynasty",728,528)
    GUICtrlCreatePic(@ScriptDir & "\Images\Rahmen\o_l.bmp",0,0,3,3)
    GUICtrlCreatePic(@ScriptDir & "\Images\Rahmen\o_r.bmp",723,0,4,5)
    GUICtrlCreatePic(@ScriptDir & "\Images\Rahmen\u_l.bmp",0,484,4,4)
    GUICtrlCreatePic(@ScriptDir & "\Images\Rahmen\u_r.bmp",723,483,4,5)
    GUICtrlCreatePic(@ScriptDir & "\Images\Rahmen\o.bmp",3,0,720,3)
    GUICtrlCreatePic(@ScriptDir & "\Images\Rahmen\r.bmp",724,4,3,479)
    GUICtrlCreatePic(@ScriptDir & "\Images\Rahmen\u.bmp",4,485,719,3)
    GUICtrlCreatePic(@ScriptDir & "\Images\Rahmen\l.bmp",0,3,3,481)
    $Button_spiel = GUICtrlCreateButton("Spielen",11,495,150,30)
    $Button_ende = GUICtrlCreateButton("Beenden",565,495,150,30)

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

    ;~---INITALISIERUNG----------------------------

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

    For $i = 0 To 16 ; Ganze Feld ist leer
    For $j = 0 To 8
    For $k= 0 To 5
    $f[$i][$j][$k] = 0
    Next
    Next
    Next

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

    kartenwerte($f,$t)

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

    ;~---KARTEN-BILDER ERZEUGEN--------
    kartenbildererzeugen($p)
    GUISetState(@SW_SHOW)

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

    While 1

    For $i = 0 To 3 ; Nix angeklickt
    $w[$i] = 0
    Next

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

    While 1
    $msg = GUIGetMsg()
    $mp = GUIGetCursorInfo()
    Select
    Case ( $msg = $GUI_EVENT_CLOSE ) Or ( $msg = $Button_ende )
    Exit
    Case ( $msg = $Button_spiel)
    ExitLoop
    Case ( _IsPressed(09) = 1 )
    Case WinActive("Shanghai Dynasty") = 1
    If ( _IsPressed(01) = 1 ) And ($mp[1] < 480 ) Then
    ;~ KOORDINATEN DES AUSGEWÄHLTEN BILDS BEKOMMEN
    $x = Int(($mp[0]+45) / 48)
    $y = Int(($mp[1]-3 ) / 60)+1
    If ($f[$x][$y][1] <> 0 ) Or ($f[$x][$y][2] <> 0 ) Or ($f[$x][$y][3] <> 0 ) Or ($f[$x][$y][4] <> 0 ) Or ($f[$x][$y][5] <> 0 ) Then
    If ( $f[$x][$y][5] <> 0 ) Then
    $z = 5
    ElseIf ( $f[$x][$y][4] <> 0 ) Then
    $z = 4
    ElseIf ( $f[$x][$y][3] <> 0 ) Then
    $z = 3
    ElseIf ( $f[$x][$y][2] <> 0 ) Then
    $z = 2
    ElseIf ( $f[$x][$y][1] <> 0 ) Then
    $z = 1
    EndIf
    If ( $z = 4 ) And ( $f[7][4][5] <> 0 ) Then
    $x = 7
    $y = 4
    $z = 5
    EndIf
    ;~ ÜBERPRÜFEN OB DAS BILD AM RAND LIEGT
    $rand = False ; Erstmal liegt es nicht am Rand
    If ( $f[$x-1][$y][$z] = 0 ) Or ( $f[$x+1][$y][$z] = 0 ) Then ; Ob links oder rechts vom Spielsten frei ist
    $rand = True
    EndIf
    ; Spezialfälle - wieder...
    ;Liegt immer am Rand ;)
    If $z=5 Then $rand = True
    ; Linke Karte die die rechts davon Liegenden hindert
    If ( $x = 2 ) And ( $y = 4 ) And ( $z = 1) And ( $f[ 1][5][1] <> 0 ) Then $rand = False
    ; Rechte Karte die die links davon Liegenden hindert
    If ( $x = 13 ) And ( $y = 4 ) And ( $z = 1) And ( $f[14][5][1] <> 0 ) Then $rand = False
    If $rand = True Then; Jetzt hat der User aber wirklich richtig geklickt
    ;Kartenpaar getroffen
    If ($w[0] <> $x ) Or ( $w[1] <> $y ) Then ; Nicht gleiche Koordinaten
    If (($w[3] = $f[$x][$y][$z])) Or ((( $w[3] > 48 ) And ($f[$x][$y][$z] > 48 ))) Or ((( $w[3] > 44 ) And ( $w[3] < 49 )) And (( $f[$x][$y][$z] > 44 ) And ( $f[$x][$y][$z] < 49 ))) Then
    $f[$x][$y][$z] = 0
    $f[$w[0]][$w[1]][$w[2]] = 0
    GUICtrlDelete($p[$w[0]][$w[1]][$w[2]])
    GUICtrlDelete($p[$x][$y][$z])
    $w[0] = 0
    $w[1] = 0
    $w[2] = 0
    $w[3] = 0
    ;~ Kartenpaar nicht getroffen bzw. noch nichts ausgewählt
    Else
    GUICtrlSetImage($p[$w[0]][$w[1]][$w[2]],@ScriptDir & "\Images\Karten\" & $w[2] & "\" & $f[$w[0]][$w[1]][$w[2]] &".bmp")
    GUICtrlSetImage($p[7][4][5],@ScriptDir & "\Images\Karten\5\" & $f[7][4][5] &".bmp")
    If ( $z = 5 ) Then
    $w[0] = 7
    $w[1] = 4
    $w[2] = 5
    $w[3] = $f[7][4][5]
    Else
    $w[0] = $x
    $w[1] = $y
    $w[2] = $z
    $w[3] = $f[$x][$y][$z]
    EndIf
    GUICtrlSetImage($p[$x][$y][$z],@ScriptDir & "\Images\Karten\6\" & $f[$x][$y][$z] &".bmp")
    EndIf
    EndIf
    EndIf
    EndIf
    EndIf
    EndSelect

    Sleep(10)
    WEnd

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

    ;~ KARTENBILDER LÖSCHEN
    kartenbilderzerstoeren($p)

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

    ;~ KARTEN-WERTE ERZEUGEN
    kartenwerte($f,$t)
    ;~ KARTEN-BILDER ERZEUGEN
    kartenbildererzeugen($p)
    GUISetState(@SW_HIDE)
    GUISetState(@SW_SHOW)

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

    WEnd

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

    Exit

    [/autoit]

    mfg Wesloth

  • WTF...das hast du echt selbst gemacht oO


    das sieht sehr professionell aus!!!

    Gespielt hab ich auch schon....wusste nur nich wie, aber Beschreibung ist ja dabei, also respekt ist sehr gut gewurden


    Waluev

    Flensburg ist wie Payback - wenn man 18 Punkte hat bekommt man ein Fahrrad.