Hallo,
erst mal zu mir: Ich bin Schüler an einer IT Berufsschule. Wir lernen jetzt seit einem halben Jahr C#.
Jetzt wollte ich ein bisschen Learning by Doing betreiben und mit C# und Forms ein Tick Tack Toe Spiel schreiben.
Nur ist jetzt ein Problem mit dem Klassenkonzept aufgetreten.
Erst mal zum Aufbau:
Das Spielfeld besteht hauptsächlich aus 9 Bottons. Wird einer gedrückt, ändert er seine Farbe und setzt in einem bool Array[3,3] seinen Wert auf true. Anschließend wird eine Methode aufgerufen, die 1. den Gegenspieler darstellen soll und 2. eine andere Mathode aufruft, die prüft über if Abfragen ob das Spiel gewonnen wurde. Das Array und die beiden Methoden befinden sich in einer neuen Klasse.
Das Problem:
Er erkennt einfach nicht, dass das Spiel gewonnen wurde. Um das Problem zu finden hab ich dann das Programm Zeile um Zeile ausgeführt und dabei das Array im Lokal Fenster überwacht.
Wenn der Button aktiviert wurde, wird der Wert richtig gesetzt (auch bei den folgenden Buttons). Sobald aber die Methode in der Klasse aufgerufen wird, in der auch das Array ist, sind plötzlich alle Werte auf false.
Ich hab jetzt im Internet, in unserem C# Buch und in einerm Galileo Computing Buch gesucht, komme aber auf keinen grünen Ast.
Woran liegt das und wie kann man das beheben?
Auch ein Tipp wonach man hier lesen muss währe super.
LG
Der Kölner
Hallo DerKölner,
willkommen bei myCSharp.de
Jetzt wollte ich ein bisschen Learning by Doing betreiben und mit C# und Forms ein Tick Tack Toe Spiel schreiben.
Damit habe ich auch angefangen 😉 Der nächste Schritt ist dann 4 Gewinnt 😃
Woran liegt das und wie kann man das beheben?
Das ist ohne weitere Details sehr schwierig zu sagen.
Kannst du evtl. etwas relevanten Code posten damit wir sehen können wo das Problem ist?
Den Debugger hast du schon verwendet, dann kann man so ohne Details nicht viel zu sagen.
Wie gibst du der anderen Klasse die Daten mit?
Gruß
Michael
willkommen bei myCSharp.de
Danke
Hier erst mal die eine Klasse mit den Buttons:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace TickTackToe
{
public partial class Spielfeld : Form
{
Code Objekt = new Code();
internal int TeSt = new int();
public Spielfeld()
{
InitializeComponent();
}
private void Button_1_1_Click(object sender, EventArgs e)
{
if (Button_1_1.BackColor != Color.Red || Button_1_1.BackColor != Color.Blue)
{
Button_1_1.BackColor = Color.Blue;
Objekt.Feld[0, 0] = true;
if(Code.KI())gewonnen();
}
}
public void gewonnen()
{
MessageBox.Show("Gewonnen");
System.Threading.Thread.Sleep(5000);
this.Close();
}
}
}
Und hier die Klasse mit dem Rest:
using System;
using System.Collections.Generic;
using System.Text;
namespace TickTackToe
{
class Code
{
internal bool[,] Feld = new bool[3, 3];
internal static bool KI()
{
bool gewonnen = false;
gewonnen = gewinnPrüfung();
return gewonnen;
}
private static bool gewinnPrüfung()
{
bool gewonnen = false;
Code Objekt = new Code();
if (Objekt.Feld[0, 0] && Objekt.Feld[0, 1] && Objekt.Feld[0, 2]) gewonnen = true;
if (Objekt.Feld[1, 0] && Objekt.Feld[1, 1] && Objekt.Feld[1, 2]) gewonnen = true;
if (Objekt.Feld[2, 0] && Objekt.Feld[2, 1] && Objekt.Feld[2, 2]) gewonnen = true;
if (Objekt.Feld[0, 0] && Objekt.Feld[1, 0] && Objekt.Feld[2, 0]) gewonnen = true;
if (Objekt.Feld[0, 1] && Objekt.Feld[1, 1] && Objekt.Feld[2, 1]) gewonnen = true;
if (Objekt.Feld[0, 2] && Objekt.Feld[1, 2] && Objekt.Feld[2, 2]) gewonnen = true;
if (Objekt.Feld[0, 0] && Objekt.Feld[1, 1] && Objekt.Feld[2, 2]) gewonnen = true;
if (Objekt.Feld[2, 0] && Objekt.Feld[1, 1] && Objekt.Feld[0, 2]) gewonnen = true;
return gewonnen;
}
}
}
In KI() sollte eigentlich noch der Gegenspieler rein.
LG
Der Kölner
Hallo,
Das liegt daran, dass du ihn gewinnPrüfung ein neues Objekt erzeugst. Das ist dann nicht mehr das gleiche, wie das, welches du geändert hast.
Gruss
Aratar
Es ist gut, dass du Learning by Doing betreibst. Bitte beachte trotzdem [Hinweis] Wie poste ich richtig? Punkt 1.1.1.