myCSharp.de - DIE C# und .NET Community
Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 
 | Suche | FAQ

» Hauptmenü
myCSharp.de
» Startseite
» Forum
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Suche
» Regeln
» Wie poste ich richtig?
» Forum-FAQ

Mitglieder
» Liste / Suche
» Wer ist wo online?

Ressourcen
» openbook: Visual C#
» openbook: OO
» Microsoft Docs

Team
» Kontakt
» Übersicht
» Wir über uns

» myCSharp.de Diskussionsforum
Du befindest Dich hier: Community-Index » Diskussionsforum » Entwicklung » Code-Reviews » Vier gewinnt auswertung
Letzter Beitrag | Erster ungelesener Beitrag Druckvorschau | Thema zu Favoriten hinzufügen

geschlossen (weitere Infos)
Zum Ende der Seite springen  

Vier gewinnt auswertung

 
Autor
Beitrag « Vorheriges Thema | Nächstes Thema »
mvenus
myCSharp.de-Mitglied

Dabei seit: 21.01.2021
Beiträge: 1


mvenus ist offline

Vier gewinnt auswertung

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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

C#-Code:
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 21.01.2021 23:13.

Neuer Beitrag 21.01.2021 18:06 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
chilic
myCSharp.de-Poweruser/ Experte

Dabei seit: 12.02.2010
Beiträge: 2.062


chilic ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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?
Neuer Beitrag 21.01.2021 18:31 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
ClaraSoft
myCSharp.de-Mitglied

Dabei seit: 23.03.2020
Beiträge: 9


ClaraSoft ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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.

C#-Code:
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;
        }
Neuer Beitrag 21.01.2021 22:58 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Abt
myCSharp.de-Team

avatar-4119.png


Dabei seit: 20.07.2008
Beiträge: 14.472
Herkunft: BW


Abt ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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.
Neuer Beitrag 21.01.2021 23:27 Beiträge des Benutzers | zu Buddylist hinzufügen
Baumstruktur | Brettstruktur       | Top 
myCSharp.de | Forum
geschlossen (weitere Infos)


© Copyright 2003-2021 myCSharp.de-Team | Impressum | Datenschutz | Alle Rechte vorbehalten. | Dieses Portal verwendet zum korrekten Betrieb Cookies. 23.01.2021 15:26