Seite 16 von 16

Re: Wäre es nicht mal wieder an der Zeit...

Verfasst: 21.04.2012 22:29
von NicTheQuick
Was haltet ihr davon? Aber bevor es los geht, könnten wir noch darüber diskutieren, ob nicht vielleicht statt "-", "+" und "|" nicht doch besser andere schöne ASCII-Zeichen von Nöten wären. Ich bin gerade nur zu faul die heraus zu suchen.

Steuerung über W, A, S, D für den Cursor, Leertaste zum Setzen und Q zum Beenden.

Mir ist sonst grad nichts besseres für PureGolf eingefallen.

Regeln wie gehabt:
1. EnableExplicit muss bleiben.
2. Von außen her muss alles exakt gleich aussehen und reagieren.
3. Die Summe der Längen aller Zeilen nach Anwenden von Trim() sind ausschlaggebend.
4. Ich glaub sonst gab's nix.

Code: Alles auswählen

EnableExplicit

Enumeration
	#Empty
	#Circle
	#Cross
EndEnumeration

Dim Field(2, 2)

Procedure drawField(Array Field.i(2), curRow.i, curCol.i, lastAction.i, winner.i, curPlayer.i)
	Protected row.i, col.i, s.s
	ClearConsole()
	ConsoleLocate(1, 1)
	ConsoleColor(7, 0)
	PrintN("   |   |")
	PrintN("   |   |")
	PrintN("   |   |")
	PrintN("---+---+---")
	PrintN("   |   |")
	PrintN("   |   |")
	PrintN("   |   |")
	PrintN("---+---+---")
	PrintN("   |   |")
	PrintN("   |   |")
	PrintN("   |   |")
	
	If ((ElapsedMilliseconds() - lastAction) / 500) % 2 = 0 And winner = -1
		If Field(curRow, curCol) <> #Empty
			ConsoleColor(4, 0)
		EndIf
		ConsoleLocate(curCol * 4 + 1, curRow * 4 + 1)
		Print("---")
		ConsoleLocate(curCol * 4 + 1, curRow * 4 + 2)
		Print("| |")
		ConsoleLocate(curCol * 4 + 1, curRow * 4 + 3)
		Print("---")
	EndIf
	
	ConsoleColor(15, 0)
	
	For row = 0 To 2
		For col = 0 To 2
			ConsoleLocate(col * 4 + 2, row * 4 + 2)
			Select Field(row, col)
				Case #Circle
					Print("O")
				Case #Cross
					Print("X")
			EndSelect
		Next
	Next
	
	ConsoleLocate(13, 2)
	If winner <> -1
		If winner = #Circle
			s = "O"
		ElseIf winner = #Cross
			s = "X"
		EndIf
		Print(s + " hat gewonnen!")
		ConsoleLocate(13, 3)
		Print("Nochmal? (J/N)")
	Else
		If curPlayer = 0
			s = "O"
		ElseIf curPlayer = 1
			s = "X"
		EndIf
		Print(s + " ist am Zug.")
	EndIf
EndProcedure

Procedure resetField(Array Field.i(2))
	Protected row.i, col.i
	For row = 0 To 2
		For col = 0 To 2
			Field(row, col) = #Empty
		Next
	Next
EndProcedure

Procedure checkWin(Array Field.i(2))
	Protected content.i, row.i, col.i
	
	For row = 0 To 2
		content = Field(row, 0)
		If Field(row, 1) = content And Field(row, 2) = content And content <> #Empty
			ProcedureReturn content
		EndIf
	Next
	For col = 0 To 2
		content = Field(0, col)
		If Field(1, col) = content And Field(2, col) = content And content <> #Empty
			ProcedureReturn content
		EndIf
	Next
	content = Field(0, 0)
	If Field(1, 1) = content And Field(2, 2) = content And content <> #Empty
		ProcedureReturn content
	EndIf
	content = Field(2, 0)
	If Field(1, 1) = content And Field(0, 2) = content And content <> #Empty
		ProcedureReturn content
	EndIf
	
	ProcedureReturn -1
EndProcedure

Define curCol.i = 0, curRow.i = 0
Define input.s
Define curPlayer.i = 0
Define lastAction.i = ElapsedMilliseconds()
Define winner.i

If OpenConsole()
	EnableGraphicalConsole(1)
	ConsoleCursor(0)
	
	resetField(Field())
	
	Repeat
		drawField(Field(), curRow, curCol, lastAction, winner, curPlayer)
		Delay(50)
		input.s = Inkey()
		If input
			lastAction = ElapsedMilliseconds()
		EndIf
		winner = checkWin(Field())
		If winner = -1
			Select input
				Case "q"
					Break
				Case " "
					If Field(curRow, curCol) = #Empty
						If curPlayer = 0
							Field(curRow, curCol) = #Circle
							curPlayer = 1
						Else
							Field(curRow, curCol) = #Cross
							curPlayer = 0
						EndIf
					EndIf
				Case "w"
					curRow = (curRow + 2) % 3
				Case "a"
					curCol = (curCol + 2) % 3
				Case "s"
					curRow = (curRow + 1) % 3
				Case "d"
					curCol = (curCol + 1) % 3
			EndSelect
		Else
			Select input
				Case "n"
					Break
				Case "j"
					resetField(Field())
					curPlayer = 0
			EndSelect
		EndIf
	ForEver
EndIf

Re: Wäre es nicht mal wieder an der Zeit...

Verfasst: 21.04.2012 22:52
von ts-soft
Wie wäre es, wenn wir den Initial-Source ganz weglassen, stattdessen eine sehr genaue Beschreibung, was
Pflicht ist. Sollte bei Tic Tac To ja nicht so viel sein. So kann man den Source des Vorposters nutzen, oder
was ganz eigenes Erstellen. Dann wird sich zum Schluß rausstellen, welche GUI, Console, Window oder Screen usw.
am effektivsten ist.

Nur so als Vorschlag, damit das ganze mehr Pepp hat :mrgreen:

Re: Wäre es nicht mal wieder an der Zeit...

Verfasst: 21.04.2012 23:23
von STARGÅTE
Also ich weiß nicht.
Ich finde eigentlich alles schlecht, was man selbst "ausprobieren" muss.
Damit meine ich, in muss bei TicTacToe immer selber alle möglichen variationen testen, um festzustelen ob meine Kürzung legal war oder nicht.
Es wäre viel einfacher wenn die Aufgabe statisch ist und nur Zeichenkette oder einem Bild besteht.
So kann das Resultat immer exakt zu 100% verglichen werden und falscher Code eindeutig rausgeschmissen werden.

Natürlich sollte dann die Ausgabe in der Datenmenge (länge des Strings, größe des Bild) größer sein, als der Code selbst, sonst kann man die Ausgabe ja einfach ausgeben ^^

Re: Wäre es nicht mal wieder an der Zeit...

Verfasst: 22.04.2012 03:00
von CSHW89
Nur ne Idee: Wie wäre es denn mit der Permutation eines Strings. Ab der Länge 5 (120 Strings á 5 Zeichen) sollte auch die Bedingung von Stargate, Lösung nicht einfach eintippen zu können, erfüllt sein. Außerdem kann man die Korrektheit leicht ablesen, und mögliche Lösungswege gibt es auch ein paar.

lg Kevin

Re: Wäre es nicht mal wieder an der Zeit...

Verfasst: 22.04.2012 14:17
von NicTheQuick
CSHW89 hat geschrieben:Nur ne Idee: Wie wäre es denn mit der Permutation eines Strings.
Die Sache ist eben ziemlich einfach und ist nach kurzer Zeit schon sehr klein auf das Wesentliche zu kürzen. Es sollte vielleicht schon einen Tick komplexer sein als Kombinatorik oder Fraktalerzeugung. Aber ich bin da auch nicht gerade kreativ.

Re: Wäre es nicht mal wieder an der Zeit...

Verfasst: 22.04.2012 17:07
von NicTheQuick
NicTheQuick hat geschrieben:
7x7 hat geschrieben:
c4s hat geschrieben:@7x7
Trotzdem wird doch kein größeres Array benötigt?! Bitte erklären. :o
Eigentlich...hast Recht! :mrgreen:

Hatte nämlich in einer früheren Phase auch schon mal diesen Gedanken, aber wieder verworfen aus o.g.Gründen. Hatte
aber nicht überrissen, dass der Brainfuck-Code davon gar nicht tangiert wird.

Also, wenn sonst niemand Einwände hat, passt's :D
Ich hab einen Einwand. Natürlich kann man einen Brainfuck-Code mit Schleifen schreiben, der auf mehr Speicherzellen zugreift als er lang ist. Es muss nur > öfter aufgerufen werden als der Code lang ist. Dafür habe ich nur gerade keinen Code da.
Hier übrigens ein Brainfuck-Code der so viele Zellen braucht wie das Zeichen als ASCII-Code hat, das man am Anfang eingegeben hat.

Code: Alles auswählen

,-[>[-]<[>+<-]>.-]
:wink:

Oder ohne Eingabe:

Code: Alles auswählen

-[>[-]<[>+<-]>.-]

Re: Wäre es nicht mal wieder an der Zeit...

Verfasst: 05.05.2012 17:29
von RSBasic
Wie siehts denn jetzt aus? Gibt es keine weiteren Spiele mehr?

Re: Wäre es nicht mal wieder an der Zeit...

Verfasst: 05.05.2012 17:45
von ts-soft
RSBasic hat geschrieben:Wie siehts denn jetzt aus? Gibt es keine weiteren Spiele mehr?
Naja, wenn dann richtig :mrgreen:
Also Regeln erstellen, Juroren festlegen, Sponsoren finden usw.

Hau rein und warte nicht, bis sich hier jemand einig ist, das wird nie geschehen.

Re: Wäre es nicht mal wieder an der Zeit...

Verfasst: 05.05.2012 18:06
von 7x7
Ich mache mit 8)

Vielleicht irgendwie zur EM passend ein Fussballthema (bots)? Wäre schon cool, 2x 11 bots den ball ins tor treiben lassen... :bounce:

Re: Wäre es nicht mal wieder an der Zeit...

Verfasst: 05.05.2012 21:04
von WPö
7x7 hat geschrieben:Vielleicht irgendwie zur EM passend ein Fussballthema (bots)? Wäre schon cool, 2x 11 bots den ball ins tor treiben lassen...
Klar, und Du sitzt auf der Ersatzbank und schaust zu. :lol:

Gruß - WPö