Zum Inhalt springen

4-Gewinnt Programmierung


Mr.T66

Empfohlene Beiträge

Hallo Leuts :).

Ich habe vor kurzem das Spiel 4-Gewinnt in C programmiert.

Bin noch im ersten Lehrjahr, und auf dem guten Wege, C zu erlernen. :D

Leider funktioniert es nicht so, wie ich gedacht habe.

So sieht meine Idee aus:

Ein Zweidimensionales Array gefüllt mit 0'en. Wenn Spieler 1 am Zug ist,

wird die gewählte Position mit einer 1 gefüllt, bei Spieler 2 mit einer 2.

Nach jedem Zug startet eine Gewinnüberprüfung, der das Array kompett durchgeht und guckt, ob eine 4er Reihe gefüllt ist.

Es klappt schon soweit, dass die Zahl in die unterste freie Position gelangt,

(wie üblich bei 4-Gewinnt).

Mein Problem:

Wenn ich eine Position auswähle, wird der Stein (1 oder 2) immer in das erste Feld geworfen, und die 0 füllt sich mit der eingegeben Zahl und nicht mit einer 1 oder einer 2. :rolleyes:

Im Anhang findet Ihr den Quelltext.

Wäre für jede Art von Hilfe dankbar.

4gewinnt.txt

Link zu diesem Kommentar
Auf anderen Seiten teilen

ich versteh c zwar nur aus meinen C++- und C#-Kenntnissen, aber das dürfte auch hier so sein:

In ueberpruefeundsetze() analysierst du zwar die Eingabe, ob sie im erlaubten Bereich ist, verwendest sie dann aber nicht, um die Spalte auszuwählen, da hast du die Variable X. Ich denke mal, dass du deshalb immer den Stein in der ersten Spalte bekommst. Warum du allerdings nicht den Stein, sondern deine Eingabe ins Feld bekommst, hab ich auf die Schnelle nicht gefunden, wahrscheinlich schreibst du irgentwo ausversehen deine Eingabe in Spielstein, das hab ich dann aber auch übersehen.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Zuweisungen mit =

Vergleiche mit ==

Diesbzüglich solltest du den gesamten Code nochmal durchgehen ;)

Um solche Fehler zu vermeiden hilft es sich anzugewöhnen links vom == Operator den Wert und rechts die Variable zu schreiben wenn man nicht 2 Variablen miteinander vergleichen will.

Denn bei if (5 = myInt) bekommt man im gegesatz zu if (myInt = 5) einen Compilerfehler

Link zu diesem Kommentar
Auf anderen Seiten teilen

  • 2 Wochen später...

Zwar ist das Thema schon 10 Tage alt, trotzdem möcht ich mal mein Senf dazugeben ;D

Hallo Leuts :).

...

Nach jedem Zug startet eine Gewinnüberprüfung, der das Array kompett durchgeht und guckt, ob eine 4er Reihe gefüllt ist.

Es klappt schon soweit, dass die Zahl in die unterste freie Position gelangt,

(wie üblich bei 4-Gewinnt).

...

1.


if (iaktuellerspieler == 1)
{
stein == '1';
}
if (iaktuellerspieler == 2)
{
stein == '2';
}[/PHP]

Klar ist ja schon wbezgülich dem Vergleich (==) und der Zuweisung (=) Jedoch ist mir aufgefallen:

stein ist doch int. warum gibst du ihm dann den ascii Wert von der Nummer? Ich rate dir das etwas einheitlicher zu machen: Mach am besten das ganze Brett als 2D-Chararray.

Nur so reine Anregungen:

Mach doch ein globales Array bezüglich Steinnummern:

[PHP]char csteinspieler[2] = {'1','2'};

dann kannst du beim seitzen wie folgt machen:

void ueberpruefeundsetze()
{
x = ieingabe;
if ((ieingabe < 1) || (ieingabe > 7) || (ieingabe == 0)) //Eingabe�berpr�fung
{
printf("\nUngueltiger Zug.Bitte erneut eingeben!");
eingabe();
}
for (y=6; y>0; y--)
{
if (iSpielfeld[x][y] == 0) //Das ist dafür da, dass der Stein auf die unterste Position im Array kommt, die mit einer 0 belegt ist.
{ // da so, die Spielregeln von 4 gewinnt ist.
iSpielfeld[x][y] == csteinspieler[iaktuellerspieler-1];
system("cls");
zeigespielfeld();
}
}
gewinnabfrage();
}[/PHP]

Weitere Anregung

Warum gleich das ganze Array abprüfen? Überprüf doch einfach die 5 Möglichkeiten, die der aktuelle Stein "hervorruft"?

So in etwa (mal dahingschreibselt ;) ):

[PHP]void gewinnabfrage()
{

//Prüfe alle X-Linie
if(x > 2)
{
for(int i = 1; i < 4; i++)
{
if(iSpielfeld[x][y] != iSpielfeld[x-i][y])
break;
}
igewinn = true;
}
if(x < 3)
{
for(int i = 1; i < 4; i++)
{
if(iSpielfeld[x][y] != iSpielfeld[x+i][y])
break;
}
igewinn = true;
}

//Prüfe Y-Linie
if(y < 4)
{
for(int i = y; i > x-4; i++)
{
if(iSpielfeld[x][y] != iSpielfeld[x][i])
break;
}
igewinn = true;
}

//Prüfe Diagonalen
if(y < 4 && x > 2)
{
for(int i = 1; i <= 3; i++)
{
if(iSpielfeld[x][y] != iSpielfeld[x-i][y-i])
break;
}
igewinn = true;
}
if(y < 4 && x < 3)
{
for(int i = 1; i <= 3; i++)
{
if(iSpielfeld[x][y] != iSpielfeld[x+i][x-i])
break;
}
igewinn = true;
}
}

Kann Fehler haben aber auch weil ich das ma hingeklatschd hab.

Alle Angaben ohne Gewehr (*PENG*)

Link zu diesem Kommentar
Auf anderen Seiten teilen

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...