Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Suchen einer Lösung in mehrdimensinalen array

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 < [ 2 ] [ 3 ]
000
19.08.2003, 16:37 Uhr
~andreasK
Gast


Hi

hab folgendes Problem hab ein array game[6][7] groß jetzt will ich dass ich dort diagonal suche wann ich vier punkte in einer reihe hab für mein vier gewinnt, weis nicht wie ich das am besten anstelle, da ich nicht mit festen werten arbeiten will!

Gruß
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
19.08.2003, 17:10 Uhr
virtual
Sexiest Bit alive
(Operator)


eigentlich kann eine 4er Kombination ja immer nur im Zusammenhang mit dem zuletzt gelegten Stein zusammenhängen, oder?

Dann würde ich so eine Abfrage etwa so gestalten (vorsicht: nicht getestet!):

C++:
class Spielbrett
{
    static const unsigned BREITE = 7;
    static const unsigned HOEHE = 6;

    enum BELEGUNG
    {
        LEER,
        GELB,
        ROT
    };

    BELEGUNG feld[BREITE][HOEHE];

    bool sindEsVier(unsigned b, unsigned h)
    {
        BELEGUNG f;  
        int c;

        if (b>=BREITE || h>=HOEHE || LEER==(f=feld[ b ][h])) return fakse;

        // Test waagerecht
        c = 1;
        for(i=1; c<4 && i<4 && b+i<BREITE; ++i, ++c) if (feld[b+i][h]!=f) break;
        for(i=1; c<4 && i<4 && b-i+1>0; ++i, ++c) if (feld[b-i][h]!=f) break;
        if (c>=4) return true;
        // Test senkrecht
        c = 1;
        for(i=1; c<4 && i<4 && h+i<HOEHE; ++i, ++c) if (feld[ b ][h+i]!=f) break;
        for(i=1; c<4 && i<4 && h-i+1>0; ++i, ++c) if (feld[ b ][h-i]!=f) break;
        if (c>=4) return true;
        // Test rechts oben -> links unten
        c = 1;
        for(i=1; c<4 && i<4 && h+i<HOEHE && b+i<BREITE; ++i, ++c) if (feld[b+i][h+i]!=f) break;
        for(i=1; c<4 && i<4 && h-i+1>0 && b-i+1>0; ++i, ++c) if (feld[b-i][h-i]!=f) break;
        if (c>=4) return true;  
        // Test rechts unten -> links oben
        c = 1;
        for(i=1; c<4 && i<4 && h-i+1>0 && b+i<BREITE; ++i, ++c) if (feld[b+i][h-i]!=f) break;
        for(i=1; c<4 && i<4 && h+i<HOEHE && b-i+1>0; ++i, ++c) if (feld[b-i][h+i]!=f) break;
        if (c>=4) return true;
        
        return false;
    }
};



Natürlich kann man das auch besser machen (indem man b und h vorher prüft, wie sehr sie am Rand liegen, lassen sich eine Reihe von Prüfungen sparen)
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)

Dieser Post wurde am 19.08.2003 um 17:16 Uhr von virtual editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
19.08.2003, 20:50 Uhr
~Anfänger00
Gast


@virtual:
ich sah darin eine gute übung für mich.
Kannst du mir sagen ob meine Lösung eine Alternative wäre oder ob
es sich hier um sehr schlechten Stiel+Denkfehler handelt?

C++:
#include <iostream>
using namespace std;
#define Leer 0
#define Spieler1 1
#define Spieler2 2

class Spielbrett
{
static const unsigned SPALTE = 6;
static const unsigned ZEILE = 7;

int SindEsVier(unsigned int Feld[SPALTE][ZEILE])

for(int i=0;i<SPALTE;i++)
{
if(Feld[i][ZEILE-1]==Leer)break;//wenn unten leer -> ganze Spalte leer
else
for(int j=0;j<ZEILE;j++)
{
//Test von unten nach oben
if(!j+3>=ZEILE)//Damit kein nicht existierendes Feld geprüft wird
{
if(Feld[i][j]==Spieler1 && Feld[i][j+1]==Spieler1 &&
               Feld[i][j+2]==Spieler1 && Feld[i][j+3]==Spieler1)
               return Spieler1;
if(Feld[i][j]==Spieler2 && Feld[i][j+1]==Spieler2 &&
               Feld[i][j+2]==Spieler2 && Feld[i][j+3]==Spieler2)
               return Spieler2;
}
//Test von links nach rechts
if(!i+3>=SPALTE)
{
if(Feld[i][j]==Spieler1 && Feld[i+1][j]==Spieler1 &&
               Feld[i+2][j]==Spieler1 && Feld[i+3][j]==Spieler1)
               return Spieler1;
if(Feld[i][j]==Spieler2 && Feld[i+1][j]==Spieler2 &&
               Feld[i+2][j]==Spieler2 && Feld[i+3][j]==Spieler2)
               return Spieler2;
}
//Test von links unten nach rechts oben
if(!i+3>=SPALTE || !j+3>=ZEILE)
{
if(Feld[i][j]==Spieler1 && Feld[i+1][j+1]==Spieler1 &&
               Feld[i+2][j+2]==Spieler1 && Feld[i+3][j+3]==Spieler1)
               return Spieler1;
if(Feld[i][j]==Spieler2 && Feld[i+1][j+1]==Spieler2 &&
               Feld[i+2][j+2]==Spieler2 && Feld[i+3][j+3]==Spieler2)
               return Spieler2;
}              
//Test von links oben nach rechts unten
if(!i-3>=0 || !j+3>ZEILE-1)
{
if(Feld[i][j]==Spieler1 && Feld[i+1][j-1]==Spieler1 &&
               Feld[i+2][j-2]==Spieler1 && Feld[i+3][j-3]==Spieler1)
               return Spieler1;
if(Feld[i][j]==Spieler2 && Feld[i+1][j-1]==Spieler2 &&
               Feld[i+2][j-2]==Spieler2 && Feld[i+3][j-3]==Spieler2)
               return Spieler2;
}                                            
if(Feld[i][j]==0)break;
else break;
}
}
return Leer;
}


ich hätte natürlich noch Spalte und Zeile vertauschen müssen,hätte glaub ich noch ein wenig eingesparrt..
Ich würde mich über eine Antwort sehr freuen

MFG Anfänger++
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
19.08.2003, 21:14 Uhr
virtual
Sexiest Bit alive
(Operator)


Ich denke, wenn Du sowas schreibst:

C++:
if(!i+3>=SPALTE) ...


Meinst Du eigentlich:

Zitat:

Wenn es nicht zutrifft, daß i + 3 größer oder gleich SPALTE ist, dann...


Um diese Aussage genau abzubilden müßtest Du beachten, daß der ! - Operator stärker bindet als das +; eigentlich willst Du schreiben:

C++:
if (!(i+3>=SPALTE)) ...


Aber eigentlich könnte man ja gleich sagen:

Zitat:

Wenn es zutrifft, daß i + 3 kleiner als SPALTE ist, dann...


Ist nicht nur in der deutschen Sprache einfacher zu verstehen, sondern auch im Quelltext:

C++:
if (i+3<SPALTE) ...



Weiterhin solltest Du - grade bei etwas geschachtelten Dingen - nicht meinen schlechten Stil kopieren und die Geschweiften Klammern fortlassen. Dann fallen Dir vielleicht eher mal solche Sachen auf:

C++:
if(Feld[ i ][j]==0)break;
else break;


Also doch einfach "break;". Ob das jetzt das gewünschte ist, weiß ich auch nicht...

Vom Gedankengang ist das sicherlich iO, was Du da machst, aber ob es übersichtlich ist? Warum zB packst Du alles in eine Schleife, obwohl mal für die Diagonalen die Eckbereich auf jeweils zwei Seiten den Spielbrettes auf jedenfall ausklammern könnte (Ich glaube, du versuchst das mit dem if(!i ...)): Die If abfrage könnte man sich also mit einer geeigneteren, gesonderten Schleife schenken.

Schließlich: Auf die defines würde ich verzichten, die Haben gegenüber einem enum eigentlich nur Nachteile (jedenfalls in dem Anwendungsgebiet einfache Konstanten definieren zu wollen).

Ich denke aber, wenn Du ein Anfänger bist, kann man Dir das alles verzeihen (also nicht traurig sein wgen der Kritik, so werden vermutlich meine Programme auch mal ausgesehen haben!)
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)

Dieser Post wurde am 19.08.2003 um 21:15 Uhr von virtual editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
19.08.2003, 21:27 Uhr
~Anfänger00
Gast


Danke für die tipps!
Ich dachte wenn ich weniger Schleifen verwende wird das Programm
schneller,das mit dem define hab ich übrigens von stefan zerbst,
der macht das in seinem Buch halt so...
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
19.08.2003, 23:24 Uhr
~wissender
Gast


Stefan Zerbst hat einen schrecklichen Programmierstil, er glaubt er würde C++ schreiben, dabei schreibt er C mit C++-Anteilen :-)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
19.08.2003, 23:37 Uhr
Pablo
Supertux
(Operator)


Und was ist denn das Problem? Ich programmiere auch in "C" Stil und verwende C++ Sachen von C++ wie Klassen oder Templates, nur wenn ich sie brauche. Warum soll das schrecklicher Programmierstil?
--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!

Dieser Post wurde am 19.08.2003 um 23:38 Uhr von Pablo Yanez Trujillo editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
20.08.2003, 00:00 Uhr
0xdeadbeef
Gott
(Operator)


Du vermischst zwei völlig unterschiedliche Konzepte. Das mag für kleine Programme egal sein, aber wenn du bei größeren Projekten keinen einheitlichen Programmierstil findest, passen nachher die Schnittstellen nicht vernünftig zusammen und du kriegst so einen Wust wie COM.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
20.08.2003, 00:12 Uhr
Pablo
Supertux
(Operator)


In Wirklichkeit benutze ich nur cpp Dateien. Aber das Einlesen von der Tastatur mache ich nur mit scanf und nicht mit cin>>. Ausgeben tue ich auch nur mit printf() und nicht mit cout <<. Scanf und printf sind für mich besser und schneller zu bedienen. Mit cout muss man ständig << schreiben und die Zeichenketten werden dabei "gespalten". Ich mag mehr die ganze Zeichenkette zu sehen. Das ist was ich mit C Stil.
--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
20.08.2003, 08:39 Uhr
virtual
Sexiest Bit alive
(Operator)


Also ich habe von Stefan Zerbst bisher noch kaum was gutes gehört, jedenfalls was C++ angeht. Aber letztlich hab ich nie was von ihm gelesen, daher kann ich es nicht beurteilen.
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ] [ 3 ]     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: