C 4 Gewinnt in C programmieren

Zeus22

Cadet 4th Year
Registriert
Okt. 2007
Beiträge
119
Hallo Leute
Ich habe gerade ein Problem.
Und zwar muss ich für die Berufsschule ein 4 Gewinnt in C Programmieren.
Da es schon einige Zeit her ist das wir zuletzt in C programmiert haben schwimme ich gerade ein bisschen.
Angefangen schon beim Spielfeld.
Ich dachte ich bau es in etwa so auf:

1234567
| | | | | | |
A-0000000
B-0000000
C-0000000
D-0000000
E-0000000
F-0000000
Dachte es ist am einfachsten wen ich es wie ein Schachfeld nummerier das z.B. das oberste Feld ganz Links A1 das rechts daneben A2 usw.

Als Spielsteine dachte ich, ich mache es brachial einfach und nehme einfach für Spieler 1 die 1 und für Spieler 2 die 2.

Die Idee hinter dem Spielfeld ist das der Spieler der gerade am Zug ist sich für ein Feld entscheiden kann und dann die 0 im Spielfeld durch seinen Spielstein ersetzt wird.
Zum Beispiel wen Spieler 1 sich für das Feld F1 entscheidet wird die 0 im untersten Feld ganz Links durch eine 1 ersetzt.

Jetzt ist meine grosse Frage wie baue ich das Feld am besten auf?
Den ich denke mal mit printf geht es nicht das ich es nachher so überprüfen kann wie geplant.
Bin für jeden Hinweis, Tipp, usw. dankbar der mich der Vollendung des Spieles näher bringt.

Mit freundlichen Grüßen
Zeus
 
Ich denke am einfachsten ist es ein zweidimensionales Array zu verwenden. (http://www.win-tux.de/c_013_008.htm#RxxobKap0130080400284D1F03A18C). Deine Idee mit 0 und 1 ist nicht schlecht, man könnte aber genauso eine boolsche Variable nutzen die es erlaubt true und false zu setzen. Allerdings solltest du dann bei den Abfragen aufpassen dass du nicht durcheinander kommst, wenn du überprüfst ob 4 Spielsteine/Spielelemente in einer Reihe sind oder nicht.

Ansonsten mach dir erstmal klar wie du auf die einzelnen Felder im mehrdimensionalen Array kommst und wie du überprüfen kannst ob sich 4 Steine in einer Reihe befinden.

Wenn du nicht weiterkommst, nochmal fragen... Aber versuchs wirklich erstmal selbst zu coden, mit System, also Blatt Papier raus und malen anfangen und nicht gleich irgendeinen Code in den Rechner hacken.
 
Ich würde die höhe des Feldes nummerieren, und dann kannst du einfach die Spalten zählen lassen. Wie oft sie gesammt gespielt wurden und wie oft wann von wem solltest du ja mit extra Countern auch zählen können. Allerdings bräuchtest du dann auch nen allgo zum diagonal auswerten.
 
Und auf den Algorithmus zum DIagonalen auswerten kommt man ganz leicht mit beispielhaftem aufzeichnen und den zugehörigen Koordinaten. Da fällt einem schon was auf.Das geht auch ganz einfach im 1-dim array.
 
So hab mal was zusammen programmiert hatte heute gerade ein bisschen Zeit auf der Arbeit.

Ist noch nicht vollständig und die Überprüfung ist bis jetzt erst Waagrecht und Senkrecht.

Allerdings kann mir vielleicht jemand bei meinem Problem mit dem Spielfeld helfen.
Das Problem ist irgendwie wird nicht die richtige Grösse generiert.
4 Gewinnt hat ja 7 Spalten und 6 Zeilen aber irgendwie will das noch nicht ganz wie es sollte.

@Firestorm-

zweidimensionales Array war das Stichwort das ich gebraucht habe^^
Danke

Und natürlich auch ein herzlichen Dank an den Rest der hier gepostet hat.

mfg
Zeus

Code:
// 4 Gewinnt.cpp : Definiert den Einstiegspunkt für die Konsolenanwendung.
//

#include "stdafx.h"
#include <stdlib.h>

char spielfeld [6][7]; // 1. Dim: Zeile, 2. Dim: Spalte
char zeichen;

int init (void) // initialisieren des Spielfeldes
{
	int x; //x = zeile
	int y; //y = spalte
	for (x = 0; x < 6; x++)
		for (y = 0; y < 5; y++)
			spielfeld [x][y] ='0'; //Spielfeld wird mit dem Zeichen 0 erstellt.
	return 0;
}

int zeile (void) //abfrage der Zeilennummer vom Spieler.
{
	int x;
	printf ("Zeile: ");
	scanf ("%d", &x);
	return x;
}

int spalte (void) //abfragen der Spaltennummer vom Spieler.
{
	int y;
	printf ("Spalte: ");
	scanf ("%d", &y);
	return y;
}

int ergebniss(int sp) //berechnung ob jemand gewonnen hat. Allerdings wird die Diagonale noch nicht überprüft.
{
	char zeichnen; //Variabel zum speicher des Zeichen vom Spieler. Spieler 1 = A und Spieler 2 = B.
	int i, j, r = 0;
	if(sp < 0) //Der Variabel zeichen wird das richtige Zeichen zugeordnet.
		zeichen = 'A';
	else
		zeichen = 'B';
	for(j=0; j<6; j++) //Spielfeld wird zeilenweise durchsucht ob vier aneinander hängende A oder B vorkommen.
	{
		if(r<4)
			r=0;
		for (i=0; i<6;i++)
		{
			if(spielfeld[i][j] == zeichen)
				r++;
			else if (r<4)
				r=0;
		}
	}
	for(j=0; j<7; j++) //Spielfeld wird spaltenweise durchsucht ob vier aneinander hängende A oder B vorkommen.
	{
		if(r<4)
			r=0;
		for (i=0; i<7; i++)
		{
			if(spielfeld [j][i] == zeichen)
				r++;
			else if(r<4)
				r=0;
		}
	}
	return r;
}

int ausgabe(int i, int j, int sp)
{
	int a;
	int b;

	if(sp<0)
		spielfeld [i][j] = 'A';
	if(sp>0)
		spielfeld [i][j] = 'B';
	printf("\n");
	for (a=0; a<7; a++)
	{
		printf("\n");
		for (b=0; b<7; b++)
			printf(" %c", spielfeld [a][b]);
	}
	return 0;
}


int main(void)
{
	int runde = 42; //42 ergibt sich aus der maximal Anzahl Felder die das Spielfeld hat. 7*6=42.
	int i;
	int j;
	int spieler=1; //Diese Variabel gibt den aktuellen Spieler an. 1 steht für Spieler B (=Spieler 2) und -1 steht für Spieler A (=Spieler 1).
	init();

	printf("4 Gewinnt\n"); //Titel
	printf("---------\n\n");
	printf("Info:\n Spieler1 hat den Spielstein A und Spieler 2 hat den Spielstein B.\n Spieler 1 beginnt.\n\n");

	printf("Spielfeldaufbau:\n\n"); //Aufbau des Spielfeldes und wie die Zeilen und Spalten beziefert sind.

	printf ("      S p a l t e n\n");
	printf ("      0 1 2 3 4 5 6 \n");
	printf ("      | | | | | | |\n");
	printf (" Z 0- 0 0 0 0 0 0 0\n");
	printf (" e 1- 0 0 0 0 0 0 0\n");
	printf (" i 2- 0 0 0 0 0 0 0\n");
	printf (" l 3- 0 0 0 0 0 0 0\n");
	printf (" e 4- 0 0 0 0 0 0 0\n");
	printf (" n 5- 0 0 0 0 0 0 0\n\n");


	while((runde>0) && (ergebniss(spieler) <4)) //Das Spiel läuft so lange bis alle 42 Felder besetzt sind oder ein Spieler gewonnen hat.
	{
		i =zeile();
		j =spalte();
		spieler *= -1;
		ausgabe(i, j, spieler);
		printf("\n");
		runde--;
	}
	if(runde>0)
		printf("Sieg!!!\n"); //Hat ein Spieler gewonnen so erschein diese Meldung.
	

    system("pause"); //damit sich das Programm nicht selber beendet wen das Spiel fertig ist.
	return 0;
}
 
Du weißt offensichtlich gar nicht wie 4 gewinnt geht :D

Man wirft oben die Steine rein und die fallen dann nach unten.
Du darft den Spieler nicht die Zeile auswählen lassen, sondern nur die Spalte!

Edit:
Dein Fehler liegt im Init, du hast dort 5 statt 7 Felder Initialisiert!

Gruß
BlackMark
 
Zuletzt bearbeitet:
BlackMark schrieb:
Du weißt offensichtlich gar nicht wie 4 gewinnt geht :D

Man wirft oben die Steine rein und die fallen dann nach unten.
Du darft den Spieler nicht die Zeile auswählen lassen, sondern nur die Spalte!

Edit:
Dein Fehler liegt im Init, du hast dort 5 statt 7 Felder Initialisiert!

Gruß
BlackMark

OK 1. danke werde ich gleich mal ausprobieren

und 2. Ich weiss schon wie es geht ^^

aber wie gesagt ist mal ein anfang und mehr hab ich bis jetzt nicht hin gekriegt.
Ist zu meinem Glück auch nicht unbedingt vom Lehrer gefordert er sagte nur währe ein nettes Feature.

Cheers
Zeus
 
Ok dann viel Spaß beim Coden!

P.S.: Ein Computer gegen den man Spielen könnte wäre auch noch ein nettes Feature, dass der einfach zufällig irgend wo hin setzt xD

Gruß
BlackMark
 
Es wäre besser wenn du das ganze objektorientierter machen würdest. So hast du nachher unter Umständen die Möglichkeit das Spielfeld leichter in seiner Größe zu beeinflussen. Abgesehen davon, dass 4-Gewinnt auf der Spielfeldgröße, die festgelegt ist, aufbaut, ist es dennoch ein nettes Feature.
 
Seit wann kann man denn in C Objektorientiert programmieren?

Aber wenn man es in C++ machen würde, wäre dass Objektorientiert natürlich keine schlechte Idee.

Gruß
BlackMark
 
Zuletzt bearbeitet:
BlackMark schrieb:
Seit wann kann man denn in C Objektorientiert programmieren?
Schon immer. Auch wenn nirgendwo class steht, kann ein Programm trotzdem objektorientiert sein (schau die mal die FILE-Schnittstelle an). Und andersrum ist ein Programm mit Klassen noch lange nicht objektorientiert.
Man kann auch jedes C++-Programm in ein C-Programm überführen. Das war unter Unixen jahrelang gängige Praxis (C++ Compiler erzeugt C-Code und wirft danach den Plattformcompiler an). Wenn Du wissen willst, wie das geht, schau dir "Inside the C++ object model" von Stanley B. Lippman an.
 
Zuletzt bearbeitet:
Sagen wir es einmal so, man kann mit C objektorientiert programmieren, aber C ist keine objektorientierte Sprache und stellt deshalb nicht die klassischen Schlüsselwörter zur Verfügung. Man muss einige Tricks und Kniffe anwenden, um mit C objektorientierte Programme schreiben zu können. In der Regel ist das nicht sonderlich sinnvoll.
 
Ok ich wusste nicht, dass man mit Tricks auch in C objektorientierte Programme schreiben kann, man lernt ja nie aus xD.

Aber trotzdem würde ich wenn ich objektorientiert Programmieren will C++ hernehmen und nicht C!

Gruß
BlackMark
 
BlackMark schrieb:
Ok ich wusste nicht, dass man mit Tricks auch in C objektorientierte Programme schreiben kann, man lernt ja nie aus xD.

Du kannst auch mit einem Schraubenschlüssel einen Nagel in die Wand schlagen. Ob das nun sonderlich sinnvoll ist und ein Hammer diese Aufgabe nicht effizienter lösen könnte, sei mal dahingestellt.
 
@FreddyMercury: Ich habe nie gesagt, dass man für ein 4 Gewinnt C++ braucht oder verwenden sollte.
Ich habe nur gesagt, dass ich nur in C++ objektorientiert Programmieren würde und nicht in C!

Für das lernen von OOP gibt es auch bessere Übungen als das Programmiren von 4 gewinnt.
Aber darum gehts ja hier auch nicht.

Gruß
BlackMark
 
FreddyMercury schrieb:
Fuer ein 4 gewinnt in einer konsole braucht man aber kein C++. Alleine schon der Aufwand dazu lohnt sich nicht.

Das ist hinten und vorne falsch! Zum Einen ist der Begriff "braucht" schon sehr naiv, weil ich mit jeder turingmächtigen Programmiersprache dieses Spiel programmieren kann, zum Anderen kann man mit C++ den Code reduzieren, weil man auf viele vorgefertigte Funktionen, vor allem hinsichtlich der STL, zurückgreifen kann.

Der von die angesprochene Aufwand dürfte in C++ also noch geringer sein, als in C. Ganz zu schweigen von der Tatsache das C ein Subset von C++ ist.

Eine Programmiersprache wählt man aus bestimmten Gründen aus. Man bevorzugt C gegenüber C++ oft dann, wenn kein C++-Compiler zur Verfügung steht oder man kein C++ beherrscht.
 
Zurück
Oben