3 gewinnt - ewiger code nötig oder nicht?

Hallo, aus Augsburg

Jeder kennt doch das Spiel:

xox
oxo
oox
… so zu sagen 3 gewinnt…

kannes möglich sein, ewigen code zu schreiben (If …)
oder wie löst man denn so was?

Danke für eure anregungen & hilfe

Hallo aus Hamburg :smile:

Jeder kennt doch das Spiel:

xox
oxo
oox
… so zu sagen 3 gewinnt…

Stimmt schonmal. (Tic Tac Toe…)

kannes möglich sein, ewigen code zu schreiben (If …)

Ich weiß nicht genau, was Du mit ewigem Code meinst, aber es klingt ja sehr stark nach Rekursion (Methode/ Funktion ruft sich selbst auf…)
In welcher Sprache willst Du das denn programmieren?

Danke für eure anregungen & hilfe

…das hat Dir wahrscheinlich noch nicht geholfen…
Trotzdem viele Grüße
Till

Hallo,
Programm. in VB6,

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hi,
bei dem kleinen Ding, das nur neun Felder hat, würde ich mit
Select Case anfangen und die sinnvollen Lösungen in Strings ablegen.
Das wird wohl ein kurzes Prigramm.
Gruß, Rainer

berichtigt mich bitte …
Hallo,
berichtigt mich bitte …

wenn der 1. anfängt soll x an seine gewünschte stelle,
der rechner ist der Gegner (2),
der sollte doch erst mal prüfen ob da scho einer ist,
wenn net soll er irgend wo ne o „bauen“, wenn der
(2) wieder dran ist, soll schauen, ob da einer ist, und sinnvoll
das 2. o bauen,
weitere durchgänge …
und wenn in einer linie ooo dann WINNER… oder so …

wenig Code ???
klein ??? Na klar klein, würde ich jetzt mein Menschärgerdichnicht hier reinstellen … würde es den Rahmen etwas sprengen,

suche nur ne IDEE…

Danke euch für eure Antworten
(der Anfänger)

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hi,
ich fand die Idee lustig und probiere gerade mal, wie lange ich dazu brauche. :wink:

Im Moment habe ich ein Steuerelementefeld, Pictureboxen von 0-9 und die Bilden mit dem X und dem O auf der Form.
Ein Button, auf dem ‚Neu starten‘ steht und bisher den Code …

Dim i As Integer
Dim l(9) As String

Private Sub Command1\_Click()
 For i = 0 To 8
 Picture1.Picture = LoadPicture()
 Next

 l(0) = "123468"
 l(1) = "0247"
 l(2) = "014568"
 l(3) = "0456"
 l(4) = "01235678"
 l(5) = "2348"
 l(6) = "023478"
 l(7) = "1468"
 l(8) = "024567"

End Sub

Du kannst es natürlich auch kompliziert machen. :wink:

Gruß, Rainer
PS. Jetzt gehe ich erst mal kochen, die Zeit zählt nicht.

Hallo, Udo!

Was genau hast Du vor? Willst Du wissen, wie man dieses Problem löst? Willst Du ein sinnvolles Spiel programmieren? Dass dieses Spiel nicht gewonnen werden kann, wenn nicht einer der Spieler so dumm ist, dass er nicht aus dem Bus gucken kann, ist ja nun bekannt. Demzufolge ließe sich ein Programm schreiben, welches mit der Zielvorgabe, das Spiel zu gewinnen, sich aufhängt, wenn es nicht korrekt terminiert wird.

Für mich gäbe es zwei Gründe, Tic Tac Toe zu programmieren: 1. Ich will ein Spiel schreiben: Entfällt, weil es garantiert zig tausend Downloads für umsonst dazu gibt. Da würde ich doch lieber was vernünftiges mit meiner Zeit anfangen.

  1. Ich will hinter die Logik steigen und dieses Spiel „verstehen“, ebenso die computergestützte Umsetzung. Dazu heißt es dann, den Lösungsalgorithmus zu entwerfen. Und da hast Du schon die ersten Punkte geliefert.

Du brauchst:

  • Regeln: Wohin dürfen Markierungen gesetzt werden? Wann terminiert das Spiel (drei in einer Zeile, Spalte oder diagonal mit Sieg, alle Felder belegt mit Unentschieden)?

  • Repräsentierung der Spielwelt: z. B. Array 3x3 mit Dreifach-Markierung für jedes Feld (leer, Spieler 1, Spieler 2)

  • Logik: In einem einfachen Beispiel wie hier: Alle Möglichkeiten und Spiele hardvercodet ablegen. Bei der begrenzten Zahl von Möglichkeiten durchaus noch realistisch darstellbar. Alternativ: Regelwerk ausnutzen: Gibt es eine Möglichkeit, das Spiel sofort zu gewinnen? Ja: Nimm diese, nein: Hinterlasse ich eine Situation, in der der Gegner sofort gewinnen kann? Ja: Vermeide diese, versuch was anderes; nein: Zug wäre möglich. Nun könnte um der Perfektion willen dieser Algortihmus rekursiv fortgesetzt werden…

Basierend auf dieser Art könntest Du Dir das Spiel bauen…

Gruß, Manfred

HALLO;
jaja, ich versuch mich gerade mit solchem „schmarn“, wo bei ich dies nicht einmal für schmarn finde, eigendlich will ich ja no was lernen…!

Sei doch Bitte so nett, und maile mir den Code, man lernt net aus…!

Danke

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hi Udo,

ist doch lustig und übt. Man kann’s nicht gewinnen, deshalb bleibt’s bei der Übung. Wenn ich’s ferig habe maile ich Dir den Code gern, obwohl der hier noch gut passen würde. Wird echt nicht lang und heute noch fertig.

Gruß, Rainer

freu mich drauf :smile:

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hi Udo,
Mail ist raus.
Gruß, Rainer

Hallo Manfred,

Für mich gäbe es zwei Gründe, Tic Tac Toe zu programmieren: 1.
Ich will ein Spiel schreiben: Entfällt, weil es garantiert zig
tausend Downloads für umsonst dazu gibt. Da würde ich doch
lieber was vernünftiges mit meiner Zeit anfangen.

  1. Ich will hinter die Logik steigen und dieses Spiel
    „verstehen“, ebenso die computergestützte Umsetzung. Dazu
    heißt es dann, den Lösungsalgorithmus zu entwerfen. Und da
    hast Du schon die ersten Punkte geliefert.

mir fällt noch eine dritte Variante ein, einfach mal entspannen. :wink:
So ein kleines Programm zu schreiben ist die richtige Erholung für den Sonntagnachmittag.

Gruß, Rainer

Hallo Rainer,

häng’s doch hier auch mal dran :wink:

Danke & Grüße

CMБ

Hi,

häng’s doch hier auch mal dran :wink:

willst was zum Kritisieren haben … :wink: OK.

Dim l(9) As String
Dim g(9, 3) As String

Private Sub Command1\_Click()
 neu
End Sub

Private Sub Form\_Load()
 Randomize Timer
 neu
End Sub

Private Sub Picture1\_Click(Index As Integer)
 If Picture1(Index).Picture Picture2.Picture And Picture1(Index).Picture Picture3.Picture Then
 Picture1(Index).Picture = Picture3.Picture
 DoEvents

'\*\*\*\*\* Hat der Spieler gewonnen? \*\*\*\*\*

 For i = 0 To 3
 If Len(g(Index, i)) \> 0 Then
 If Picture1(Val(Left(g(Index, i), 1))) = Picture3.Picture And Picture1(Val(Right(g(Index, i), 1))) = Picture3.Picture Then
 Label1.Caption = "Du hast gewonnen!"
 Label1.Visible = True
 For j = 0 To 8
 Picture1(j).Enabled = False
 Next
 Timer1.Enabled = True
 Exit Sub
 End If
 End If
 Next

'\*\*\*\*\* Kann der Computer gewinnen? \*\*\*\*\*\*

 For f = 0 To 8
 If Picture1(f).Picture Picture2.Picture And Picture1(f).Picture Picture3.Picture Then
 For i = 0 To 3
 If Len(g(f, i)) \> 0 Then
 If Picture1(Val(Left(g(f, i), 1))) = Picture2.Picture And Picture1(Val(Right(g(f, i), 1))) = Picture2.Picture Then
 Picture1(f).Picture = Picture2.Picture
 Label1.Caption = "Der Computer hat gewonnen!"
 Label1.Visible = True
 For j = 0 To 8
 Picture1(j).Enabled = False
 Next
 Timer1.Enabled = True
 Exit Sub
 End If
 End If
 Next
 End If
 Next

'\*\*\*\*\* Muß ein Sieg verhindert werden? \*\*\*\*\*\*

 For f = 0 To 8
 If Picture1(f).Picture Picture2.Picture And Picture1(f).Picture Picture3.Picture Then
 For i = 0 To 3
 If Len(g(f, i)) \> 0 Then
 If Picture1(Val(Left(g(f, i), 1))) = Picture3.Picture And Picture1(Val(Right(g(f, i), 1))) = Picture3.Picture Then
 Picture1(f).Picture = Picture2.Picture
 Exit Sub
 End If
 End If
 Next
 End If
 Next

'\*\*\*\*\*\*\*\* einen sinnvollen Zug machen \*\*\*\*\*\*\*\*\*\*

 m = ""
 For i = 0 To 8
 If Picture1(i).Picture Picture2.Picture And Picture1(i).Picture Picture3.Picture Then
 m = m + Trim(Str(i))
 End If
 Next

 If Len(m) = 0 Then
 Label1.Caption = "OK, noch einmal."
 Label1.Visible = True
 For j = 0 To 8
 Picture1(j).Enabled = False
 Next
 Timer1.Enabled = True
 Exit Sub
 End If

 w = 9
 If Len(l(Index)) \> 0 Then
 r = Int(Rnd(1) \* Len(l(Index))) + 1
 w = Val(Mid(l(Index), r, 1))
 End If

 If InStr(m, w) = 0 Then
 r = Int(Rnd(1) \* Len(m)) + 1
 w = Val(Mid(m, r, 1))
 End If

 If Len(m) \> 0 Then
 Picture1(w).Picture = Picture2.Picture
 End If
 End If
End Sub

Private Sub neu()
 For i = 0 To 8
 Picture1(i).Picture = LoadPicture()
 Next

 l(0) = "123468"
 l(1) = "0247"
 l(2) = "014568"
 l(3) = "0456"
 l(4) = "01235678"
 l(5) = "2348"
 l(6) = "023478"
 l(7) = "1468"
 l(8) = "024567"

 g(0, 0) = "12"
 g(0, 1) = "36"
 g(0, 2) = "48"
 g(0, 3) = ""
 g(1, 0) = "0,2"
 g(1, 1) = "4,7"
 g(1, 2) = ""
 g(1, 3) = ""
 g(2, 0) = "01"
 g(2, 1) = "58"
 g(2, 2) = "46"
 g(2, 3) = ""
 g(3, 0) = "06"
 g(3, 1) = "45"
 g(3, 2) = ""
 g(3, 3) = ""
 g(4, 0) = "08"
 g(4, 1) = "17)"
 g(4, 2) = "26"
 g(4, 3) = "35"
 g(5, 0) = "28"
 g(5, 1) = "34"
 g(5, 2) = ""
 g(5, 3) = ""
 g(6, 0) = "03"
 g(6, 1) = "24"
 g(6, 2) = "78"
 g(6, 3) = ""
 g(7, 0) = "14"
 g(7, 1) = "68"
 g(7, 2) = ""
 g(7, 3) = ""
 g(8, 0) = "04"
 g(8, 1) = "25"
 g(8, 2) = "67"
 g(8, 3) = ""

End Sub

Private Sub Timer1\_Timer()
 Timer1.Enabled = False
 For i = 0 To 8
 Picture1(i).Enabled = True
 Next
 neu
 Label1.Visible = False
End Sub

Bitte nicht zu sehr prügeln. :wink:

Gruß, Rainer

1 Like

Fehlerberichtigung
Hallo,
da hat sich ein Tippfehler eingeschlichen.

g(4, 1) = „17)“ muß natürlich
g(4, 1) = „17“ heißen.

Gruß, Rainer