Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
Vier gewinnt auswertung
mvenus
myCSharp.de - Member



Dabei seit:
Beiträge: 1

Themenstarter:

Vier gewinnt auswertung

beantworten | zitieren | melden

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;
                     }
                 }
             }
         }
     }
 }
 
 
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von mvenus am .
private Nachricht | Beiträge des Benutzers
chilic
myCSharp.de - Experte



Dabei seit:
Beiträge: 2111

beantworten | zitieren | melden

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?
private Nachricht | Beiträge des Benutzers
ClaraSoft
myCSharp.de - Member



Dabei seit:
Beiträge: 15

beantworten | zitieren | melden

Zitat von chilic
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;
        }
private Nachricht | Beiträge des Benutzers
Abt
myCSharp.de - Team

Avatar #avatar-4119.png


Dabei seit:
Beiträge: 15512
Herkunft: BW

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers