4Gewinnt VB.Net TUT

climbing93

Neuling
Thread Starter
Mitglied seit
01.07.2009
Beiträge
624
Ort
Between Keyboard an Chair
Mir ist iwie langweilig und da schwirrt mir schon länger die Idee im Kopp, mal ein Tut für ein 4 Gewinnt zu schreiben:xmas:

VB.Net ist ne Sprache, die sehr viel verzeiht, manchmal zuviel und man erst in der Laufzeitumgebung merkt, was VB für einen macht.

Datenbank hinten ist immo eine Access und soll nachher auf einen SQL raufgesetzt werden. Acess deshalb, dass wir(Ich und meine Mitstiftin) besser schauen konnten, was hinten abgeht.

Objektorientierung ist noch nicht stark vorhanden, da dies im ersten Lehrjahr noch nicht angeschaut wird.

Dadurch, dass Multiplayer möglich ist -> an verschiedenen PC's, ists ein bisschen kompliziert. Werde also nur die mal die Grundlegenden Funktionen, ohne Gross auf den Programmablauf einzugehen.

Speicherort der für den Spielablauf lenkenden und sonstige sehr oft genutzten Variablen sind in mehreren im Anfang des Programms deklarierten Klassen, die immer eine Set/Get beinhaltet. Hiermit könnte, falls nötig, jede auf gültige Werte geprüft werden, bevor sie gesetzt wird. Wird immo nicht genutzt;)

Als KI wurde Tored benutzt. Ist einbisschen doofes Ding -> funktioniert nur auf 5 Spalten gut und schwer ist auch nicht gerade das tollste.Darum hab ich hier mal so ein theoretisches Dingens gemacht(Während dem Mathe Unterricht:fresse:), nach der Min-Max Theorie(Wurde noch nicht eingebaut, aber sollte funktionieren.):

Code:
function fMinMax(byval bMinMax as Boolean, byval nSpielfeld() as integer, byval nSuchtiefe as integer) as integer()
	dim nZueruck as integer
	dim nBewrten as integer
	For i as integer = 0 to clsoptions.nspalten -1
		if nSuchtiefe = 0 then
			if bMinMax = false then
				if nZueruck < fBewerten(nSpielfeld(), i, bMinMax) then
					nZueruck(0) = fBewerten(nSpielfeld(), i, bMinMax)
					nZueruck(1) = i
				end if
			else if bMinMax = true then
				if nZueruck(0) > fBewerten(nSpielfeld(), i, bMinMax) then
					nZueruck(0) = fBewerten(nSpielfeld(), i, bMinMax)
					nZueruck(1) = i
				end if
			end if
		else
			if bMinMax = false then
				if nZueruck(0) < fMinMax(bMinMax, nSpielfeld, nSuchtiefe – 1) then
					nZueruck(0) = fMinMax(bMinMax, nSpielfeld, nSuchtiefe – 1)
					nZueruck(1) = i
				end if
			else if bMinMax = true then
				if nZueruck(0) > fMinMax(bMinMax, nSpielfeld, nSuchtiefe – 1) then
					nZueruck(0) = fMinMax(bMinMax, nSpielfeld, nSuchtiefe – 1)
					nZueruck(1) = i
			end if
		end If
	next
	return nZueruck
end Function

Die Bewertungsfunktion fehlt noch aber sonst find ichs bis jetzt:bigok:

Vllt. kann das ja jemand abschätzen, ob da nirgends ein gröberer Fehler drinliegt?

Und ob überhaut Interesse besteht, dass die fortgeführt wird.

MFG

Climbing93

Edit: Tabs nimmts nicht an:-[
 
Zuletzt bearbeitet:
Wenn Du diese Anzeige nicht sehen willst, registriere Dich und/oder logge Dich ein.
Ich und meine Mitstiftin

Der Esel nennt sich immer zuerst :d

Edit: Tabs nimmts nicht an:-[

Doch macht er. Dafür musst du aber den betreffenden Block in <CODE></CODE> verpacken.

Wenn es dann schön aussieht, verstehe ich vom Quelltext vieleicht mehr als nur Bahnhof. Ist aber noch etwas früh für mich. Ich meld mich später nochmal wenn ich richtig Wach geworden bin.
 
Der Esel macht auch fast alles;)

Code:
   ''' <summary>
   ''' Keyboardsteuerung
   ''' </summary>
   ''' <param name="sender"></param>
   ''' <param name="e"></param>
   ''' <remarks></remarks>
   Private Sub MainForm_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles Me.KeyDown
      Dim b As Button
      If pnlSpielfeld.Enabled = True Then
         Select Case e.KeyCode
            Case Keys.D1
               b = fGetButton("00")
            Case Keys.D2
               b = fGetButton("10")
            Case Keys.D3
               b = fGetButton("20")
            Case Keys.D4
               b = fGetButton("30")
            Case Keys.D5
               b = fGetButton("40")
            Case Else
               If clsOptions.nSpalten >= 7 Then
                  Select Case e.KeyCode
                     Case Keys.D6
                        b = fGetButton("50")
                     Case Keys.D7
                        b = fGetButton("60")
                     Case Else
                        If clsOptions.nSpalten >= 9 Then
                           Select Case e.KeyCode
                              Case Keys.D8
                                 b = fGetButton("70")
                              Case Keys.D9
                                 b = fGetButton("80")
                           End Select
                        End If
                  End Select
               End If
         End Select
      End If
      Select Case e.KeyCode
         Case Keys.N
            If cmdNeustart.Enabled = True Then
               cmdNeustart_Click(sender, e)
            End If
         Case Keys.P
            If cmdPause.Enabled = True Then
               cmdPause_Click(sender, e)
            End If
         Case Keys.S
            If cmdGegner.Enabled = True Then
               cmdGegner_Click(sender, e)
            End If
      End Select

      If Not b Is Nothing [B]AndAlso[/B] b.Enabled = True Then
         pZug(b, e)
      End If

      'If e.KeyCode = Keys.A Then
      '   k = fGetButton("00")
      'ElseIf 
      'End If

   End Sub
Keyboardsteuerung, KeyPreview muss enabled sein.

Ganz interessant ist das andalso bei b. AndAlso wertet einen Wert aus und wenn der richtig ist, wertet er den anderen aus. Wenn er falsch ist -> wertet er den anderen nicht aus. Also keine CastException und auch keine 2If-Schläufchen.

Et Le Datenbankmodell:


Code:
using System;
using System.Collections.Generic;
using System.Text;

namespace VierGewinntKI
{
    /*
        ______________ ________  
        |_ ______|  _ \|  _|   \ 
         | | ___ | |_| | |_| |\ |
         | | | | |   _/|  _| || |
         | | |_| | |\ \| |_| |/ |
         |_|_____|_| \_\___|___/ 
        \/\/\/\/\/\/\/\/\/\/\/\/\

        Tored - Die KI

        Tored muss logischerweise ein Spielfeld übergeben
        bekommen, damit er etwas machen kann. Das ist dann auch
        schon der erste Schritt den die KI macht.
        Das Spielfeld muss vom ObjektTypen 'VierGewinnt' sein,
        andere Arten von Spielfeldern (z.b. int[,]) lassen sich
        sehr einfach in 'VierGewinnt'-Objekte konvertieren.
        (Die Funktionen dafür müssten noch geschrieben werden,
        es sollten aber keine Probleme auftauchen)

        Die KI hat jetzt ein Spielfeld und beginnt nun zu arbeiten.

        1. Die KI schaut in allen Spalten ob der Computer gewinnen würde, wenn
        er den Zug machen würde. Falls der Computer eine Gewinnmöglichkeit hat,
        wird diese gleich zum echten Spielfeld übergeben. Ansonsten macht die KI weiter.

        2. Die KI schaut in allen Spalten ob der Mensch gewinnen kann, bzw. irgendwo
        schon drei von vier Steinen in einer Geraden hat, falls das so ist, wird das
        natürlich verhindert. Falls der Mensch keine solche Chanchen hat fährt die KI fort.

        3. Jetzt werden zwei Risikohafte Muster geprüft, falls eines davon existiert, wird
        es vervollständigt oder zerstört. Ansonsten macht die KI weiter.

        4. Falls eingestellt wurde, dass die KI lernen kann, dann wird nun im gelernten,
        d.h. alle Situationen auf die die KI bis jetzt angetroffen ist. Falls eine Lösung
        gefunden wird, mit der die  KI schon mal gewonnen hat wird diese ausgewählt.
        Ansonsten macht die KI weiter.

        5. Jetzt wird berechnet welche der möglichen Zügen dumm bzw. klug wären:
        Dumme Züge:
        Ein dumemr Zug ist, wenn der Gegner danach einen Stein auf diesen Zug machen kann und er hat gewonnen.
        Kluge Züge:
        Ein kluger Zug ist ein Zug, der das Spiel nicht beeinflusst.
        Gemacht wird noch nichts nur berechnet welche Züge gut oder schlecht sind.

        6. Jetzt wird die anspruchsvollste Funktion gestartet, es wird voraus berechnet welcher
        Zug auf dem Spielfeld in der Zukunft wie fest und wie gut das Spiel beeinflusst.
        Wenn ein gut berechneter Zug gefunden worden ist, wird getestet ob er einer der klugen oder
        einer der dummen Züge ist. Falls er einer der klugen ist wird er gewählt.
        Ansonsten macht die KI weiter.

        7. Falls ein guter Zug existiert wird er gewählt. Ansonsten macht die KI weiter.

        8. Das Programm weiss: "Ich habe verloren... Wenn mein Gegner nicht ganz blöd ist..."
        Es macht einen dummen Zug falls einer existiert. Ansonsten macht die KI weiter.

        9. Die letzte Möglichkeit:
        Alle Spalten sind voll. Das Spiel ist zu ende.
     */
    class Tored
    {
        #region Eigenschaften
        public VierGewinnt SpielFeld;
        public SpielzugListe Gelerntes;
        public static List<List<Status>> MusterListe;
        #endregion

        #region Konstruktoren
        public Tored(VierGewinnt spielFeld, SpielzugListe gelerntes)
        {
            SpielFeld = spielFeld;
            Gelerntes = gelerntes;
            MusterListe = MusterErstellen();
        }
        #endregion

        #region Funktionen
        private int HöchstenWertBerechnen(List<int> Eingabe)
        {
            try
            {
                List<bool> HöchsteWerte = new List<bool>();
                HöchsteWerte.Add(true);
                for (int i = 0; i < Eingabe.Count; i++)
                {
                    HöchsteWerte.Add(false);
                    for (int j = 0; j < HöchsteWerte.Count; j++)
                        if (HöchsteWerte[j])
                            if (Eingabe[i] > Eingabe[j])
                            {
                                HöchsteWerte[i] = true;
                                HöchsteWerte[j] = false;
                            }
                            else
                                if (Eingabe[i] == Eingabe[j])
                                {
                                    HöchsteWerte[i] = true;
                                }
                                else
                                    HöchsteWerte[i] = false;
                }
                HöchsteWerte.RemoveAt(HöchsteWerte.Count - 1);
                int AnzahlOK = 0;
                for (int i = 0; i < HöchsteWerte.Count; i++)
                    if (HöchsteWerte[i])
                        AnzahlOK++;
                if (AnzahlOK == 0)
                    throw new Exception("Keinen Zug gefunden!");
                else
                    AnzahlOK = new Random().Next(0, AnzahlOK) + 1;
                int OKGetestet = 0;
                for (int i = 0; i < HöchsteWerte.Count; i++)
                {
                    if (HöchsteWerte[i])
                        OKGetestet++;
                    if (OKGetestet == AnzahlOK)
                        return i;
                }
            }
            catch
            {
            }
            return -1;
        }

        private List<List<Status>> MusterErstellen()
        {
            List<List<Status>> MusterListe = new List<List<Status>>();
            List<Status> Muster1 = new List<Status>();
            Muster1.Add(Status.Undefiniert); Muster1.Add(Status.Undefiniert); Muster1.Add(Status.Computer);
            Muster1.Add(Status.Computer); Muster1.Add(Status.Undefiniert);
            MusterListe.Add(Muster1);
            List<Status> Muster2 = new List<Status>();
            Muster2.Add(Status.Undefiniert); Muster2.Add(Status.Computer); Muster2.Add(Status.Undefiniert);
            Muster2.Add(Status.Computer); Muster2.Add(Status.Undefiniert);
            MusterListe.Add(Muster2);
            List<Status> Muster3 = new List<Status>();
            Muster3.Add(Status.Undefiniert); Muster3.Add(Status.Undefiniert); Muster3.Add(Status.Mensch);
            Muster3.Add(Status.Mensch); Muster3.Add(Status.Undefiniert);
            MusterListe.Add(Muster3);
            List<Status> Muster4 = new List<Status>();
            Muster4.Add(Status.Undefiniert); Muster4.Add(Status.Mensch); Muster4.Add(Status.Undefiniert);
            Muster4.Add(Status.Mensch); Muster4.Add(Status.Undefiniert);
            MusterListe.Add(Muster4);
            return MusterListe;
        }

        public int ZugBerechnen()
        {
            //Kann gleich gewonnen werden?
            for (int i = 0; i < SpielFeld.Count; i++)
                if (!SpielFeld[i].IstSpalteVoll())
                    if (SpielFeld[i][SpielFeld[i].ObersterZug()].IstGewinnbringend())
                        return i;
            //Oder kann ein Sieg des Gegner verhindert werden?
            for (int i = 0; i < SpielFeld.Count; i++)
                if (!SpielFeld[i].IstSpalteVoll())
                    if (SpielFeld[i][SpielFeld[i].ObersterZug()].IstExtremGefährlich())
                        return i;
            //Gibt es vielleicht ein Muster das Beachtet werden muss?
            for (int i = 0; i < MusterListe.Count; i++)
                for (int j = 0; j < SpielFeld.Count; j++)
                    if (!SpielFeld[j].IstSpalteVoll())
                    {
                        int ZugMuster = 3;
                        if (i % 2 == 0)
                            ZugMuster = 2;
                        ZugMuster = SpielFeld[j][SpielFeld[j].ObersterZug()].MusterErkennen(MusterListe[i], ZugMuster);
                        if (ZugMuster != -1)
                            return ZugMuster;
                    }
            //Dann wird mal das Gelernte angeschaut, vielleicht hilft es?
            int Erinnerung = -1;
            if (Gelerntes != null)
                Erinnerung = Gelerntes.FeldTesten(SpielFeld);
            if (Erinnerung != -1)
                return Erinnerung;
            //Es wird berechnet welche Züge dumm sind
            List<int> DummeZüge = new List<int>();
            List<int> KlugeZüge = new List<int>();
            for (int i = 0; i < SpielFeld.Count; i++)
                if (!SpielFeld[i].IstSpalteVoll())
                {
                    VierGewinnt TestFeld = SpielFeld.Klonen();
                    TestFeld[i].ZugSetzen(Status.Computer);
                    if (!TestFeld[i].IstSpalteVoll())
                    {
                        TestFeld[i].ZugSetzen(Status.Mensch);
                        TestFeld.GewinnerDesSpiels(Status.Mensch);
                        if (TestFeld.Gewinner == Status.Mensch)
                            DummeZüge.Add(i);
                        else
                            KlugeZüge.Add(i);
                    }
                    else
                        KlugeZüge.Add(i);
                }
            //Unterobjekte werden erstellt um zu Berechnen welcher Zug am geeignetsten ist
            ToredUnterObjekte ObersterObjekt = new ToredUnterObjekte(SpielFeld.Klonen(), VierGewinnt.Schwierigkeitsgrad, Status.Mensch, KlugeZüge);
            ObersterObjekt.WertDesZugesBerechnen();
            List<int> werte = new List<int>();
            for (int i = 0; i < ObersterObjekt.Count; i++)
                werte.Add(ObersterObjekt[i].WertDesZuges);
            int HöchsterWert = HöchstenWertBerechnen(werte);
            if (HöchsterWert != -1)
                if (!IstZugDumm(KlugeZüge[HöchsterWert]))
                    return KlugeZüge[HöchsterWert];
            //Alles hat nichts gebracht? Testen!
            if (KlugeZüge.Count > 0)
                return KlugeZüge[0];
            //Najo, man muss auch verlieren können...
            if (DummeZüge.Count > 0)
                return DummeZüge[0];
            throw new Exception("Alle Spalten voll?!?");
        }

        private bool IstZugDumm(int Spalte)
        {
            VierGewinnt TestFeld = SpielFeld.Klonen();
            TestFeld[Spalte].ZugSetzen(Status.Computer);
            if (TestFeld[Spalte].IstSpalteVoll())
                return true;
            TestFeld[Spalte].ZugSetzen(Status.Mensch);
            TestFeld.GewinnerDesSpiels(Status.Mensch);
            return (TestFeld.Gewinner == Status.Mensch);
        }
        #endregion
    }
}

Die jetztige KI, nicht selbst gemacht aber nicht wirklich das wahre. 2-3 sind akzeptable Schwierigkeitsgrade. Ab 3 ists nicht mehr so genial, was sie mahct;)

Und die genaue Zusammensetzung der DB:

Code:
      '* die einzelnenTabelle anlegen
      '* ACHTUNG! richtige Typen verwenden, adVarChar z.B. ergibt Fehler
      '* REIHENFOLGE der Tabellen so wählen, dass Beziehungen gelegt werdn können, d.h. immer bereits beide Tabellen existieren
      Dim listFields As List(Of clsTableField)
      Dim PrimaryFields As List(Of String)
      'Dim IndexFields As List(Of String)
      Dim KeyFields As List(Of clsKeyField)
      Dim DefaultRows As List(Of String)

      '* tabSchwierigkeit
      'Dim fld As New clsTableField("xxName", DataTypeEnum.adVarWChar, 100)
      'listFields.Add(fld)
      listFields = New List(Of clsTableField)
      listFields.Add(New clsTableField("IDSchwierigkeit", DataTypeEnum.adInteger))
      listFields.Add(New clsTableField("BeschrSchwierigkeit", DataTypeEnum.adVarWChar, 50))
      PrimaryFields = New List(Of String)
      PrimaryFields.Add("IDSchwierigkeit")
      DefaultRows = New List(Of String)
      DefaultRows.Add("1,Schwer")
      DefaultRows.Add("2,Mittel")
      DefaultRows.Add("3,Einfach")
      fCreateAccessTable(sDbNameWithPath, "tabSchwierigkeit", listFields, PrimaryFields, , , DefaultRows)

      '* tabSpielStatus
      listFields = New List(Of clsTableField)
      listFields.Add(New clsTableField("IDSpielStatus", DataTypeEnum.adInteger))
      listFields.Add(New clsTableField("BeschrSpielStatus", DataTypeEnum.adVarWChar, 50))
      PrimaryFields = New List(Of String)
      PrimaryFields.Add("IDSpielStatus")
      DefaultRows = New List(Of String)
      DefaultRows.Add("1, Spieler 1 am Zug")
      DefaultRows.Add("2, Spieler 2 am Zug")
      DefaultRows.Add("0, Ende des Spiels")
      fCreateAccessTable(sDbNameWithPath, "tabSpielStatus", listFields, PrimaryFields, , , DefaultRows)

      '* tabSpieler     SuchtGegner
      listFields = New List(Of clsTableField)
      listFields.Add(New clsTableField("IDSpieler", DataTypeEnum.adInteger, , True))
      listFields.Add(New clsTableField("NameSpieler", DataTypeEnum.adVarWChar, 100))
      listFields.Add(New clsTableField("SuchtGegner", DataTypeEnum.adBoolean))
      PrimaryFields = New List(Of String)
      PrimaryFields.Add("IDSpieler")
      DefaultRows = New List(Of String)
      DefaultRows.Add("Computer,0")
      fCreateAccessTable(sDbNameWithPath, "tabSpieler", listFields, PrimaryFields, , , DefaultRows)

      '* tabSpiel
      listFields = New List(Of clsTableField)
      listFields.Add(New clsTableField("IDSpiel", DataTypeEnum.adInteger, , True))
      listFields.Add(New clsTableField("IDSpieler1", DataTypeEnum.adInteger))
      listFields.Add(New clsTableField("IDSpieler2", DataTypeEnum.adInteger))
      listFields.Add(New clsTableField("IDSchwierigkeit", DataTypeEnum.adInteger))
      listFields.Add(New clsTableField("IDSpielStatus", DataTypeEnum.adInteger))
      listFields.Add(New clsTableField("IDSpielerSieger", DataTypeEnum.adInteger, , , True))
      PrimaryFields = New List(Of String)
      PrimaryFields.Add("IDSpiel")
      KeyFields = New List(Of clsKeyField)
      KeyFields.Add(New clsKeyField("IDSpieler1", "tabSpieler", "IDSpieler"))
      KeyFields.Add(New clsKeyField("IDSpieler2", "tabSpieler", "IDSpieler"))
      KeyFields.Add(New clsKeyField("IDSchwierigkeit", "tabSchwierigkeit", "IDSchwierigkeit"))
      KeyFields.Add(New clsKeyField("IDSpielStatus", "tabSpielStatus", "IDSpielStatus"))
      KeyFields.Add(New clsKeyField("IDSpielerSieger", "tabSpieler", "IDSpieler"))
      fCreateAccessTable(sDbNameWithPath, "tabSpiel", listFields, PrimaryFields, , KeyFields)

      '* tabZüge
      listFields = New List(Of clsTableField)
      listFields.Add(New clsTableField("IDSpiel", DataTypeEnum.adInteger))
      listFields.Add(New clsTableField("IDSpieler", DataTypeEnum.adInteger))
      listFields.Add(New clsTableField("IDZug", DataTypeEnum.adSmallInt))
      listFields.Add(New clsTableField("IDZeile", DataTypeEnum.adSmallInt))
      listFields.Add(New clsTableField("IDSpalte", DataTypeEnum.adSmallInt))
      listFields.Add(New clsTableField("ZeitInSekunden", DataTypeEnum.adDouble))
      PrimaryFields = New List(Of String)
      PrimaryFields.Add("IDSpiel")
      PrimaryFields.Add("IDSpieler")
      PrimaryFields.Add("IDZug")
      KeyFields = New List(Of clsKeyField)
      KeyFields.Add(New clsKeyField("IDSpiel", "tabSpiel", "IDSpiel"))
      KeyFields.Add(New clsKeyField("IDSpieler", "tabSpieler", "IDSpieler"))
      fCreateAccessTable(sDbNameWithPath, "tabZug", listFields, PrimaryFields, , KeyFields)

      '* tabTeamStatus
      listFields = New List(Of clsTableField)
      listFields.Add(New clsTableField("IDTeamStatus", DataTypeEnum.adInteger, , True))
      listFields.Add(New clsTableField("TeamStatusDescription", DataTypeEnum.adVarWChar, 100))
      PrimaryFields = New List(Of String)
      PrimaryFields.Add("IDTeamStatus")
      DefaultRows = New List(Of String)
      DefaultRows.Add("Kein Team mehr")
      DefaultRows.Add("Am Spielen")
      DefaultRows.Add("Spiel fertig")
      DefaultRows.Add("Einer will nochmal spielen")
      DefaultRows.Add("Das gegenüber hat zgesagt")
      fCreateAccessTable(sDbNameWithPath, "tabTeamStatus", listFields, PrimaryFields, , , DefaultRows)

      '*tabConfig
      listFields = New List(Of clsTableField)
      listFields.Add(New clsTableField("IDConfig", DataTypeEnum.adInteger, , True))
      listFields.Add(New clsTableField("conTime", DataTypeEnum.adInteger))
      listFields.Add(New clsTableField("conColumn", DataTypeEnum.adInteger))
      PrimaryFields = New List(Of String)
      PrimaryFields.Add("IDConfig")
      DefaultRows = New List(Of String)
      DefaultRows.Add("5,5")
      DefaultRows.Add("5,7")
      DefaultRows.Add("5,9")
      DefaultRows.Add("10,5")
      DefaultRows.Add("10,7")
      DefaultRows.Add("10,9")
      DefaultRows.Add("8,5")
      DefaultRows.Add("8,7")
      DefaultRows.Add("8,9")
      fCreateAccessTable(sDbNameWithPath, "tabConfig", listFields, PrimaryFields, , , DefaultRows)

      '* tabTeam
      listFields = New List(Of clsTableField)
      listFields.Add(New clsTableField("IDTeam", DataTypeEnum.adInteger, , True))
      listFields.Add(New clsTableField("IDSpieler1", DataTypeEnum.adInteger))
      listFields.Add(New clsTableField("IDSpieler2", DataTypeEnum.adInteger))
      listFields.Add(New clsTableField("IDTeamStatus", DataTypeEnum.adInteger))
      listFields.Add(New clsTableField("IDConfig", DataTypeEnum.adInteger))
      PrimaryFields = New List(Of String)
      PrimaryFields.Add("IDTeam")
      KeyFields = New List(Of clsKeyField)
      KeyFields.Add(New clsKeyField("IDTeamStatus", "tabTeamStatus", "IDTeamStatus"))
      KeyFields.Add(New clsKeyField("IDSpieler1", "tabSpieler", "IDSpieler"))
      KeyFields.Add(New clsKeyField("IDSpieler2", "tabSpieler", "IDSpieler"))
      KeyFields.Add(New clsKeyField("IDConfig", "tabConfig", "IDConfig"))
      fCreateAccessTable(sDbNameWithPath, "tabTeam", listFields, PrimaryFields, , KeyFields)



      '*tabHighscore
      listFields = New List(Of clsTableField)
      listFields.Add(New clsTableField("IDScore", DataTypeEnum.adInteger, , True))
      listFields.Add(New clsTableField("IDSpiel", DataTypeEnum.adInteger))
      listFields.Add(New clsTableField("IDSpieler", DataTypeEnum.adInteger))
      listFields.Add(New clsTableField("Score", DataTypeEnum.adDouble))
      PrimaryFields = New List(Of String)
      PrimaryFields.Add("IDScore")
      KeyFields = New List(Of clsKeyField)
      KeyFields.Add(New clsKeyField("IDSpiel", "tabSpiel", "IDSpiel"))
      KeyFields.Add(New clsKeyField("IDSpieler", "tabSpieler", "IDSpieler"))
      fCreateAccessTable(sDbNameWithPath, "tabHighscore", listFields, PrimaryFields, , KeyFields)

Und die mit ganz viel Überlegung eingesetzten Properties. Ist halt unser erstes richtiges Projekt und so ganz schön ist halt die Architektur nicht geworden, daher greifen wir auf viel Kontroll variablen zu. Aber es sind alle Einstellungen, deren Veränderng sinvoll ist(Von der Hintergrundfarbe bis zur MSGBOX(Auch mal selbst gemacht)) zentral, also nicht 10mal suchen und ändern. Und Code auch ein paar mal zerschnipselt und abstrahiert, da es sonst recht kompliziert und unübersichtlich wurde.
Code:
   'Public clsBerechnen As clsKI
   Public clsSpiel As New clsIdSpiel
   Public clsOptions As New clsOptionen
   Public clsTime As New clsZeit

   Public Class clsZeit
      ''' <summary>
      ''' Zeit, die für den Zug gebraucht wurde
      ''' </summary>
      ''' <remarks></remarks>
      Private _dZeit As Double
      Property dZeit() As Double
         Get
            Return _dZeit
         End Get
         Set(ByVal value As Double)
            _dZeit = value
         End Set
      End Property
   End Class
   Public Class clsOptionen
      Private _sLastTab As String
      Property sLastTab() As String
         Get
            Return _sLastTab
         End Get
         Set(ByVal value As String)
            Dim b As Boolean = False
            For Each TAB As TabPage In MainForm.tabSpiel.TabPages
               If TAB.Name = value Then
                  _sLastTab = value
                  b = True
                  Exit For
               End If
            Next
            If b = False Then
               fMsgBox("Der Name des aktuellen Tabs konnte nicht abgelegt werden, da er nicht existiert!", , MsgBoxStyle.Critical)
            End If
         End Set
      End Property
      Private _nTime As Integer
      Property nTime() As Integer
         Get
            Return _nTime
         End Get
         Set(ByVal value As Integer)
            _nTime = value
         End Set
      End Property
      ''' <summary>
      ''' Pfad des Siegertons
      ''' </summary>
      ''' <remarks></remarks>
      Private _sPathMedia As String
      Property sPathMedia() As String
         Get
            Return _sPathMedia
         End Get
         Set(ByVal value As String)
            _sPathMedia = value
         End Set
      End Property
      Private _bUnbegrenzt As Integer
      Property bUnbegrenzt() As Integer
         Get
            Return _bUnbegrenzt
         End Get
         Set(ByVal value As Integer)
            _bUnbegrenzt = value
         End Set
      End Property
      ''' <summary>
      ''' 1 = Kreis 2 = Viereck
      ''' </summary>
      ''' <remarks></remarks>
      Private _nForm As Integer
      Property nForm() As Integer
         Get
            Return _nForm
         End Get
         Set(ByVal value As Integer)
            _nForm = value
         End Set
      End Property
      ''' <summary>
      ''' Color des LAbes wenn Spieler 1
      ''' </summary>
      ''' <remarks></remarks>
      Private _colorLBL1 As Color
      Property colorLBL1() As Color
         Get
            Return _colorLBL1
         End Get
         Set(ByVal value As Color)
            _colorLBL1 = value
         End Set
      End Property
      ''' <summary>
      ''' Color des Labels wenn Spieler 2
      ''' </summary>
      ''' <remarks></remarks>
      Private _colorLBL2 As Color
      Property colorLBL2() As Color
         Get
            Return _colorLBL2
         End Get
         Set(ByVal value As Color)
            _colorLBL2 = value
         End Set
      End Property
      ''' <summary>
      ''' Interval des Timers und Zugzeit
      ''' </summary>
      ''' <remarks></remarks>
      Private _nInterval As Integer
      Property nInterval() As Integer
         Get
            Return _nInterval
         End Get
         Set(ByVal value As Integer)
            _nInterval = value
         End Set
      End Property
      ''' <summary>
      ''' Anzahlspalten
      ''' !Nicht als Arry -> -1!
      ''' </summary>
      ''' <remarks></remarks>
      Private _nSpalten As Integer
      Property nSpalten() As Integer
         Get
            Return _nSpalten
         End Get
         Set(ByVal value As Integer)
            _nSpalten = value
         End Set
      End Property
      ''' <summary>
      ''' Schwierigkeits Id
      ''' 1-3, aufsteigend
      ''' </summary>
      ''' <remarks></remarks>
      Private _nIdSchwierigkeit
      Property nIdSchwierigkeit() As Integer
         Get
            Return _nIdSchwierigkeit
         End Get
         Set(ByVal value As Integer)
            _nIdSchwierigkeit = value
         End Set
      End Property
      ''' <summary>
      ''' Farbe Spieler1
      ''' </summary>
      ''' <remarks></remarks>
      Private _colorSpieler1 As Color
      Property colorSpieler1() As Color
         Get
            Return _colorSpieler1
         End Get
         Set(ByVal value As Color)
            _colorSpieler1 = value
         End Set
      End Property
      ''' <summary>
      ''' Farbe SPieler 2
      ''' </summary>
      ''' <remarks></remarks>
      Private _colorSpieler2 As Color
      Property colorSpieler2() As Color
         Get
            Return _colorSpieler2
         End Get
         Set(ByVal value As Color)
            _colorSpieler2 = value
         End Set
      End Property
   End Class
   Public Class clsIdSpiel
      ''' <summary>
      ''' Wenn der KiThread fertig ist -> true
      ''' </summary>
      ''' <remarks></remarks>
      Private _bFinished As Boolean
      Property bFinished() As Boolean
         Get
            Return _bFinished
         End Get
         Set(ByVal value As Boolean)
            _bFinished = value
         End Set
      End Property
      ''' <summary>
      ''' Wenn gewonne -> true
      ''' </summary>
      ''' <remarks></remarks>
      Private _bGewonnen As Boolean
      Property bGewonnen() As Boolean
         Get
            Return _bGewonnen
         End Get
         Set(ByVal value As Boolean)
            _bGewonnen = value
         End Set
      End Property
      ''' <summary>
      ''' Wenn Computer spielt -> true
      ''' </summary>
      ''' <remarks></remarks>
      Private _bComputer As Boolean
      Property bComputer() As Boolean
         Get
            Return _bComputer
         End Get
         Set(ByVal value As Boolean)
            _bComputer = value
         End Set
      End Property
      ''' <summary>
      ''' Status des Teams
      ''' </summary>
      ''' <remarks>
      ''' 1 = Kein Team mehr
      ''' 2 = Am Spielen
      ''' 3 = Spiel fertig
      ''' 4 = Einer will nochmal spielen
      ''' 5 = Das gegenüber hat zugesagt
      ''' </remarks>
      Private _nTeamStatus As Integer
      Property nTeamStatus() As Integer
         Get
            Return _nTeamStatus
         End Get
         Set(ByVal value As Integer)
            _nTeamStatus = value
         End Set
      End Property
      ''' <summary>
      ''' Wenn SPieler von Gegner gewählt wurd -> Lan
      ''' </summary>
      ''' <remarks></remarks>
      Private _bWurdeGewaehlt As Boolean
      Property bWurdeGewaehlt() As Boolean
         Get
            Return _bWurdeGewaehlt
         End Get
         Set(ByVal value As Boolean)
            _bWurdeGewaehlt = value
         End Set
      End Property
      ''' <summary>
      ''' Id des Teams, dem man angehört -> Lan
      ''' </summary>
      ''' <remarks></remarks>
      Private _lIDTem As Long
      Property lIDTeam() As Long
         Get
            Return _lIDTem
         End Get
         Set(ByVal value As Long)
            _lIDTem = value
         End Set
      End Property
      ''' <summary>
      ''' Wenn man Lan spielt -> True
      ''' </summary>
      ''' <remarks></remarks>
      Private _bExtern As Boolean
      Property bExtern() As Boolean
         Get
            Return _bExtern
         End Get
         Set(ByVal value As Boolean)
            _bExtern = value
         End Set
      End Property
      ''' <summary>
      ''' ID des aktuellen SPiels
      ''' </summary>
      ''' <remarks></remarks>
      Private _lIdSpiel As Long
      Property lIdSpiel() As Long
         Get
            Return _lIdSpiel
         End Get
         Set(ByVal value As Long)
            _lIdSpiel = value
         End Set
      End Property
      ''' <summary>
      ''' ID des Spieler Eins
      ''' </summary>
      ''' <remarks></remarks>
      Private _lIdSpieler1 As Long
      Property lIdSpieler1() As Long
         Get
            Return _lIdSpieler1
         End Get
         Set(ByVal value As Long)
            _lIdSpieler1 = value
         End Set
      End Property
      ''' <summary>
      ''' Id des Spielers 2
      ''' </summary>
      ''' <remarks></remarks>
      Private _lIdSpieler2 As Long
      Property lIdSpieler2() As Long
         Get
            Return _lIdSpieler2
         End Get
         Set(ByVal value As Long)
            _lIdSpieler2 = value
         End Set
      End Property
      ''' <summary>
      ''' AnzahlZüge des Spielers 2
      ''' </summary>
      ''' <remarks></remarks>
      Private _nIdSpieler2Zug As Integer
      Property nIdSpieler2Zug() As Integer
         Get
            Return _nIdSpieler2Zug
         End Get
         Set(ByVal value As Integer)
            _nIdSpieler2Zug = value
         End Set
      End Property
      ''' <summary>
      ''' Anzahl Züge des Spielers 1
      ''' </summary>
      ''' <remarks></remarks>
      Private _nIdSpieler1Zug As Integer
      Property nIdSpieler1Zug() As Integer
         Get
            Return _nIdSpieler1Zug
         End Get
         Set(ByVal value As Integer)
            _nIdSpieler1Zug = value
         End Set
      End Property
      ''' <summary>
      ''' Name des SPielers 1
      ''' </summary>
      ''' <remarks></remarks>
      Private _sTextSpieler1 As String
      Property sTextSpieler1() As String
         Get
            Return _sTextSpieler1
         End Get
         Set(ByVal value As String)
            _sTextSpieler1 = value
         End Set
      End Property
      ''' <summary>
      ''' Name des Spielers 2
      ''' </summary>
      ''' <remarks></remarks>
      Private _sTextSpieler2 As String
      Property sTextSpieler2() As String
         Get
            Return _sTextSpieler2
         End Get
         Set(ByVal value As String)
            _sTextSpieler2 = value
         End Set
      End Property
      ''' <summary>
      ''' Id des Siegers
      ''' </summary>
      ''' <remarks></remarks>
      Private _lIdSieger As Long
      Property lIdSieger() As Long
         Get
            Return _lIdSieger
         End Get
         Set(ByVal value As Long)
            _lIdSieger = value
         End Set
      End Property
      ''' <summary>
      ''' Spalte, in welche der Computer geworfen hat
      ''' </summary>
      ''' <remarks></remarks>
      Private _nSpalte As Integer
      Property nSpalte() As Integer
         Get
            Return _nSpalte
         End Get
         Set(ByVal value As Integer)
            _nSpalte = value
         End Set
      End Property
   End Class
   Class clsZug
      ''' <summary>
      ''' xy des aktuellen Zugs
      ''' </summary>
      ''' <param name="sRaw"></param>
      ''' <remarks></remarks>
      Sub New(ByVal sRaw As String)
         _x = Val(sRaw.Chars(3))
         _y = Val(sRaw.Chars(4))
      End Sub
      ''' <summary>
      ''' Spalte
      ''' </summary>
      ''' <remarks></remarks>
      Private _x As Integer
      Property x() As Integer
         Get
            Return _x
         End Get
         Set(ByVal value As Integer)
            _x = value
         End Set
      End Property
      ''' <summary>
      ''' Zeile
      ''' </summary>
      ''' <remarks></remarks>
      Private _y As Integer
      Property y() As Integer
         Get
            Return _y
         End Get
         Set(ByVal value As Integer)
            _y = value
         End Set
      End Property
   End Class

Z.B. Die hier, aber ist alles DRY and so on.
Code:
   ''' <summary>
   ''' Wieviel Zeilen
   ''' </summary>
   Public Const nZEILEN As Integer = 6
   ''' <summary>
   ''' Legt den Stein an den richtigen Platz
   ''' Geht immer eins rauf und überprüft, obs leer ist
   ''' Wenns leer ist, legt er einen Stein und überprüft
   ''' ob der obere Platz auch noch leer ist, wenn nicht, übergibt er False
   ''' und signalisiert somit, dass diese Spalte gesperrt werden soll.
   ''' </summary>
   ''' <param name="nx">Aktuelle Spalte</param>
   ''' <returns>True zum Spalte sperren, False wenns in der Spalte noch Platz hat</returns>
   ''' <remarks></remarks>
   Function fEinwurf(ByVal nx As Integer, ByVal frm As MainForm) As Boolean
      Dim dblTimer As Double
      Dim nTag As Integer
      nTag = frm.tmrSpiel.Tag
      Dim shpTemp As New OvalShape
      Dim shpRectangle As New RectangleShape
      Dim lSpieler As Long
      Dim nZug As Integer
      nTag = frm.tmrSpiel.Tag
      dblTimer = clsTime.dZeit
      dblTimer = (dblTimer * (clsOptions.nInterval / 1000))
      clsTime.dZeit = 0
      frm.tmrSpiel.Enabled = False
      frm.pnlOptionen.Enabled = False
      frm.cmdNeustart.Enabled = False
      frm.cmdGegner.Enabled = False
      frm.cmdPause.Enabled = True

      For ny = nZEILEN - 1 To 0 Step -1
         Dim nTagStein As Integer = 0
         If clsOptions.nForm = 1 Then
            shpTemp = fTag(K_sPRAEFIX_KREIS & nx & ny, frm)
            nTagStein = shpTemp.Tag
         Else
            shpRectangle = fViereck(K_sPRAEFIX_VIERECK & nx & ny, frm)
            nTagStein = shpRectangle.Tag
         End If
         nTag = frm.tmrSpiel.Tag
         If nTagStein <> 0 Then

         ElseIf nTagStein = 0 Then
            If clsOptions.nForm = 1 Then
               shpTemp.Tag = nTag
            Else
               shpRectangle.Tag = nTag
            End If


            'Datenbankzugriff
            If clsOptions.nForm = 2 Then
               shpTemp.Visible = False
               shpRectangle = fViereck(K_sPRAEFIX_VIERECK & nx & ny, frm)
               shpRectangle.Visible = True
            ElseIf clsOptions.nForm = 3 Then
               frm.lblSymbol.Visible = True
            End If
            'Spieler 1
            If nTag = 1 Then
               If clsOptions.nForm = 1 Then
                  shpTemp.BackColor = clsOptions.colorSpieler1
               ElseIf clsOptions.nForm = 2 Then
                  shpRectangle.BackColor = clsOptions.colorSpieler1
               Else
                  shpRectangle.BackgroundImage = frm.shpSonne.BackgroundImage
               End If

               If clsOptions.nForm = 1 Or clsOptions.nForm = 2 Then
                  If clsOptions.colorSpieler1 = MyColor.BlauS Then
                     frm.lblSpieler.ForeColor = clsOptions.colorLBL2
                  ElseIf clsOptions.colorSpieler2 = MyColor.SchwarzS Then
                     frm.lblSpieler.ForeColor = clsOptions.colorLBL2
                  End If
               Else
                  frm.lblSpieler.ForeColor = MyColor.SchwarzS
                  frm.lblSymbol.Text = "Mond ist am Zug"
                  frm.lblSpieler.BackColor = Color.Transparent
               End If

               lSpieler = clsSpiel.lIdSpieler1
               nZug = clsSpiel.nIdSpieler1Zug
               clsSpiel.nIdSpieler1Zug += 1
               frm.tmrSpiel.Tag = 2
               fStatusSet(1)
               frm.lblZug.Text = "Zug: " & clsSpiel.nIdSpieler1Zug
               frm.lblSpieler.Text = clsSpiel.sTextSpieler2 & " ist am Zug"

               If clsOptions.nForm = 1 Or clsOptions.nForm = 2 Then
                  frm.lblSpieler.BackColor = clsOptions.colorSpieler2
               Else
                  frm.lblSpieler.ForeColor = MyColor.SchwarzS
               End If

               'Spieler 2
            ElseIf nTag = 2 Then
               fStatusSet(2)

               If clsOptions.nForm = 1 Then
                  shpTemp.BackColor = clsOptions.colorSpieler2
               ElseIf clsOptions.nForm = 2 Then
                  shpRectangle.BackColor = clsOptions.colorSpieler2
               Else
                  shpRectangle.BackgroundImage = frm.shpMond.BackgroundImage
               End If

               If clsOptions.nForm = 1 Or clsOptions.nForm = 2 Then
                  If clsOptions.colorSpieler1 = MyColor.BlauS Then
                     frm.lblSpieler.ForeColor = clsOptions.colorLBL1
                  ElseIf clsOptions.colorSpieler2 = MyColor.SchwarzS Then
                     frm.lblSpieler.ForeColor = clsOptions.colorLBL1
                  End If
               Else
                  frm.lblSymbol.Text = "Sonne ist am Zug"
                  frm.lblSpieler.ForeColor = MyColor.SchwarzS
                  frm.lblSpieler.BackColor = Color.Transparent
               End If

               lSpieler = clsSpiel.lIdSpieler2
               nZug = clsSpiel.nIdSpieler2Zug
               clsSpiel.nIdSpieler2Zug += 1
               frm.tmrSpiel.Tag = 1
               frm.lblZug.Text = "Zug: " & clsSpiel.nIdSpieler2Zug
               frm.lblSpieler.Text = clsSpiel.sTextSpieler1 & " ist am Zug"

               If clsOptions.nForm = 1 Or clsOptions.nForm = 2 Then
                  frm.lblSpieler.BackColor = clsOptions.colorSpieler1
               Else
                  frm.lblSpieler.ForeColor = MyColor.SchwarzS
               End If
            End If

            If clsOptions.nForm = 1 Then
               pZoomKreis(shpTemp.Name, frm)
            Else
               pZoomViereck(shpRectangle.Name, frm)
            End If

            clsSpiel.lIdSieger = lSpieler
            If clsSpiel.bExtern = False Or nTag = 1 Then
               modDBZugriff.fZugSet(clsSpiel.lIdSpiel, lSpieler, nZug, ny, nx, dblTimer)
            End If
            ny -= 1
            If ny >= 0 Then
               Return False
            Else
               Return True
            End If
         End If
      Next ny
   End Function


---------- Beitrag hinzugefügt um 12:10 ---------- Vorheriger Beitrag war um 10:53 ----------

Mal ne Frage, soll ich die 4100Zeilen Code einfach mal hier posten? Hab sonst irgendwie k.p. wie ich das sonst machen soll??
 
Zuletzt bearbeitet:
Hardwareluxx setzt keine externen Werbe- und Tracking-Cookies ein. Auf unserer Webseite finden Sie nur noch Cookies nach berechtigtem Interesse (Art. 6 Abs. 1 Satz 1 lit. f DSGVO) oder eigene funktionelle Cookies. Durch die Nutzung unserer Webseite erklären Sie sich damit einverstanden, dass wir diese Cookies setzen. Mehr Informationen und Möglichkeiten zur Einstellung unserer Cookies finden Sie in unserer Datenschutzerklärung.


Zurück
Oben Unten refresh