C# :: Aufgabe #217 :: Lösung #4

4 Lösungen Lösungen öffentlich
#217

Programmierung von MasterMind

Anfänger - C# von hollst - 02.07.2018 um 10:54 Uhr
MasterMind ist ein deduktives Spiel, das insbesondere Anfang der 70er Jahre sehr beliebt war.
Ziel des Spiels ist es, einen Geheimcode zu entschlüsseln.

In der klassischen Variante ordnet ein Spieler, genannt "codemaker", eine Sequenz von vier Symbolen
geheim an. Praktisch geschieht dies mittels unterschiedlich oder teilweise bzw. gänzlich
gleich gefärbter Pins oder Murmeln in einer Reihe, wobei maximal sechs Farben zur Verfügung stehen.

Ein zweiter Spieler, genannt "codebreaker", versucht durch Testmuster, gleichfalls bestehend aus vier gereihten
Symbolen (Pins/Murmeln), den Code zu erraten. Hätte der codebreaker 6 * 6 * 6 * 6 = 1.296 Versuche zur Verfügung,
wäre dies kein Problem, allerdings wird die Anzahl der Tests als Spielregel auf zwölf (manchmal weniger) begrenzt.

Als Responds auf ein Testmuster muss der codemaker zwei Informationen geben:

1.) Wieviele Symbole im Testmuster stehen an exakt der gleicher Stelle wie im Geheimmuster (im Falle vier, wäre das
Spiel für den codebreaker gewonnen) und
2.) wieviele Symbole (Pin-/Murmelfarben) sind sowohl im Geheim- als auch im Testmuster
vorhanden, allerdings nicht in übereinstimmender Position in der Reihe.

Die Programmieraufgabe bestehe nun darin, MasterMind interaktiv am PC zu simulieren, wobei der Computer als
codemaker fungiert, der zunächst per Zufallsgenerator das Geheimmuster erzeugt. Anschließend sind sukzessive
maximal zwölf Testmuster vom codebreaker (User) einzugeben und vom codemaker jeweils die zwei Fagen zu beantworten.


Anmerkung: MasterMind wurde auch von Mathematikern unter die Lupe genommen und bereits Mitte/Ende der 70er Jahre konnte
bewiesen werden, dass man es mit maximal fünf Testmustern lösen kann, sehr erstaunlich, oder? Daraufhin wurde
SuperMasterMind vorgeschlagen. Unterschied: Reihen mit fünf Symbolen und acht unterschiedlichen Pin-/Murmelfarben.

Wer MasterMind lediglich als schöne Spielerei ansieht, überlege bitte folgendes: Seit 1971 (release)
wurden bisher pro Jahr im Durchschnitt eine Million Spiele weltweit verkauft. Wärest Du der Erfinder und bekämest
als Lizenzgeber pro Exemplar 10 Cent, Du hättest finanziell ausgesorgt.
#4
vote_ok
von paddlboot (3970 Punkte) - 25.11.2019 um 09:29 Uhr
Gelöst mit Windows Forms :)

Quellcode ausblenden C#-Code
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace _217MasterMind
{
    public partial class mastermind : Form
    {
        Master master = new Master();
        WinMaster wm = new WinMaster();
        GroupBox[] farben;
        GroupBox[] schwarzweiss;
        int idx = 0;

        public mastermind()
        {
            InitializeComponent();

            farben = new GroupBox[12]
            {
                gBoxFarbe1,
                gBoxFarbe2,
                gBoxFarbe3,
                gBoxFarbe4,
                gBoxFarbe5,
                gBoxFarbe6,
                gBoxFarbe7,
                gBoxFarbe8,
                gBoxFarbe9,
                gBoxFarbe10,
                gBoxFarbe11,
                gBoxFarbe12
            };

           schwarzweiss = new GroupBox[12]
            {
                gBoxSW1,
                gBoxSW2,
                gBoxSW3,
                gBoxSW4,
                gBoxSW5,
                gBoxSW6,
                gBoxSW7,
                gBoxSW8,
                gBoxSW9,
                gBoxSW10,
                gBoxSW11,
                gBoxSW12
            };

        }

        int count = 1;
        
        private void loesung()
        {
            btnLoesung1.BackColor = master.codefarben[0];
            btnLoesung2.BackColor = master.codefarben[1];
            btnLoesung3.BackColor = master.codefarben[2];
            btnLoesung4.BackColor = master.codefarben[3];
        }

        private void Button_Click(object sender, EventArgs e)
        {
            switch(count)
            {
                case 1:
                    ActiveControl.BackColor = Color.Red;
                    break;
                case 2:
                    ActiveControl.BackColor = Color.Yellow;
                    break;
                case 3:
                    ActiveControl.BackColor = Color.DeepSkyBlue;
                    break;
                case 4:
                    ActiveControl.BackColor = Color.DeepPink;
                    break;
                case 5:
                    ActiveControl.BackColor = Color.MediumBlue;
                    break;
                case 6:
                    ActiveControl.BackColor = Color.GreenYellow;
                    count = 0;
                    break;
            }
            count++;

           foreach(GroupBox box in panel1.Controls)
            {
                if(box.Enabled == true)
                {
                    wm.eingabe(box);
                }
            }

            btnCheck.Enabled = true;
        }

        private void BtnRegeln_Click(object sender, EventArgs e)
        {
            wm.spielRegel();
        }

        private void BtnCheck_Click(object sender, EventArgs e)
        {
            if (wm.gewonnen())
            {
                panel1.Enabled = true;
                loesung();
                MessageBox.Show("Gewonnen!", "Sieg", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
            else
            {
                
                if(farben[idx].Enabled == true)
                {
                    wm.printErg(schwarzweiss[idx]);
                    btnCheck.Enabled = false;
                    farben[idx].Enabled = false;

                    if(farben[idx] == gBoxFarbe12)
                    {
                        
                        loesung();
                        MessageBox.Show("Alle Chancen aufgebraucht!");
                    }
                    else
                    {
                        farben[idx + 1].Enabled = true;
                    }
                    
                }
                idx++;
            }
        }

        private void Btn_beenden_Click(object sender, EventArgs e)
        {
            Application.Exit();
        }

        private void BtnNeustart_Click(object sender, EventArgs e)
        {
            Application.Restart();
        }
    }
}


Quellcode ausblenden C#-Code
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace _217MasterMind
{
    class Master
    {
        enum Colors { Red = 1, Yellow, DeepSkyBlue, DeepPink,  MediumBlue, GreenYellow, Max }

        public int[] zahl = new int[4];
        public Color[] codefarben = new Color[4];
        public Color[] pruefen;
        public int tmp = 0;

        public Master()
        {
            start();
        }

        void start()
        {
            Random rnd = new Random();

            for(int i = 0; i < zahl.Length; i++)
            {
                int zufall;
                
                do
                {
                    zufall = rnd.Next((int)Colors.Max);
                } while (zahl.Contains(zufall));

                zahl[i] = zufall;

                switch(zufall)
                {
                    case 1:
                        codefarben[i] = Color.Red;
                        break;
                    case 2:
                        codefarben[i] = Color.Yellow;
                        break;
                    case 3:
                        codefarben[i] = Color.DeepSkyBlue;
                        break;
                    case 4:
                        codefarben[i] = Color.DeepPink;
                        break;
                    case 5:
                        codefarben[i] = Color.MediumBlue;
                        break;
                    case 6:
                        codefarben[i] = Color.GreenYellow;
                        break;
                }
            }
        }

        public int getSchwarz(Color[] eingabe)
        {
            pruefen = new Color[4];
            tmp = 0;
            int schwarz = 0;
            
            for(int i = 0; i < eingabe.Length; i++)
            {
                if(eingabe[i] == codefarben[i])
                {
                    schwarz++;
                    pruefen[tmp] = eingabe[i];
                    tmp++;
                }
            }
            
            return schwarz;
        }

        public int getWeiss(Color[] eingabe)
        {
            int weiss = 0;

            for(int i = 0; i < eingabe.Length; i++)
            {
                if(codefarben.Contains(eingabe[i]) && (codefarben[i] != eingabe[i]) && (!pruefen.Contains(eingabe[i])))
                {
                    weiss++;
                    pruefen[tmp] = eingabe[i];
                    tmp++;
                }
            }
            
            return weiss;
        }
    }
}


Quellcode ausblenden C#-Code
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace _217MasterMind
{
    class WinMaster
    {
        Color[] beingabe = new Color[4];

        Master m = new Master();

        public int[] cheat()
        {
            return m.zahl;
        }

        public void eingabe(GroupBox Box)
        {
            //Benutzereingabe

            Control.ControlCollection c = Box.Controls;

            int tmp = 0;

            for(int i = 3; i >= 0; i--)
            {
                beingabe[tmp] = c[i].BackColor;
                tmp++;
            }
        }

        public bool gewonnen()
        {
            if(m.getSchwarz(beingabe) == 4)
            {
                return true;
            }
            else
            {
                return false;
            }
        }


        public void printErg(GroupBox aktBox)
        {
            //Anzahl weiße bzw schwarze Pins

            Control.ControlCollection c = aktBox.Controls;

            int s = m.getSchwarz(beingabe);

            for(int i = 0; i < s; i++)
            {
                c[i].BackColor = Color.Black;
            }

            if(s < 4)
            {
                int w = m.getWeiss(beingabe);

                for(int i = 0;  i < w; i++)
                {
                    c[i + s].BackColor = Color.White;
                }
            }
        }
        
        public void spielRegel()
        {
            MessageBox.Show("Zu Beginn legt der Computer einen 4-stelligen Code fest, der aus sechs möglichen Farben ausgewählt wird. Jede Farbe kommt dabei nur einmal vor.\nDer Spieler versucht, den Code herauszufinden. " +
                "Dazu setzt er einen gleichartigen Farbcode als Frage; beim ersten Zug blind geraten, bei den weiteren Zügen mit Hilfe der Antworten zu den vorangegangenen Zügen.\n" +
                "Auf jeden Zug hin bekommt der Rater die Information, wie viele Stifte er in Farbe und Position richtig gesetzt hat und wie viele Stifte zwar die richtige Farbe haben, aber an einer falschen Position stehen. " +
                "Ein Treffer in Farbe und Position wird durch einen schwarzen Stift angezeigt, ein farblich richtiger Stift an falscher Steller durch einen weißen Stift.\n" +
                "Alle Fragen und Antworten bleiben bis zum Ende des Spieles sichtbar.\nMan hat 12 versuche. ", "Regeln", MessageBoxButtons.OK, MessageBoxIcon.Information);
        }
    }
}

Kommentare:

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

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