So, jetzt bin ich mal mit ne'm GDI+ Spiel dran
Ist ein ganz normales Mühlespiel für 2 Personen, was (wie ich finde) ganz nett geworden ist
Es gibt außerdem noch einen kleinen Entwicklermodus. Ich hab den einfach mal drinnen gelassen...
Changelog
- 26.6.2010: Release
- 26.6.2010: Spielsteingrafikqualität erhöht -> Danke Name22
- 27.6.2010: Steine bewegen sich grafisch
- 27.6.2010: Gibt nun eine Version mit gezeichnetem Spielbrett
ToDo
- Spielbrett mit GDI+ <-- Siehe Edit- Steine bewegen sich grafisch
- Startmenü
- Computergegner
Kritik ist (wie immer) erwünscht!
P.S.: Mit ESC kann man markierte Steine wieder abwählen
Edit: Dank yxyx gibts jetzt ne Version, die das Mühlefeld selber zeichnet:
Spoiler anzeigen
#Region ;**** Directives created by AutoIt3Wrapper_GUI ****
#AutoIt3Wrapper_icon=windmill.ico
#EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****
#cs ----------------------------------------------------------------------------
AutoIt Version: 3.3.6.1
Author: Cartan12
Script Function:
Ein einfaches Mühlespiel in GDI+
#ce ----------------------------------------------------------------------------
;include
#include <GDIP.au3>
#include <GDIPlus.au3>
#include <GUIConstantsEx.au3>
#include <Misc.au3>
#include <WinAPI.au3>
#include <WindowsConstants.au3>
HotKeySet("{ESC}", "_abwaelen")
Global $debug = 0 ;Entwickler Modus
Global $Geschwindigkeit = 1.5 ;Hier könnt ihr die Geschwindegkeit der Steine einstellen
Global $hotkey = 1
Global $x = 18, $y = 18, $heigh = 650, $widht = 600, $ausgewaehlt = False, $bk, $player = 0, $anderer_player = 1, $muehle = 0, $feld_alt = 0, $verschiebt = 0, $stein_verschiebt
Global $steine[2] = [9,9], $steine_spielfeld[2] = [0, 0], $steine_vorhanden[2] = [1, 1]
Global $fields[24], $field_ausgewaehlt[24], $muehle_feld_aktiv[16]
For $i = 0 To 15
$muehle_feld_aktiv[$i] = 0
Next
For $i = 0 To 23
$fields[$i] = 0
$field_ausgewaehlt[$i] = 0
Next
Global $fieldpos[24][2] = [[6, 6],[270, 6],[538, 6], _;0,1,2
[104, 104],[270, 104],[438, 104], _;3,4,5
[202, 202],[270, 202],[340, 202], _;6,7,8
[6, 270],[104, 270],[202, 270],[340, 270],[438, 270],[538, 270], _;9,10,11,12,13,14
[202, 340],[270, 340],[340, 340], _;15,16,17
[104, 438],[270, 438],[438, 438], _;18,19,20
[6, 538],[270, 538],[538, 538]];21,22,23
Global $muehle_feld[16][3] = [[0, 1, 2],[3, 4, 5],[6, 7, 8],[9, 10, 11],[12, 13, 14],[15, 16, 17],[18, 19, 20],[21, 22, 23], _
[0, 9, 21],[3, 10, 18],[6, 11, 15],[1, 4, 7],[16, 19, 22],[8, 12, 17],[5, 13, 20],[2, 14, 23]]
Global $zugmoeglichkeiten[32][2] = [[0, 1],[1, 2], _
[3, 4],[4, 5], _
[6, 7],[7, 8], _
[9, 10],[10, 11],[12, 13],[13, 14], _
[15, 16],[16, 17], _
[18, 19],[19, 20], _
[21, 22],[22, 23], _
[0, 9],[9, 21], _
[3, 10],[10, 18], _
[6, 11],[11, 15], _
[1, 4],[4, 7],[16, 19],[19, 22], _
[8, 12],[12, 17],[5, 13],[13, 20], _
[2, 14],[14, 23]]
Global $imgpfad = @ScriptDir & "\Pic\"
_GDIPlus_Startup()
$bk = _GDIPlus_ImageLoadFromFile($imgpfad & "muehle.png")
[/autoit] [autoit][/autoit] [autoit]OnAutoItExitRegister("_exit")
Opt("MouseCoordMode", 0)
Opt("GUIOnEventMode", 1)
$GUI = GUICreate("Mühle", $widht, $heigh)
;~ WinSetTrans($GUI,"",90)
GUISetBkColor(0xFFFFFF)
GUISetOnEvent($GUI_EVENT_CLOSE, "_exit")
GUIRegisterMsg($WM_PAINT, "WM_PAINT")
$graphic = _GDIPlus_GraphicsCreateFromHWND($GUI)
$bitmap = _GDIPlus_BitmapCreateFromGraphics($widht, $heigh, $graphic)
$backbuffer = _GDIPlus_ImageGetGraphicsContext($bitmap)
_GDIPlus_GraphicsSetSmoothingMode($backbuffer, 2)
$brush_red = _GDIPlus_BrushCreateSolid(0xFFFF0000)
$brush_blue = _GDIPlus_BrushCreateSolid(0xFF0000FF)
$brush_bk = _GDIPlus_BrushCreateSolid(0xFF35C3C8)
$pen_muehle = _GDIPlus_PenCreate(0xFF000000,7)
GUISetState()
[/autoit] [autoit][/autoit] [autoit]While 1
Sleep(10)
If WinActive($GUI) Then
If Not $hotkey Then HotKeySet("{ESC}", "_abwaelen")
If _IsPressed(01) Then
While _IsPressed(01)
Sleep(10)
WEnd
_checkMouseclick()
EndIf
Else
HotKeySet("{ESC}")
$hotkey = 0
EndIf
If $debug Then
$pos = GUIGetCursorInfo($GUI)
ToolTip($pos[0] & " " & $pos[1],0,0)
EndIf
WEnd
Func _checkMouseclick()
Local $pos = GUIGetCursorInfo($GUI), $temp = 0
If Not $muehle Then
For $i = 0 To 23
Local $temp_X = $fieldpos[$i][0] + 55, $temp_Y = $fieldpos[$i][1] + 55
If $pos[0] > $fieldpos[$i][0] And $pos[1] > $fieldpos[$i][1] And $pos[0] < $temp_X And $pos[1] < $temp_Y And $fields[$i] = 0 And $steine_vorhanden[$player] = 1 Then
$fields[$i] = $player + 1
$steine[$player] -= 1
$steine_spielfeld[$player] += 1
If $steine[$player] = 0 Then $steine_vorhanden[$player] = 0
If Not _checkMuehle() Then _changePlayer()
_WinAPI_RedrawWindow($GUI, 0, 0, $RDW_INTERNALPAINT)
ElseIf $pos[0] > $fieldpos[$i][0] And $pos[1] > $fieldpos[$i][1] And $pos[0] < $temp_X And $pos[1] < $temp_Y And $fields[$i] = $player + 1 And $steine_vorhanden[$player] = 0 And $ausgewaehlt = 0 Then
$field_ausgewaehlt[$i] = 1
$feld_alt = $i
$ausgewaehlt = 1
_WinAPI_RedrawWindow($GUI, 0, 0, $RDW_INTERNALPAINT)
ElseIf $pos[0] > $fieldpos[$i][0] And $pos[1] > $fieldpos[$i][1] And $pos[0] < $temp_X And $pos[1] < $temp_Y And $fields[$i] = 0 And $steine_vorhanden[$player] = 0 And $ausgewaehlt = 1 Then
If $steine_spielfeld[$player] = 3 Then
$fields[$feld_alt] = 0
$fields[$i] = $player + 1
$field_ausgewaehlt[$feld_alt] = 0
$ausgewaehlt = 0
If Not _checkMuehle() Then _changePlayer()
_WinAPI_RedrawWindow($GUI, 0, 0, $RDW_INTERNALPAINT)
Return
EndIf
For $k = 0 To 31
If $zugmoeglichkeiten[$k][0] == $feld_alt Or $zugmoeglichkeiten[$k][1] == $feld_alt Then
If $zugmoeglichkeiten[$k][0] == $i Or $zugmoeglichkeiten[$k][1] == $i Then
$l = 0
$fields[$feld_alt] = 0
$field_ausgewaehlt[$feld_alt] = 0
$ausgewaehlt = 0
If $fieldpos[$feld_alt][0] = $fieldpos[$i][0] Then
If $feld_alt>$i Then
Do
$temp = WM_PAINT_special($l,$feld_alt,$i,$player,0)
$l += $Geschwindigkeit
Until $temp <= $fieldpos[$i][1]
Else
Do
$temp = WM_PAINT_special($l,$feld_alt,$i,$player,0)
$l += $Geschwindigkeit
Until $temp >= $fieldpos[$i][1]
EndIf
ElseIf $fieldpos[$feld_alt][1] = $fieldpos[$i][1] Then
If $feld_alt>$i Then
Do
$temp = WM_PAINT_special($l,$feld_alt,$i,$player,1)
$l += $Geschwindigkeit
Until $temp <= $fieldpos[$i][0]
Else
Do
$temp = WM_PAINT_special($l,$feld_alt,$i,$player,1)
$l += $Geschwindigkeit
Until $temp >= $fieldpos[$i][0]
EndIf
EndIf
$fields[$i] = $player + 1
If Not _checkMuehle() Then _changePlayer()
_WinAPI_RedrawWindow($GUI, 0, 0, $RDW_INTERNALPAINT)
EndIf
EndIf
Next
EndIf
Next
ElseIf $muehle Then
For $i = 0 To 23
Local $temp_X = $fieldpos[$i][0] + 55, $temp_Y = $fieldpos[$i][1] + 55
If $pos[0] > $fieldpos[$i][0] And $pos[1] > $fieldpos[$i][1] And $pos[0] < $temp_X And $pos[1] < $temp_Y And $fields[$i] = $anderer_player + 1 Then
For $k = 0 To 15
If Not $muehle_feld_aktiv[$k] Then ContinueLoop
For $j = 0 To 2
If $i = $muehle_feld[$k][$j] Then
Return
EndIf
Next
Next
If $steine_spielfeld[$anderer_player] <= 3 And Not $steine_vorhanden[$anderer_player] Then
MsgBox(0, "Gewonnen!", "Spieler " & $player + 1 & " hat gewonnen!")
Exit
EndIf
$fields[$i] = 0
$steine_spielfeld[$anderer_player] -= 1
$muehle = 0
_changePlayer()
_WinAPI_RedrawWindow($GUI, 0, 0, $RDW_INTERNALPAINT)
EndIf
Next
EndIf
EndFunc ;==>_checkMouseclick
Func _abwaelen()
$field_ausgewaehlt[$feld_alt] = 0
$ausgewaehlt = 0
_WinAPI_RedrawWindow($GUI, 0, 0, $RDW_INTERNALPAINT)
EndFunc ;==>_abwaelen
Func _checkMuehle()
Local $temp[3]
For $i = 0 To 15
If $muehle_feld_aktiv[$i] Then
For $j = 0 To 2
$temp[$j] = $fields[$muehle_feld[$i][$j]]
Next
If $temp[0] > 0 And $temp[1] > 0 And $temp[2] > 0 Then
If $temp[0] = 1 And $temp[1] = 1 And $temp[2] = 1 Then
ContinueLoop
ElseIf $temp[0] = 2 And $temp[1] = 2 And $temp[2] = 2 Then
ContinueLoop
EndIf
Else
$muehle_feld_aktiv[$i] = 0
EndIf
EndIf
For $j = 0 To 2
$temp[$j] = $fields[$muehle_feld[$i][$j]]
Next
If $temp[0] > 0 And $temp[1] > 0 And $temp[2] > 0 Then
If $temp[0] = 1 And $temp[1] = 1 And $temp[2] = 1 Then
$muehle_feld_aktiv[$i] = 1
$muehle = 1
Return 1
ElseIf $temp[0] = 2 And $temp[1] = 2 And $temp[2] = 2 Then
$muehle_feld_aktiv[$i] = 1
$muehle = 1
Return 1
EndIf
ElseIf $temp[0] = 0 And $temp[1] = 0 And $temp[2] = 0 Then
$muehle_feld_aktiv[$i] = 0
EndIf
Next
$muehle = 0
Return 0
EndFunc ;==>_checkMuehle
Func _changePlayer()
If $player = 0 Then
$player = 1
$anderer_player = 0
ElseIf $player = 1 Then
$player = 0
$anderer_player = 1
EndIf
EndFunc ;==>_changePlayer
Func _exit()
_GDIPlus_ImageDispose($bk)
_GDIPlus_GraphicsDispose($graphic)
_GDIPlus_BitmapDispose($bitmap)
_GDIPlus_BrushDispose($brush_red)
_GDIPlus_BrushDispose($brush_blue)
_GDIPlus_BrushDispose($brush_bk)
_GDIPlus_PenDispose($pen_muehle)
_GDIPlus_Shutdown()
Exit
EndFunc ;==>_exit
Func WM_PAINT()
_GDIPlus_GraphicsClear($backbuffer, 0xFFFFFFFF)
;~ _GDIPlus_GraphicsDrawImageRect($backbuffer,$bk,15,15,$widht-30,$heigh-80)
_drawMuehle()
If $debug Then
For $i = 0 To 23
_GDIPlus_GraphicsDrawString($backbuffer, $i, $fieldpos[$i][0], $fieldpos[$i][1])
Next
EndIf
For $i = 0 To 23
If $field_ausgewaehlt[$i] Then
_GDIPlus_GraphicsFillRect($backbuffer, $fieldpos[$i][0], $fieldpos[$i][1], 55, 55, $brush_bk)
EndIf
Next
For $i = 0 To 23
If $fields[$i] = 1 Then
_GDIPlus_GraphicsFillRoundRect($backbuffer, $fieldpos[$i][0], $fieldpos[$i][1], 55, 55, 55, $brush_blue)
ElseIf $fields[$i] = 2 Then
_GDIPlus_GraphicsFillRoundRect($backbuffer, $fieldpos[$i][0], $fieldpos[$i][1], 55, 55, 55, $brush_red)
EndIf
Next
_GDIPlus_GraphicsDrawString($backbuffer, "Spieler " & $player + 1 & " ist am Zug!", 50, $heigh - 40)
If $muehle Then _GDIPlus_GraphicsDrawString($backbuffer, "Bitte einen Stein zum rausschmeißen aussuchen!", 50, $heigh - 20)
If $steine_vorhanden[$player] Then _GDIPlus_GraphicsDrawString($backbuffer, "Der Spieler hat noch " & $steine[$player] & " Spielsteine übrig!", 200, $heigh - 40)
If Not $steine_vorhanden[$player] And Not $ausgewaehlt And Not $muehle Then _GDIPlus_GraphicsDrawString($backbuffer, "Bitte einen Spielstein zum verschieben auswählen!", 200, $heigh - 40)
_GDIPlus_GraphicsDrawImageRect($graphic, $bitmap, 0, 0, $widht, $heigh)
EndFunc ;==>WM_PAINT
Func WM_PAINT_special($il,$sfeld_alt,$ii,$iplayer,$imodus)
_GDIPlus_GraphicsClear($backbuffer, 0xFFFFFFFF)
;~ _GDIPlus_GraphicsDrawImageRect($backbuffer,$bk,15,15,$widht-30,$heigh-80)
_drawMuehle()
For $i = 0 To 23
If $fields[$i] = 1 Then
_GDIPlus_GraphicsFillRoundRect($backbuffer, $fieldpos[$i][0], $fieldpos[$i][1], 55, 55, 55, $brush_blue)
ElseIf $fields[$i] = 2 Then
_GDIPlus_GraphicsFillRoundRect($backbuffer, $fieldpos[$i][0], $fieldpos[$i][1], 55, 55, 55, $brush_red)
EndIf
Next
If Not $imodus Then
Local $temp = $fieldpos[$sfeld_alt][1] + $il
If $sfeld_alt>$ii Then $temp = $fieldpos[$sfeld_alt][1] - $il
If Not $iplayer Then
_GDIPlus_GraphicsFillRoundRect($backbuffer, $fieldpos[$sfeld_alt][0], $temp, 55, 55, 55, $brush_blue)
Else
_GDIPlus_GraphicsFillRoundRect($backbuffer, $fieldpos[$sfeld_alt][0], $temp, 55, 55, 55, $brush_red)
EndIf
Else
Local $temp = $fieldpos[$sfeld_alt][0] + $il
If $sfeld_alt>$ii Then $temp = $fieldpos[$sfeld_alt][0] - $il
If Not $player Then
_GDIPlus_GraphicsFillRoundRect($backbuffer, $temp, $fieldpos[$sfeld_alt][1], 55, 55, 55, $brush_blue)
Else
_GDIPlus_GraphicsFillRoundRect($backbuffer, $temp, $fieldpos[$sfeld_alt][1], 55, 55, 55, $brush_red)
EndIf
EndIf
_GDIPlus_GraphicsDrawString($backbuffer, "Spieler " & $player + 1 & " ist am Zug!", 50, $heigh - 40)
If $muehle Then _GDIPlus_GraphicsDrawString($backbuffer, "Bitte einen Stein zum rausschmeißen aussuchen!", 50, $heigh - 20)
If $steine_vorhanden[$player] Then _GDIPlus_GraphicsDrawString($backbuffer, "Der Spieler hat noch " & $steine[$player] & " Spielsteine übrig!", 200, $heigh - 40)
If Not $steine_vorhanden[$player] And Not $ausgewaehlt And Not $muehle Then _GDIPlus_GraphicsDrawString($backbuffer, "Bitte einen Spielstein zum verschieben auswählen!", 200, $heigh - 40)
_GDIPlus_GraphicsDrawImageRect($graphic, $bitmap, 0, 0, $widht, $heigh)
Return $temp
EndFunc ;==>WM_PAINT
Func _drawMuehle()
_GDIPlus_GraphicsDrawLine($backbuffer,33,28,34,568,$pen_muehle);links außen
_GDIPlus_GraphicsDrawLine($backbuffer,31,566,569,566,$pen_muehle) ;unten außen
_GDIPlus_GraphicsDrawLine($backbuffer,566,568,566,28,$pen_muehle) ;rechts außen
_GDIPlus_GraphicsDrawLine($backbuffer,30,30,569,30,$pen_muehle) ; oben außen
_GDIPlus_GraphicsDrawLine($backbuffer,132,129,132,471,$pen_muehle) ;links mitte
_GDIPlus_GraphicsDrawLine($backbuffer,129,468,471,468,$pen_muehle);unten mitte
_GDIPlus_GraphicsDrawLine($backbuffer,468,471,468,129,$pen_muehle);rechts mitte
_GDIPlus_GraphicsDrawLine($backbuffer,129,132,471,132,$pen_muehle);links mitte
_GDIPlus_GraphicsDrawLine($backbuffer,232,229,232,367,$pen_muehle);links innen
_GDIPlus_GraphicsDrawLine($backbuffer,229,364,367,364,$pen_muehle);unten innen
_GDIPlus_GraphicsDrawLine($backbuffer,364,367,364,229,$pen_muehle);rechts innen
_GDIPlus_GraphicsDrawLine($backbuffer,367,232,229,232,$pen_muehle);oben innen
_GDIPlus_GraphicsDrawLine($backbuffer,32,296,232,296,$pen_muehle)
_GDIPlus_GraphicsDrawLine($backbuffer,296,568,296,364,$pen_muehle)
_GDIPlus_GraphicsDrawLine($backbuffer,568,296,364,296,$pen_muehle)
_GDIPlus_GraphicsDrawLine($backbuffer,296,32,296,232,$pen_muehle)
EndFunc
Func _GDIPlus_GraphicsFillRoundRect($gra, $x, $y, $w, $h, $r = 30, $brush = 0)
;by TheShadowAE
Local $path = _GDIPlus_PathCreate(1)
_GDIPlus_PathAddPie($path, $x, $y, $r, $r, 180, 90)
_GDIPlus_PathAddPie($path, $x + $w - $r, $y, $r, $r, 270, 90)
_GDIPlus_PathAddPie($path, $x + $w - $r, $y + $h - $r, $r, $r, 0, 90)
_GDIPlus_PathAddPie($path, $x, $y + $h - $r, $r, $r, 90, 90)
_GDIPlus_PathAddRectangle($path, $x, $y + $r / 2, $w, $h - $r)
_GDIPlus_PathAddRectangle($path, $x + $r / 2, $y, $w - $r, $h)
_GDIPlus_PathCloseFigure($path)
_GDIPlus_GraphicsFillPath($gra, $path, $brush)
_GDIPlus_PathDispose($path)
EndFunc ;==>_GDIPlus_GraphicsFillRoundRect
Außerdem kann man duch ändern der Variable $Geschwindigkeit das Tempo der Spielsteine festlegen