C# :: Aufgabe #207 :: Lösung #3

3 Lösungen Lösungen öffentlich
#207

Minesweeper, der zündende Klassiker

Fortgeschrittener - C# von Exception - 16.05.2018 um 19:49 Uhr
Dieses Spielchen kennt sicher jeder...
...ein X * Y großes Spielfeld und die ein oder andere explosive Überraschung #boom ... :)

Ihr kennt Minesweeper nicht? Dann klickt hier!

Die Anforderungen:
1) Grafische Umsetzung
2) Das Spielfeld soll eine variable Größe haben (konfigurierbar vor dem Start)
3) Die einzelnen Minen sollen zufällig verteilt werden
4) Felder, die keine Mine enthalten zeigen nachdem sie angeklickt wurden die Anzahl der Minen, die sich im direkten Umkreis befinden.
5) Mit der rechten Maustaste kann der Spieler auf das Feld eine Fahne setzen, über dem er gerade mit dem Mauszeiger hovert und auf dem er eine Mine vermutet. Bei erneutem Rechtsklick wird die gesetzte Fahne wieder entfernt (Aufpassen dass nicht mehr Fahnen platziert werden können als es Minen gibt!)

Das Spiel endet...
... wenn ein Minenfeld angeklickt wurde / "explodiert" ist => Verloren
... oder bestenfalls, wenn alle Minen mit Fahnen markiert wurden => Sieg

Nice to have (optional):
- Ein Timer der anzeigt wie lange gebraucht wurde
- Bestenliste
- Anzahl der Minen kann eingestellt werden, sonst muss die Anzahl eben abhängig von der Feldgröße berechnet werden.
- Sound: Beim Feld anklicken, wenn Mine getroffen wurde, ...... #Kreativität
#3
vote_ok
von Mexx (2370 Punkte) - 11.11.2018 um 20:13 Uhr
Hi, hier mal meine Lösung. Von der Funktionsweise und dem Design habe ich mich am Original orientiert.

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 Minesweeper_Clone
{
    public partial class Form1 : Form
    {
        Spielfeld sf;
        public Form1()
        {
            InitializeComponent();
        }

        private void F_Click(object sender, EventArgs e)
        {
            Feld f = sender as Feld;
            if (f.IsBorder)
                return;

            if (f.IsBomb && (e as MouseEventArgs).Button == MouseButtons.Left && !f.IsFahne)
            {
                f.Clicked((e as MouseEventArgs).Button);
                MessageBox.Show("Verloren");
                return;
            }

            f.Clicked((e as MouseEventArgs).Button);

            if (Spielfeld.Completed)
                MessageBox.Show("Gewonnen");
        }

        private void btnStart_Click(object sender, EventArgs e)
        {
            sf = null;
            sf = new Spielfeld((int)nudSize.Value, (int)nudSize.Value, (int)nudBombs.Value);

            foreach (Feld f in sf.Gamepannel)
            {
                f.Click += F_Click;
                scPanel.Panel2.Controls.Add(f);
            }
            this.Invalidate();
        }
    }
}


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 Minesweeper_Clone
{
    class Spielfeld
    {
        static Feld[,] gamepannel;
        static int openFields;
        static int felderCount;
        static int bombCount;
        static bool completed;

        public Feld[,] Gamepannel
        {
            get { return gamepannel; }
        }

        public static int OpenFields
        {
            get { return openFields; }
            set
            {
                openFields = value;
                if (openFields == felderCount - bombCount)
                    completed = true;
            }
        }

        public static bool Completed
        {
            get { return completed; }
        }
        public Spielfeld(int breite, int länge, int bombs)
        {
            bombCount = bombs;
            felderCount = breite * länge;
            openFields = 0;
            completed = false;
            gamepannel = new Feld[breite + 2, länge + 2];

            for (int i = 0; i < breite + 2; i++)
                gamepannel[0, i] = new Feld(0, i, true);
            for (int i = 0; i < länge + 2; i++)
                gamepannel[i, 0] = new Feld(i, 0, true);
            for (int i = 0; i < breite + 2; i++)
                gamepannel[breite + 1, i] = new Feld(breite + 1, i, true);
            for (int i = 0; i < länge + 2; i++)
                gamepannel[i, länge + 1] = new Feld(i, länge + 1, true);

            for (int i = 1; i <= breite; i++)
                for (int y = 1; y <= länge; y++)
                    gamepannel[i, y] = new Feld(i, y, false);

            for (int i = 0; i < bombCount; i++)
            {
                Random ran = new Random();
                int rx = ran.Next(1, breite + 1);
                int ry = ran.Next(1, länge + 1);

                if (gamepannel[rx, ry].IsBomb)
                {
                    i--;
                    continue;
                }

                gamepannel[rx, ry].IsBomb = true;
            }

            foreach (Feld f in gamepannel)
            {
                if (!f.IsBorder && !f.IsBomb)
                {
                    for (int i = f.X - 1; i <= f.X + 1; i++)
                        for (int y = f.Y - 1; y <= f.Y + 1; y++)
                            if (!gamepannel[i, y].IsBorder)
                                if (gamepannel[i, y].IsBomb)
                                    f.BombCount++;
                }
            }
        }
        public static void Freilegen(Feld f)
        {
            for (int i = f.X - 1; i <= f.X + 1; i++)
                for (int y = f.Y - 1; y <= f.Y + 1; y++)
                    if (!gamepannel[i, y].IsBorder)
                        gamepannel[i, y].Clicked(MouseButtons.Left);
        }
    }

    class Feld : PictureBox
    {
        const int rand = 30;
        const int feldgrösse = 30;
        bool isBomb;
        bool isBorder;
        bool isFahne;
        bool isOpened;
        int bombCount;
        int x;
        int y;

        public bool IsBomb
        {
            get { return isBomb; }
            set { isBomb = value; }
        }

        public bool IsBorder
        {
            get { return isBorder; }
            set
            {
                isBorder = value;
                if (value)
                    this.BackColor = Color.Black;
            }
        }

        public bool IsFahne
        {
            get { return isFahne; }
        }
        public int BombCount
        {
            get { return bombCount; }
            set { bombCount = value; }
        }

        public int X
        {
            get { return x; }
        }

        public int Y
        {
            get { return y; }
        }
        public Feld(int x, int y, bool boarder)
        {
            this.isOpened = false;
            this.isFahne = false;
            this.BackColor = Color.Gray;
            this.BackgroundImageLayout = ImageLayout.Stretch;
            this.x = x;
            this.y = y;
            this.Location = new Point(x * feldgrösse + rand, y * feldgrösse + rand);
            this.BorderStyle = BorderStyle.FixedSingle;
            this.Width = feldgrösse;
            this.Height = feldgrösse;
            this.IsBorder = boarder;
            this.IsBomb = false;
        }

        public void Clicked(MouseButtons b)
        {
            if (this.isOpened)
                return;

            if (b == MouseButtons.Left && !this.isFahne)
            {
                this.isOpened = true;
                Spielfeld.OpenFields++;

                if (isBomb)
                {
                    this.BackgroundImage = Image.FromFile(@"images/bomb.jpg");
                    return;
                }

                switch (bombCount)
                {
                    case 0:
                        this.BackColor = Color.White;
                         Spielfeld.Freilegen(this);
                        break;
                    case 1:
                        this.BackgroundImage = Image.FromFile(@"images/eins.jpg");
                        break;
                    case 2:
                        this.BackgroundImage = Image.FromFile(@"images/zwei.jpg");
                        break;
                    case 3:
                        this.BackgroundImage = Image.FromFile(@"images/drei.jpg");
                        break;
                    case 4:
                        this.BackgroundImage = Image.FromFile(@"images/vier.jpg");
                        break;
                    case 5:
                        this.BackgroundImage = Image.FromFile(@"images/fuenf.jpg");
                        break;
                    case 6:
                        this.BackgroundImage = Image.FromFile(@"images/sechs.jpg");
                        break;
                    case 7:
                        this.BackgroundImage = Image.FromFile(@"images/sieben.jpg");
                        break;
                    case 8:
                        this.BackgroundImage = Image.FromFile(@"images/acht.jpg");
                        break;
                    default:
                        break;
                }
            }

            if (b == MouseButtons.Right)
                if (!isFahne)
                {
                    this.isFahne = true;
                    this.BackgroundImage = Image.FromFile(@"images/fahne.png");
                }
                else
                {
                    this.isFahne = false;
                    this.BackgroundImage = null;
                    this.BackColor = Color.Gray;
                }
        }
    }
}

Kommentare:

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

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