Laden...

Vier gewinnt auswertung

Erstellt von mvenus vor 3 Jahren Letzter Beitrag vor 3 Jahren 2.239 Views
Thema geschlossen
M
mvenus Themenstarter:in
1 Beiträge seit 2021
vor 3 Jahren
Vier gewinnt auswertung

Hallo zusammen,

ich habe heute mein erstes kleines C#-Programm geschrieben.
Da ich noch sehr neu in der OOP im allgemeinen bin, wollte ich mal fragen, was ihr für Verbesserungsvorschläge habt 😃

Es handelt sich um die Auswertung eines "Vier Gewinnt" Spielfelds. Hier soll geprüft werden, ob es einen Gewinner gibt und wenn ja, welcher Spieler es ist.

Ich würde mich über konstruktive Kritik freuen 😃 Vielen Dank!

LG


 using System;
 using System.Collections.Generic;
 using System.Linq;
 using System.Text;
 using System.Threading.Tasks;
 
 namespace VierGewinnt
 {
     class Program
     {
         static void Main()
         {
             // Beispiel
             int[,] board = new int[6, 7] {
                 { 0, 0, 0, 0, 0, 0, 0 },
                 { 0, 0, 0, 0, 0, 0, 0 },
                 { 0, 2, 0, 0, 1, 0, 0 },
                 { 1, 2, 1, 1, 2, 1, 1 },
                 { 1, 2, 1, 2, 2, 1, 2 },
                 { 1, 1, 2, 1, 1, 1, 2 }
               };
 
             VierGewinnt game = new VierGewinnt(board);
 
             if (game.GameEnded)
             {
                 Console.WriteLine("Gewinner ist Spieler " + game.Winner + ".");
             }
             else
             {
                 Console.WriteLine("Es gibt (noch) keinen Gewinner.");
             }            
 
             Console.ReadKey();
         }
     }
 
     class VierGewinnt
     {
         // Board kann mit einem beliebig großem Array befüllt werden. 0 steht für nicht belegte Felder. 1 bzw. 2 symbolisiert die belegten Felder durch die einzelnen Spieler.
         public int[,] Board { get; set; }
         public int Winner { get; set; }
         public bool GameEnded { get; set; }
 
         public VierGewinnt(int[,] _board)
         {
             Board = _board;
             CheckForWinner();
         }
 
        
         // Ermittelt den Gewinner des Spiels (falls vorhanden)    
         private void CheckForWinner()
         {
             int boardWidth = Board.GetLength(0);
             int boardHeight = Board.GetLength(1);
 
             // Prüfung der Horizontalen 
             for (int y = 0; y < boardHeight - 3; y++)
             {
                 for (int x = 0; x < boardWidth; x++)
                 {
                     int currPlayer = Board[x, y];
                     if (Board[x, y] != 0 && Board[x, y + 1] == currPlayer && Board[x, y + 2] == currPlayer && Board[x, y + 3] == currPlayer)
                     {
                         GameEnded = true;
                         Winner = currPlayer;
                     }
                 }
             }
 
             // Prüfung der Vertikalen
             for (int x = 0; x < boardWidth - 3; x++)
             {
                 for (int y = 0; y < boardHeight; y++)
                 {
                     int currPlayer = Board[x, y];
                     if (Board[x, y] != 0 && Board[x + 1, y] == currPlayer && Board[x + 2, y] == currPlayer && Board[x + 3, y] == currPlayer)
                     {
                         GameEnded = true;
                         Winner = currPlayer;
                     }
                 }
             }
 
             // Pfrüfung der Diagonalen (aufsteigend)
             for (int x = 3; x < boardWidth; x++)
             {
                 for (int y = 0; y < boardHeight - 3; y++)
                 {
                     int currPlayer = Board[x, y];
                     if (Board[x, y] != 0 && Board[x - 1, y + 1] == currPlayer && Board[x - 2, y + 2] == currPlayer && Board[x - 3, y + 3] == currPlayer)
                     {
                         GameEnded = true;
                         Winner = currPlayer;
                     }
                 }
             }
 
             // Prüfung der Diagonalen (absteigend)
             for (int x = 3; x < boardWidth; x++)
             {
                 for (int y = 3; y < boardHeight; y++)
                 {
                     int currPlayer = Board[x, y];
                     if (Board[x, y] != 0 && Board[x - 1, y - 1] == currPlayer && Board[x - 2, y - 2] == currPlayer && Board[x - 3, y - 3] == currPlayer)
                     {
                         GameEnded = true;
                         Winner = currPlayer;
                     }
                 }
             }
         }
     }
 }
 
 
C
2.121 Beiträge seit 2010
vor 3 Jahren

Nachdem du einen Gewinner ermittelt hast, könntest du aus der Prüfmethode heraus springen.

Die Variablen initialisieren wäre kein Schaden. Wird nicht sogar angemeckert dass die keinen eindeutigen Wert bekommen?

Zur Prüfung an sich fällt einem sicherlich das ein oder andere ein.
Zum Beispiel könntest du eine Zeile (Spalte, Diagonale) komplett durchlaufen, dir merken wie viele gleiche Farben du bis zur aktuellen Position schon hintereinander gefunden hast und wenns die vierte mit gleicher Farbe ist, ist das Spiel zu Ende.
Aber ob sich das in der Praxis tatsächlich lohnt?

C
55 Beiträge seit 2020
vor 3 Jahren

Zum Beispiel könntest du eine Zeile (Spalte, Diagonale) komplett durchlaufen, dir merken wie viele gleiche Farben du bis zur aktuellen Position schon hintereinander gefunden hast und wenns die vierte mit gleicher Farbe ist, ist das Spiel zu Ende.

In meinen Vier gewinnt Spiel, zähle ich die gefunden Steine. Sind 4 gefunden springe ich raus.
Den Counter zurücksetzen tue ich nach jeder Spalte oder wenn ich eine andere Farbe gefunden habe

Hier meine umsetzung für den Vertikal Check.


private GameStatus CheckVertical(FieldStatus coincolor, FieldStatus[,] fieldstatus)
        {
            int counter = 0;
            for (int col = 0; col <= 6 ; col++)
            {
                for (int row = 0; row <= 5; row++)
                {
                    if (fieldstatus[row, col] == coincolor)
                    {
                        counter++;
                    }
                    if (fieldstatus[row, col] != coincolor)
                    {
                        counter = 0;
                    }
                    if (counter == 4)
                    {
                        return GameStatus.GameFinished;
                    }
                }
                counter = 0;
            }
            return GameStatus.UserEnabled;
        }

16.806 Beiträge seit 2008
vor 3 Jahren

Hallo mvenus,

der Sinn eines Forums ist, dass Inhalte auch für die Nachwelt bestehen bleiben, was Du bei der Registrierung auch akzeptiert hast.
Du hast nach Hilfe und Feedback gefragt, bekommst das - und dann löscht Du Dein Beitragsinhalt. Ist das fair? Nein, ist es nicht.
Daher habe ich Deinen Beitrag "edited" auch wiederhergestellt und das Thema gesperrt.

Solltest Du weiter Interesse haben an dem Thema weiter zu machen, dann schreib uns eine PN.
Solange bleibt das Thema gesperrt.

Thema geschlossen