C# :: Aufgabe #40 :: Lösung #1

4 Lösungen Lösungen öffentlich
#40

4 Gewinnt für die Konsole

Anfänger - C# von Gustl - 05.01.2013 um 16:57 Uhr
Es soll 4 Gewinnt für die Konsole programmiert werden.
2 Spieler spielen gegeneinander, ohne Computergegner (ohne künstliche Intelligenz), spielen können.

Optional mit Computergegner, aber bitte in der Beschreibung dann angeben.
#1
vote_ok
von Process1 (1180 Punkte) - 10.01.2013 um 01:53 Uhr
Quellcode ausblenden C#-Code
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace _4Gewinnt {
    class Program {

        struct Spielfeld {
            // Das eigentliche Spielfeld
            public int[,] Feld;

            // Verbleibende Züge
            public int Züge;

            // Spieler, welcher am Zug ist
            public int Spieler;

            public bool GameOver;
        }

        static Spielfeld NeuesSpiel() {
            Spielfeld Spielfeld = new Spielfeld();
            Spielfeld.GameOver = false; 

            // 0 = frei, 1 = Spieler 1, 2 = Spieler 2
            Spielfeld.Feld = new int[6,7];

            for(int i = 0; i<6; i++)
            {
                for (int j = 0; j < 7; j++) {
                    Spielfeld.Feld[i, j] = 0; 
                } // for End
            } // for End

            Spielfeld.Züge = 22;
            Spielfeld.Spieler = 1;

            return Spielfeld;
        }

        static Spielfeld Zug(Spielfeld Spielfeld) {         

            // Spiefeld ausgeben
            Ausgabe(Spielfeld);

            while (true) {          
                   ConsoleKeyInfo k = Console.ReadKey();

                   // Falls Eingabe Zahl ist
                   if (char.IsDigit(k.KeyChar) && Convert.ToInt32(k.KeyChar) - 49 < 7 &&
                       Spielfeld.Feld[0,Convert.ToInt32(k.KeyChar) - 49] == 0) {

                       Spielfeld = SetzeStein(Spielfeld, Convert.ToInt32(k.KeyChar) - 49);
                       Spielfeld = GewinnBerechnung(Spielfeld, Convert.ToInt32(k.KeyChar) - 49);

                       Ausgabe(Spielfeld);
                       break;
                   } else {
                       Ausgabe(Spielfeld);
                   }  // else End                                         
              
            } // while End

            return Spielfeld;
        }

        static Spielfeld SetzeStein(Spielfeld Spielfeld, int spalte) {
            

            for (int i = 0; i < 5; i++) {
                if (Spielfeld.Feld[i + 1, spalte] != 0) {
                    Spielfeld.Feld[i, spalte] = Spielfeld.Spieler;    
                                   
                    // Nächster Spieler
                    if (Spielfeld.Spieler == 1) {
                        Spielfeld.Spieler = 2;
                    } else {
                        Spielfeld.Spieler = 1;
                    } // else End

                    return Spielfeld;
                } // if End
            } // for End

            Spielfeld.Feld[5, spalte] = Spielfeld.Spieler;

            // Nächster Spieler
            if (Spielfeld.Spieler == 1) {
                Spielfeld.Spieler = 2;
            } else {
                Spielfeld.Spieler = 1;
            } // else End

            return Spielfeld;
        }

        static void Ausgabe(Spielfeld Spielfeld) {
            Console.Clear();

            if (Spielfeld.Spieler == 1)
                Console.WriteLine("Spieler 1 ist an der Reihe!\n");
            else
                Console.WriteLine("Spieler 2 ist an der Reihe!\n");

            for (int i = 0; i < 6; i++) {
                for (int j = 0; j < 7; j++) {
                   Console.Write( Spielfeld.Feld[i, j]);
                } // for End
                Console.WriteLine();
            } // for End

            Console.WriteLine("\n\nWähle eine Spalte durch eingeben der Nummer(1-7) aus.");

            Console.SetCursorPosition(0, 8);            
        }

        static Spielfeld GewinnBerechnung(Spielfeld Spielfeld, int spalte) {
            int zeile = 0;

            // Zeile ermitteln
            for (int i = 0; i < 6; i++) {
                if (Spielfeld.Feld[i, spalte] != 0) {
                    zeile = i;
                    break;
                } // if End
            } // for End

            int e = spalte + 1;
           
            // Erster Stein von Links
            for (int i = spalte; Spielfeld.Feld[zeile, i] == Spielfeld.Feld[zeile, spalte] &&
                i > 0; i--) { 
                e--; 
            } // for End

            // Gewinn in einer Zeile?
            for (int i = e+1; i < e+4 && i < 7; i++) {
                if (Spielfeld.Feld[zeile, i] != Spielfeld.Feld[zeile, spalte]) {
                    break;
                } else if (i == e + 3) {
                    Spielfeld.GameOver = true;
                    return Spielfeld;
                } // else if End
            } // for End

            // Gewinn in einer Spalte?
            for (int i = 1; i < 5 && i+zeile < 6; i++) {
                if (Spielfeld.Feld[i+zeile, spalte] != Spielfeld.Feld[zeile, spalte]) {
                    break;
                } else if (i == 3) {
                    Spielfeld.GameOver = true;
                    return Spielfeld;
                } // else if End
            } // for End

            // Gewinn Diagonal?
            int diagonal = 1;
       
            for (int i = 1; i < 5 && spalte - i > 0 && zeile - i > 0; i++) {
                if (Spielfeld.Feld[zeile - i, spalte - i] == Spielfeld.Feld[zeile, spalte]) {
                    diagonal++;
                } else {
                    break;
                } // else End
            } // for End            

            for (int i = 1; i < 5 && spalte + i < 7 && zeile + i < 6; i++) {
                if (Spielfeld.Feld[zeile + i, spalte + i] == Spielfeld.Feld[zeile, spalte]) {
                    diagonal++;
                } else {
                    break;
                } // else End
            } // for End     

            if (diagonal >= 4) {
                Spielfeld.GameOver = true;
                return Spielfeld;
            } // if End

            diagonal = 1;

            for (int i = 1; i < 5 && spalte - i > 0 && zeile + i < 6; i++) {
                if (Spielfeld.Feld[zeile + i, spalte - i] == Spielfeld.Feld[zeile, spalte]) {
                    diagonal++;
                } else {
                    break;
                } // else End
            } // for End            

            for (int i = 1; i < 5 && spalte + i < 7 && zeile - i > 0; i++) {
                if (Spielfeld.Feld[zeile - i, spalte + i] == Spielfeld.Feld[zeile, spalte]) {
                    diagonal++;
                } else {
                    break;
                } // else End
            } // for End     

            if (diagonal >= 4) {
                Spielfeld.GameOver = true;
                return Spielfeld;
            } // if End

            return Spielfeld;
        }

        static void Main(string[] args) {
            // Neues Spielfeld 
            Spielfeld Spielfeld = NeuesSpiel(); 

            // Ausgabe
            Console.WriteLine("Willkommen bei 4 Gewinnt!\n\n"+
                "Um ein neues Spiel zu starten drücke eine beliebige Taste...");
            while (!Console.KeyAvailable) { }

            while (true) {
                Spielfeld = NeuesSpiel(); 

                while (!Spielfeld.GameOver) {
                    // 1 Zug setzen
                    Spielfeld = Zug(Spielfeld);

                } // while End
                Console.Clear();

                if (Spielfeld.Spieler == 1)
                    Console.Write("Spieler 2 hat gewonnen!");
                else
                    Console.Write("Spieler 1 hat gewonnen!");

                Spielfeld.GameOver = false;
                Console.Write("\n\n\nDrücke eine beliebige Taste um ein neues Spiel zu starten!");
                while (!Console.KeyAvailable) { }
            } // while End
        }
    }
}

Kommentare:

Für diese Lösung gibt es noch keinen Kommentar

Bitte melden Sie sich an um eine Kommentar zu schreiben.
Kommentar schreiben
2090940

Du scheinst einen AdBlocker zu nutzen. Ich würde mich freuen, wenn du ihn auf dieser Seite deaktivierst und dich davon überzeugst, dass die Werbung hier nicht störend ist.