Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

18.01.2006, 20:57

4 gewinnt programmieren...

Hallo zusammen

Da mir in der Schule doch sehr oft langweilig ist, und ich somit Zeit habe, habe ich mich entschlossen, 4 gewinnt auf meinem Taschenrechner (Texas Instruments Voyage 200) zu programmieren (natürlich keine KI, sonder nur PVP). Die Programmiersprache auf meinem TR ist sehr wahrscheinlich nicht alzu bekannt, aber ihr könnt mir einfach das ganze in C++ (kenne ich zumindest) erklären. Es gibt recht viele Befehle (wie Schleifen, if-Abfragen, Arrays [aber nur eindimensionale],etc ) auch in dieser Programmiersprache.
Zum Problem: Ich sollte eine Abfrage programmieren, ob jemand gewonnen hat, allerdings sollte das sehr schnell gehen, da der TR nur mit ca. 12 MHz operiert und dem entsprechend langsam ist... :( Wie könnte man das ganze machen? Habt ihr mir da einen kleinen Gedankenanstoss, oder vlt sogar einen Quellcodeausschnitt? Wäre sehr dankbar :)

MfG P!Nh3aD

Anonymous

unregistriert

2

18.01.2006, 21:22

12 Mhz? Das reicht doch locker um ein 10x10 2D-Array durchzuchecken? Wenn Du damals einen 486dx2 hattest, dann weißte das die paar Mhz mehr zwischen deinen Taschenrechner und einer 77Mhz CPU kein spürbar gravierender Unterschied für so eine Abfrage ist ;)

- Patrick, der nur Casio benutzt

3

18.01.2006, 21:28

Zitat

Es gibt recht viele Befehle (wie Schleifen, if-Abfragen, Arrays [aber nur eindimensionale],etc ) auch in dieser Programmiersprache.

Du hast meinen Text wohl nicht alzu genau gelesen, wenn überhaupt! Es gibt keine mehrdimensionalen Arrays. Zudem besteht ein 4 gewinnt-Feld normalerweise aus 6*7 Feldern...
Ich wäre froh, wenn ich einen Lösungsvorschlage bekommen könnte, und nicht nur eine einschätzung der Geschwindigkeit!

Anonymous

unregistriert

4

18.01.2006, 21:38

Okay, Du hast variablen und 1D Arrays. Gut.

Nehmen wir mal an du erstellst ein 2D Array stellst es aber als 1D Array dar:

C-/C++-Quelltext

1
2
3
4
5
6
const unsigned long width  = 6;
const unsigned long height = 7;
unsigned char map_[width*height];

for (unsigned long i=0; i<width*height; ++i)
    map_[i] = 0; // 0 ist leer, 1 ist Spieler 1 und 2 ist Spieler 2.


Somit hast Du schon mal Dein "Spielfeld".

Jetzt die Frage ob Du Funktionen haben darfst, wenn JA, sage ich: Gut!

Dann schreibst Du 3 Funktionen:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
bool checkHorizontal (void)
{
        // Jede Zeile durchgehen und gucken ob irgendeiner 4 Paar hat, wenn ja, return (true);

    for (...)

        // Aktueller Spieler hat keine Reihe hier, ergo: Nichts.

    return (false);
}


C-/C++-Quelltext

1
2
3
4
5
6
7
8
bool checkVertikal (void)
{
        // Jede Spalte durchgehen und gucken ob irgendeiner 4 Paar hat, wenn ja, return (true);

    for (...)

        // Aktueller Spieler hat keine Spalte hier, ergo: Nichts.

    return (false);
}


C-/C++-Quelltext

1
2
3
4
5
6
7
8
bool checkDiagonal (void)
{
        // Jede Diagonale durchgehen und gucken ob irgendeiner 4 Paar hat, wenn ja, return (true);

    for (...)

        // Aktueller Spieler hat keine Diagonale hier, ergo: Nichts.

    return (false);
}


So die stopfste dann in NAND-Verknüpfung nach Wahrscheinlichkeiten, Wahrscheinlicher ist das eine Horizontale bzw. Diagonale Reihe als eine Vertikale reihe, wenn 4 Gewinnt schon mal gezockt hat. Dadurch spart man sich im Idealfall sehr viel Rechenzeit

ergo:

C-/C++-Quelltext

1
2
3
4
5
    // Teste ob aktueller Spieler gewonnen hat:

if (checkHorizontal () || checkDiagonal() || checkVertikal())
{
    // Aktueller Spieler hat gewonnen!

}


- Patrick, der hofft das das reicht.

5

18.01.2006, 22:00

Vielen Dank für deine Hilfe. Ja, es gibt Funktionen und ich sage auch gut! :) Leider habe ich mich etwas ungenau ausgedrückt... Mein Problem sind eigentlich die for-Schleifen! Kannst du mir da auch weiterhelfen?

MfG P!Nh3aD

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

6

18.01.2006, 22:02

Man kann ein 1D array 2D durchgehen durch:

C-/C++-Quelltext

1
2
3
for(short x = 0; x < xmax; x++)
for(short y = 0; y < ymax; y++)
     array[x * arraybreite + y]
PRO Lernkurs "Wie benutze ich eine Doku richtig"!
CONTRA lasst mal die anderen machen!
networklibbenc - Netzwerklibs im Vergleich | syncsys - Netzwerk lib (MMO-ready) | Schleichfahrt Remake | Firegalaxy | Sammelsurium rund um FPGA&Co.

Anonymous

unregistriert

7

18.01.2006, 22:09

Nox
Ja, aber ist die Frage ob das so "gut" ist. Besser einzeln durchgehen.

Nebenbei ist deine Berechnung falsch :D So gehst Du nicht von Links nach Rechts sondern von Oben nach Unten.

P!Nh3aD
Also nehmen wir als beispiel mal die Horizontale:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
unsigned long gamer = 1; // Gamer beinhaltet den aktuellen Spieler, also 1 = Spieler 1 und 2 = Spieler 2


    // Jede Reihe durchgehen

for (unsigned long i=0; i<height; ++i)
{
        // Erstes 4-er Pack testen 

    if (map_[i*width + 0] == gamer &&
        map_[i*width + 1] == gamer &&
        map_[i*width + 2] == gamer &&
        map_[i*width + 3] == gamer) return (true);

        // Zweites 4-er Pack testen 

    if (map_[i*width + 1] == gamer &&
        map_[i*width + 2] == gamer &&
        map_[i*width + 3] == gamer &&
        map_[i*width + 4] == gamer) return (true);

        // Drittes 4-er Pack testen 

    if (map_[i*width + 2] == gamer &&
        map_[i*width + 3] == gamer &&
        map_[i*width + 4] == gamer &&
        map_[i*width + 5] == gamer) return (true);

        // Fünftes 4-er Pack testen 

    if (map_[i*width + 3] == gamer &&
        map_[i*width + 4] == gamer &&
        map_[i*width + 5] == gamer &&
        map_[i*width + 6] == gamer) return (true);

    return (false);
}

Easy? Easy! Hab die innere schleife mal weg gelassen, da sie glaub ich nur langsamer wäre auf 12 Mhz und man so leichter verständnis für die Thematik findet :)

8

18.01.2006, 22:14

Big Thx!! Hat mir echt sehr geholfen.

Anonymous

unregistriert

9

18.01.2006, 22:18

So jetzt musst du nur noch das Einfügen des Blöckchens machen und Du hast Dein 4 gewinnt ;) Ist aber auch relativ easy.

10

18.01.2006, 22:32

Naja, bin erst seit ca. 5 monaten am programmieren, und das im Selbsstudium! Kann an meiner Schule leider kein Programmierkurs besuchen... :( Ausser diesen TopPascal-Kurs ( :o ), den man jedoch nicht als programieren bezeichnen kann :S

EDIT: Was meinst du mit Blöckchen?

Werbeanzeige