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

#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
...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
#2

von Z3RP (1020 Punkte)
- 05.06.2018 um 08:20 Uhr
Die Win Form
C#-Code
Der Designer
C#-Code
MSButton
C#-Code

using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Diagnostics; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; namespace MinesSweeperwForms { public partial class Form1 : Form { Random rnd = new Random(DateTime.Now.Millisecond); int sizeX; int sizeY; int bombsCount; int flagCount; Bitmap MSFlag; Bitmap MSBomb; bool alive; bool wonGame; public Form1() { InitializeComponent(); MSFlag = (Bitmap)Image.FromFile(@"C:\Users\npreen.CARGOSOFT\Pictures\MSFlag.png"); MSBomb = (Bitmap)Image.FromFile(@"C:\Users\npreen.CARGOSOFT\Pictures\MSBomb.png"); alive = true; } TextBox sizeXTb; TextBox sizeYTb; TextBox bombsTb; Form settings; private void Form1_Load(object sender, EventArgs e) { settings = new Form(); settings.Location = new Point(Location.X, Location.Y); settings.Width = 300; settings.Height = 150; settings.FormBorderStyle = FormBorderStyle.FixedSingle; settings.ControlBox = false; Label sizeLbl = new Label(); sizeLbl.Text = "Size: X / Y"; sizeLbl.Bounds = new Rectangle(50, 20, 100, 20); Label bombsLbl = new Label(); bombsLbl.Text = "Bombs:(16%)"; bombsLbl.Bounds = new Rectangle(50, 70, 100, 20); sizeXTb = new TextBox(); sizeXTb.Bounds = new Rectangle(50, 40, 50, 20); sizeXTb.KeyPress += textBox_KeyPress; sizeXTb.Text = "10"; sizeYTb = new TextBox(); sizeYTb.Bounds = new Rectangle(110, 40, 50, 20); sizeYTb.KeyPress += textBox_KeyPress; sizeYTb.Text = "10"; bombsTb = new TextBox(); bombsTb.Bounds = new Rectangle(50, 90, 50, 20); bombsTb.KeyPress += textBoxBomb_KeyPress; bombsTb.Text = ""; Button generateBtn = new Button(); generateBtn.Bounds = new Rectangle(100, 120, 100, 20); generateBtn.Text = "Generate"; generateBtn.Click += GenerateMap; settings.Controls.Add(generateBtn); settings.Controls.Add(sizeLbl); settings.Controls.Add(sizeXTb); settings.Controls.Add(sizeYTb); settings.Controls.Add(bombsLbl); settings.Controls.Add(bombsTb); settings.ShowDialog(); } MSButton[,] buttons; List<MSButton> bombButtons = new List<MSButton>(); private void GenerateMap(object sender, EventArgs e) { sizeX = Convert.ToInt32(sizeXTb.Text); sizeY = Convert.ToInt32(sizeYTb.Text); if(bombsTb.Text.Length > 0) { bombsCount = Convert.ToInt32(bombsTb.Text); } else { bombsCount = (int)((sizeX * sizeY) * 0.16); } settings.Close(); Width = sizeX * 20 + 30; Height = sizeY * 20 + 50; buttons = new MSButton[sizeX, sizeY]; for (int x = 0; x < sizeX; x++) { for (int y = 0; y < sizeY; y++) { buttons[x, y] = new MSButton(x, y, this); Controls.Add(buttons[x, y].btn); } } List<MSButton> tempButtons = buttons.OfType<MSButton>().ToList(); for (int i = 0; i < bombsCount; i++) { MSButton msb = tempButtons[rnd.Next(tempButtons.Count)]; buttons[msb.gridX, msb.gridY].isBomb = true; setButtonValue(msb); bombButtons.Add(msb); tempButtons.Remove(msb); } gameTime.Enabled = true; } private void setButtonValue(MSButton msb) { if (msb.gridX > 0) { buttons[msb.gridX - 1, msb.gridY].addOne(); } if (msb.gridX > 0 && msb.gridY > 0) { buttons[msb.gridX - 1, msb.gridY - 1].addOne(); } if (msb.gridY > 0) { buttons[msb.gridX, msb.gridY - 1].addOne(); } if (msb.gridY > 0 && msb.gridX < (sizeX - 1)) { buttons[msb.gridX + 1, msb.gridY - 1].addOne(); } if (msb.gridX < (sizeX - 1)) { buttons[msb.gridX + 1, msb.gridY].addOne(); } if (msb.gridY < (sizeY - 1) && msb.gridX < (sizeX - 1)) { buttons[msb.gridX + 1, msb.gridY + 1].addOne(); } if (msb.gridY < (sizeY - 1)) { buttons[msb.gridX, msb.gridY + 1].addOne(); } if (msb.gridY < (sizeY - 1) && msb.gridX > 0) { buttons[msb.gridX - 1, msb.gridY + 1].addOne(); } } private void checkAdjacented(MSButton msb) { MSButton tempButton; if (msb.gridX > 0) { tempButton = buttons[msb.gridX - 1, msb.gridY]; checkButton(tempButton); } if (msb.gridX > 0 && msb.gridY > 0) { tempButton = buttons[msb.gridX - 1, msb.gridY - 1]; checkButton(tempButton); } if (msb.gridY > 0) { tempButton = buttons[msb.gridX, msb.gridY - 1]; checkButton(tempButton); } if (msb.gridY > 0 && msb.gridX < (sizeX - 1)) { tempButton = buttons[msb.gridX + 1, msb.gridY - 1]; checkButton(tempButton); } if (msb.gridX < (sizeX - 1)) { tempButton = buttons[msb.gridX + 1, msb.gridY]; checkButton(tempButton); } if (msb.gridY < (sizeY - 1) && msb.gridX < (sizeX - 1)) { tempButton = buttons[msb.gridX + 1, msb.gridY + 1]; checkButton(tempButton); } if (msb.gridY < (sizeY - 1)) { tempButton = buttons[msb.gridX, msb.gridY + 1]; checkButton(tempButton); } if (msb.gridY < (sizeY - 1) && msb.gridX > 0) { tempButton = buttons[msb.gridX - 1, msb.gridY + 1]; checkButton(tempButton); } } private void checkButton(MSButton tempButton) { if (!tempButton.isChecked) { tempButton.isChecked = true; if (tempButton.value == 0) { tempButton.btn.Enabled = false; checkAdjacented(tempButton); } else { tempButton.btn.Text = tempButton.value.ToString(); } tempButton.btn.BackColor = Color.DarkGray; } } private void textBox_KeyPress(object sender, KeyPressEventArgs e) { if (!char.IsControl(e.KeyChar) && !char.IsDigit(e.KeyChar) && (e.KeyChar != '.')) { e.Handled = true; } // only allow one decimal point if ((e.KeyChar == '.') && ((sender as TextBox).Text.IndexOf('.') > -1)) { e.Handled = true; } } private void textBoxBomb_KeyPress(object sender, KeyPressEventArgs e) { if (!char.IsControl(e.KeyChar) && !char.IsDigit(e.KeyChar) && (e.KeyChar != '.')) { e.Handled = true; } // only allow one decimal point if ((e.KeyChar == '.') && ((sender as TextBox).Text.IndexOf('.') > -1)) { e.Handled = true; } if (!char.IsControl(e.KeyChar) && bombsTb.Text.Length > 0) { if ((Convert.ToInt32(bombsTb.Text) + e.KeyChar) > Convert.ToInt32(sizeXTb.Text) * Convert.ToInt32(sizeYTb.Text)) { e.Handled = true; } } else { if (e.KeyChar > Convert.ToInt32(sizeXTb.Text) * Convert.ToInt32(sizeYTb.Text)) { e.Handled = true; } } } public void leftClickButton(MSButton msBtn) { if (alive) { if (msBtn.isBomb) { GameOver(); } else { if (msBtn.value == 0) { msBtn.btn.Enabled = false; checkAdjacented(msBtn); } else { msBtn.btn.Text = msBtn.value.ToString(); } msBtn.btn.BackColor = Color.DarkGray; } } } private void GameOver() { alive = false; gameTime.Enabled = false; foreach (MSButton btn in bombButtons) { btn.btn.BackgroundImage = MSBomb; } gameState.Text = "Lost!"; } private void GameWon() { alive = false; gameTime.Enabled = false; gameState.Text = "Won!"; } public void rightClickButton(MSButton msBtn) { if (alive && flagCount < bombsCount) { if (msBtn.isFlagged) { msBtn.btn.BackgroundImage = null; msBtn.isFlagged = false; flagCount--; } else { msBtn.btn.BackgroundImage = MSFlag; msBtn.isFlagged = true; flagCount++; bool allFlagged = true; foreach (MSButton btn in bombButtons) { allFlagged = btn.isFlagged; } if (allFlagged) { GameWon(); } } flagLabel.Text = flagCount.ToString(); } } private int time; private void gameTime_Tick(object sender, EventArgs e) { time++; timeLabel.Text = time.ToString(); } } }
Der Designer

namespace MinesSweeperwForms { partial class Form1 { /// <summary> /// Erforderliche Designervariable. /// </summary> private System.ComponentModel.IContainer components = null; /// <summary> /// Verwendete Ressourcen bereinigen. /// </summary> /// <param name="disposing">True, wenn verwaltete Ressourcen gelöscht werden sollen; andernfalls False.</param> protected override void Dispose(bool disposing) { if (disposing && (components != null)) { components.Dispose(); } base.Dispose(disposing); } #region Vom Windows Form-Designer generierter Code /// <summary> /// Erforderliche Methode für die Designerunterstützung. /// Der Inhalt der Methode darf nicht mit dem Code-Editor geändert werden. /// </summary> private void InitializeComponent() { this.components = new System.ComponentModel.Container(); this.timeLabel = new System.Windows.Forms.Label(); this.flagLabel = new System.Windows.Forms.Label(); this.gameState = new System.Windows.Forms.Label(); this.gameTime = new System.Windows.Forms.Timer(this.components); this.SuspendLayout(); // // timeLabel // this.timeLabel.AutoSize = true; this.timeLabel.Location = new System.Drawing.Point(38, 3); this.timeLabel.Name = "timeLabel"; this.timeLabel.Size = new System.Drawing.Size(0, 13); this.timeLabel.TabIndex = 0; // // flagLabel // this.flagLabel.AutoSize = true; this.flagLabel.Location = new System.Drawing.Point(103, 3); this.flagLabel.Name = "flagLabel"; this.flagLabel.Size = new System.Drawing.Size(0, 13); this.flagLabel.TabIndex = 0; // // gameState // this.gameState.AutoSize = true; this.gameState.Location = new System.Drawing.Point(190, 3); this.gameState.Name = "gameState"; this.gameState.Size = new System.Drawing.Size(0, 13); this.gameState.TabIndex = 0; // // gameTime // this.gameTime.Interval = 1000; this.gameTime.Tick += new System.EventHandler(this.gameTime_Tick); // // Form1 // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.ClientSize = new System.Drawing.Size(700, 489); this.Controls.Add(this.gameState); this.Controls.Add(this.flagLabel); this.Controls.Add(this.timeLabel); this.Font = new System.Drawing.Font("Microsoft Sans Serif", 8F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle; this.Name = "Form1"; this.Text = "MinesSweeper"; this.Load += new System.EventHandler(this.Form1_Load); this.ResumeLayout(false); this.PerformLayout(); } #endregion private System.Windows.Forms.Label timeLabel; private System.Windows.Forms.Label flagLabel; private System.Windows.Forms.Label gameState; private System.Windows.Forms.Timer gameTime; } }
MSButton

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Windows.Forms; namespace MinesSweeperwForms { public class MSButton { public Button btn { get; set; } public int gridX { get; set; } public int gridY { get; set; } public Form1 parent { get; set; } public bool isFlagged { get; set; } public bool isBomb { get; set; } public int value { get; set; } public bool isChecked { get; set; } public MSButton(int gridX, int gridY, Form parent) { this.parent = (Form1)parent; this.gridX = gridX; this.gridY = gridY; isFlagged = false; isChecked = false; isBomb = false; value = 0; btn = new Button(); btn.Font = new System.Drawing.Font("Arial", 8F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); btn.BackgroundImageLayout = ImageLayout.Stretch; btn.FlatStyle = System.Windows.Forms.FlatStyle.Flat; btn.Location = new System.Drawing.Point(gridX*20 +12, gridY * 20 + 12); btn.Size = new System.Drawing.Size(20, 20); btn.UseVisualStyleBackColor = true; btn.MouseDown += MouseDown; } public void addOne() { value++; } private void MouseDown(object sender, MouseEventArgs e) { if (e.Button == MouseButtons.Left) { parent.leftClickButton(this); } if (e.Button == MouseButtons.Right) { parent.rightClickButton(this); } } } }
Kommentare:
Für diese Lösung gibt es noch keinen Kommentar
Seite 1 von 0
1