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

little_Progger

Treue Seele

  • »little_Progger« ist der Autor dieses Themas

Beiträge: 188

Wohnort: Nähe Bielefeld

Beruf: Azubi

  • Private Nachricht senden

1

12.08.2009, 12:13

Unauffindbares Problem mit kleinem experiment

Hab mir letztens mal wieder ein Sudoku (wer kennts nicht?) geschnappt und mir gedacht das man das ja eig. auch mit mehrdimensionalen arrays bauen und füllen kann und habe mich die gesamte nacht dran gesetzt und schritt für schritt alles zsm. gebaut und es geschafft das feld zu bauen und auch eine abfrage genau wie im buch zu bauen aber wenn ich nun:
(die abfrage der koordinaten für das zu besetzende feld)
x-Pos (1 - 14): 2
y-Pos (1 - 14): 3
(an dieser stelle beginnt sich dieser eine abfragesatz unendlich zu wiederholen)
"x-Pos (1 - 14)"

ohne die zahl mit der man sie gefüllt hat (ich sags nur dazu falls es was zu bedeuten hat)

aber ich gebe euch erstmal den quelltext damit ihr euch ein eigenes bild davon machen könnt. aber ich möchte euch vorher noch sagen das das programm vom compiler compiliert wird und es kein (für mich) offensichtlicher fehler ist, wie sich sicher schon beim lesen meines problems herrausgestellt hat.



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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
#include <iostream>

using namespace std;

struct CGame
{
    bool Besetzt;
    char Name[30];
};
const int Breite = 13;
const int Hoehe = 13;
CGame FeldBesetzt[Breite][Hoehe];

void BerechneLevel1 ();
void besetzeFeld ();
void GameMenue ();

int main ()
{
    char Eingabe;
    
    do 
    {
        cout << "\n\n";
        cout << "Menue" << endl;
        cout << "-----" << endl;
        cout << "1. Sudoku spielen" << endl;
        cout << "2. Programm beenden" << endl;
        cout << "\a\n";
        cin >> Eingabe;
        cout << "\n\n";

        if (Eingabe == '1') 
            GameMenue ();
        else if (Eingabe == '2')
            cout << "Danke fürs Spielen" << endl;
        else 
            cout << "Falsche Eingabe!" << endl;
    }while (Eingabe != '2');

    return 0;
}

void GameMenue ()
{

    char Eingabe;

    cout << "\n\n";
    cout << "Sudoku" << endl;
    cout << "-----------" << endl;
    cout << "Welchen schwierigkeitsgrad wollen sie spielen?" << endl;
    cout << "Schwiergkeit '1'" << endl;
    cout << "\n";
    cin >> Eingabe;
    cout << "\n\n";

    if (Eingabe == '1')
        BerechneLevel1 ();
    else 
        cout << "Falsche Eingabe!" << endl;
}


void BerechneLevel1 ()
{
    char Auswahl;

    for (int y=0; y<Breite; y++)
    {
        for (int x=0; x<Hoehe; x++)
        {
            if (x == 0)
                cout << "|";
            else if (x == 4)
                cout << "|";
            else if (x == 8)
                cout << "|";
            else if (x == 12)
                cout << "|";

            else if (y == 0)
                cout << "-";
            else if (y == 4)
                cout << "-";
            else if (y == 8)
                cout << "-";
            else if (y == 12)
                cout << "-";


                else if (FeldBesetzt[x][y].Besetzt == true)
                    cout << FeldBesetzt[x][y].Name;  
                
                if (FeldBesetzt[x][y].Besetzt == false)
                {
                // Erstellt das Level

                if ((x == 1) && (y == 1))
                    cout << ".";
                else if ((x == 2) && (y == 1))
                    cout << "7";
                else if ((x == 3) && (y == 1))
                    cout << "3";
                else if ((x == 5) && (y == 1))
                    cout << ".";
                else if ((x == 6) && (y == 1))
                    cout << ".";
                else if ((x == 7) && (y == 1))
                    cout << "5";
                else if ((x == 9) && (y == 1))
                    cout << "6";
                else if ((x == 10) && (y == 1))
                    cout << ".";
                else if ((x == 11) && (y == 1))
                    cout << ".";    
                else if ((x == 1) && (y == 2))
                    cout << ".";
                else if ((x == 2) && (y == 2))
                    cout << "1";
                else if ((x == 3) && (y == 2))
                    cout << "2";
                else if ((x == 5) && (y == 2))
                    cout << ".";
                else if ((x == 6) && (y == 2))
                    cout << ".";
                else if ((x == 7) && (y == 2))
                    cout << "7";
                else if ((x == 9) && (y == 2))
                    cout << "3";
                else if ((x == 10) && (y == 2))
                    cout << ".";
                else if ((x == 11) && (y == 2))
                    cout << "5";    
                else if ((x == 1) && (y == 3))
                    cout << ".";
                else if ((x == 2) && (y == 3))
                    cout << "4";
                else if ((x == 3) && (y == 3))
                    cout << ".";
                else if ((x == 5) && (y == 3))
                    cout << ".";
                else if ((x == 6) && (y == 3))
                    cout << "1";
                else if ((x == 7) && (y == 3))
                    cout << "8";
                else if ((x == 9) && (y == 3))
                    cout << "2";
                else if ((x == 10) && (y == 3))
                    cout << ".";
                else if ((x == 11) && (y == 3))
                    cout << ".";    
                else if ((x == 1) && (y == 5))
                    cout << "2";
                else if ((x == 2) && (y == 5))
                    cout << "6";
                else if ((x == 3) && (y == 5))
                    cout << ".";
                else if ((x == 5) && (y == 5))
                    cout << ".";
                else if ((x == 6) && (y == 5))
                    cout << "4";
                else if ((x == 7) && (y == 5))
                    cout << ".";
                else if ((x == 9) && (y == 5))
                    cout << ".";
                else if ((x == 10) && (y == 5))
                    cout << ".";
                else if ((x == 11) && (y == 5))
                    cout << "8";    
                else if ((x == 1) && (y == 6))
                    cout << "3";
                else if ((x == 2) && (y == 6))
                    cout << "9";
                else if ((x == 3) && (y == 6))
                    cout << ".";
                else if ((x == 5) && (y == 6))
                    cout << "6";
                else if ((x == 6) && (y == 6))
                    cout << ".";
                else if ((x == 7) && (y == 6))
                    cout << "1";
                else if ((x == 9) && (y == 6))
                    cout << ".";
                else if ((x == 10) && (y == 6))
                    cout << "5";
                else if ((x == 11) && (y == 6))
                    cout << "2";    
                else if ((x == 1) && (y == 7))
                    cout << "4";
                else if ((x == 2) && (y == 7))
                    cout << ".";
                else if ((x == 3) && (y == 7))
                    cout << ".";
                else if ((x == 5) && (y == 7))
                    cout << ".";
                else if ((x == 6) && (y == 7))
                    cout << "2";
                else if ((x == 7) && (y == 7))
                    cout << ".";
                else if ((x == 9) && (y == 7))
                    cout << ".";
                else if ((x == 10) && (y == 7))
                    cout << "6";
                else if ((x == 11) && (y == 7))
                    cout << "9";    
                else if ((x == 1) && (y == 9))
                    cout << ".";
                else if ((x == 2) && (y == 9))
                    cout << ".";
                else if ((x == 3) && (y == 9))
                    cout << "4";
                else if ((x == 5) && (y == 9))
                    cout << "8";
                else if ((x == 6) && (y == 9))
                    cout << "3";
                else if ((x == 7) && (y == 9))
                    cout << ".";
                else if ((x == 9) && (y == 9))
                    cout << ".";
                else if ((x == 10) && (y == 9))
                    cout << "7";
                else if ((x == 11) && (y == 9))
                    cout << ".";    
                else if ((x == 1) && (y == 10))
                    cout << "7";
                else if ((x == 2) && (y == 10))
                    cout << ".";
                else if ((x == 3) && (y == 10))
                    cout << "9";
                else if ((x == 5) && (y == 10))
                    cout << "1";
                else if ((x == 6) && (y == 10))
                    cout << ".";
                else if ((x == 7) && (y == 10))
                    cout << "8";
                else if ((x == 9) && (y == 10))
                    cout << "2";
                else if ((x == 10) && (y == 10))
                    cout << ".";
                else if ((x == 11) && (y == 10))
                    cout << ".";    
                else if ((x == 1) && (y == 11))
                    cout << ".";
                else if ((x == 2) && (y == 11))
                    cout << ".";
                else if ((x == 3) && (y == 11))
                    cout << "6";
                else if ((x == 5) && (y == 11))
                    cout << "9";
                else if ((x == 6) && (y == 11))
                    cout << ".";
                else if ((x == 7) && (y == 11))
                    cout << ".";
                else if ((x == 9) && (y == 11))
                    cout << "5";
                else if ((x == 10) && (y == 11))
                    cout << "4";
                else if ((x == 11) && (y == 11))
                    cout << ".";    
                }
        }
        cout << endl;
    }

    cout << "\n\n\n";
    cout << "Feld besetzen: " << endl;
    besetzeFeld ();
    cout << "Programm verlassen? " << endl;
    cout << "'J' Ja und 'N' Nein" << endl;
    cin >> Auswahl;

    if (Auswahl == 'J')
        cout << "Auf Wiedersehen!" << endl;
    else if (Auswahl == 'j')
        cout << "Auf Wiedersehen!" << endl;
    else if (Auswahl == 'N')
        BerechneLevel1 ();
    else if (Auswahl == 'n')
        BerechneLevel1 ();
    else BerechneLevel1 ();
}

void besetzeFeld ()
{
    int y=0;
    int x=0;

    do
    {
        cout << "x-Pos (1-" << Breite+1 << "): ";
        cin >> x;
        cout << endl;
    }while (x<1 || x>Breite+1);

    do 
    {
        cout << "y-Pos (1-" << Hoehe+1 << "): ";
        cin >> y;
        cout << endl;
    }while (y<1 || y>Hoehe+1);

    cout << "Welche Zahl soll das Feld haben?\n";
    cin.get (FeldBesetzt[x-1][y-1].Name, 29);
    cin.ignore ();
    FeldBesetzt[x-1][x-1].Besetzt = true;
}


ich möchte von euch keine vorschläge haben wie ich das mit den else if bedingungen lösen kann!!!
das will ich selber von kapitel zu kapitel verbessern!
also bitte nicht mekern das ich das gesamte level mit 81 einzelnen bedingungen erstellt habe.
Dieses Programm ist dazu gedacht das ich es selber immer weiter verbessern kann.
Danke!

also ich konzentriere mich mich im moment sehr auf die letzte funktion
void besetzeFeld ()
den das programm wiederholt sich noch vor der abfrage direkt nach der funktion ob das spiel beended werden soll.
ich hoffe ihr könnt mir helfen
Danke schon mal vorne weg.

2

12.08.2009, 13:11

ich würds mal mit einzelschrittdebuging versuchen aber ich seh den fehler nicht
Gewinnen ist, wenn man einmal mehr aufsteht, als man zu Boden geht.

little_Progger

Treue Seele

  • »little_Progger« ist der Autor dieses Themas

Beiträge: 188

Wohnort: Nähe Bielefeld

Beruf: Azubi

  • Private Nachricht senden

3

12.08.2009, 13:12

ich bin erst anfang 7 und weis noch nichts über debugging :-(

Aber falls es euch interessiert:

(Link)



So sollte es aussehen aber wenn ich nun unten zwei koordinaten eingebe fragt er schon die namensangabe (also die Zahl die in das sudoku feld eingesetzt werden soll) nicht mehr ab und wiederholt immer wieder den oben genannten satz: x-Pos (1 - 14):

little_Progger

Treue Seele

  • »little_Progger« ist der Autor dieses Themas

Beiträge: 188

Wohnort: Nähe Bielefeld

Beruf: Azubi

  • Private Nachricht senden

4

12.08.2009, 13:46

Ich fress einen besen!

ich dachte immer das der debug modus der sicherere ist aber ich hab das teil einfach mal im release compiliert und jetzt läuft es einwandfrei!

gibt zwar noch kleine bugs und die version ist auch noch nicht wirklich toll aber es erfüllt seinen zweck :-)

Falls ihr es mal testen wollt:
http://www.file-upload.net/download-1821…ku-v1.0.7z.html
(Ich hab euch den Quelltext auch reingepackt)

Und falls ihr es mal testet müsst ihr die zeilen in der version noch selber zählen und dann angeben...das muss ich unter anderem noch fixen und eine zeilen angabe machen...

Also wie schon im Buch erwähnt und als kleine erweiterung zu dem Satz von Heiko Kalista (...Ihr solltet also immer euer Programm so oft wie möglich im Debug und Release Mode compilieren und testen um fehler zu vermeiden die ihr später nicht mehr finded oder nur sehr schwer da der Debug mode viele Fehler einfach abhält...)

Und ich möchte dazu nur noch sagen das ihr das wirklich tun müsst da es auch umgekehrt sein kann und das programm nur im release mode läuft...

naja ich hab draus gelernt :-)

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

5

12.08.2009, 14:13

Junge junge... der Quellcode killt jeden Vertrag! :shock:

Das Gurke

Community-Fossil

Beiträge: 1 996

Wohnort: Pinneberg

Beruf: Schüler

  • Private Nachricht senden

6

12.08.2009, 14:17

Überleg dir doch mal, wie man mit hilfe von zwei for Schleifen schonmal die "Umrandungen" des Spielfelds malen könnte. Fertig? Gut ;)

Ich weiß ja jetzt nicht wie weit du bist, aber wenn du schon Arrays kennst, überleg dir doch mal wie man die Zahlen mit Hilfe eines 2D Arrays malen könnte.

Und dann brichst du hoffentlich auch über der unlesbaren Version deines Code zusammen ;)

Ist nicht böse gemeint oder so, aber der Code ist wirklich ... sehr gut optimierbar.

Edit: Ausgehend von dem was du gepostet hast, ich hab leider kein 7z und den Code daher nicht geladen.

little_Progger

Treue Seele

  • »little_Progger« ist der Autor dieses Themas

Beiträge: 188

Wohnort: Nähe Bielefeld

Beruf: Azubi

  • Private Nachricht senden

7

12.08.2009, 14:18

ich weiß xD

eigentlich ja nichts besonderes und auch nicht wirklich lang aber die ganzen bedingungen machen ihn sehr trocken und langweilig xD

naja ich wusste mir aber anders nicht zu helfen um jedes feld einzeln anzusprechen und ihm eine zahl oder eine trennlinie zu zuweisen...
naja wenn ich so weit bin das ich das teil so programmieren kann wie David Scherfgen´s (ASCII-Blocks) dann wird das um einiges besser und einfacher zu besetzen^^

so hat das programm ja noch viele bugs und es gibt manchmal probleme beim ansprechen der einzelnen felder aber sonst tut es schon das was ich wollte ^^

Hier für dich die einzelnen datein nicht im paket:
http://www.file-upload.net/download-1821…u-v1.0.exe.html
http://www.file-upload.net/download-1821638/main.cpp.html

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

8

12.08.2009, 14:21

Der Fehler liegt in diesen Zeilen:

C-/C++-Quelltext

1
2
    cin.get (FeldBesetzt[x-1][y-1].Name, 29); 
    cin.ignore (); 


Das Return vom vorhergehenden input liegt noch im stream drinnen. Wenn du jetzt cin.get aufrufst wird es gleich als erstes dieses Return sehen und einen leeren String zurückliefern. Das führt dazu dass das failbit des Stream gesetzt wird und von da an sämtliche Einleseoperationen auf cin fehlschlagen (du müsstest das failbit abfragen und cin.clear() aufrufen) was wiederum dazu führt dass dein Programm in eben dieser Endlosschleife hängen bleibt.

Lösung: ignore vor das get packen

C-/C++-Quelltext

1
2
    cin.ignore (); 
    cin.get(FeldBesetzt[x-1][y-1].Name, 29); 

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

9

12.08.2009, 14:22

Also wenn es im Release mode klappt, aber im Debug nicht, dann ist das ein Fall für undefiniertes Verhalten und du solltest dir das doch genauer anschauen.. :roll:

btw:
Im Buch kommst du nicht so weit, dass du so etwas, wie ASCII Blocks machen kannst. Dafür musst du die WinAPI Konsolen Funktionen benutzen. (oder halt ein geeignetes Framework dafür).

Das findest du alles hier:
http://msdn.microsoft.com/en-us/library/ms682010%28VS.85%29.aspx

little_Progger

Treue Seele

  • »little_Progger« ist der Autor dieses Themas

Beiträge: 188

Wohnort: Nähe Bielefeld

Beruf: Azubi

  • Private Nachricht senden

10

12.08.2009, 14:25

Mir macht programmieren spaß und das wird wohl nicht das einzige buch bleiben mit dem ich lernen werde ;-)

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
// C++ für Spieleprogrammierer

// Listing 5.6

// Strukturen erzeugen und verwenden

//

#include <iostream>

using namespace std;

// Hauptprogramm

//

int main ()
{
    // Strukturen

    //

    struct S_Spieler
    {
        int Energie;
        char Name[30];
    };

    // Variablen

    //

    S_Spieler Spieler1;
    S_Spieler Spieler2;

    // Daten der Spieler abfragen

    cout << "Name des ersten Spielers: ";
    cin.get (Spieler1.Name, 29);

    cout << "Energie des ersten Spielers: ";
    cin >> Spieler1.Energie;

    cin.ignore ();

    cout << "Name des zweiten Spielers: ";
    cin.get (Spieler2.Name, 29);

    cout << "Energie des zweiten Spielers: ";
    cin >> Spieler2.Energie;

    cout << endl;

    // Ausgabe der Daten

    cout << "Spieler 1:" << endl;
    cout << "Name: " << Spieler1.Name << endl;
    cout << "Energie: " << Spieler1.Energie << "\n\n";

    cout << "Spieler 2:" << endl;
    cout << "Name: " << Spieler2.Name << endl;
    cout << "Energie: " << Spieler2.Energie << "\n\n";

    return 0;
}


ich dachte mir das das nicht so die rolle spielt da is in diesem beispiel aus dem buch auch einmal nach dem ersten cin.get () gesetzt wurde und somit nicht viel falsch gehen könnte aber ich habe es eben automatisch so gemacht wie du meintest aber im debug modus läuft das auch nicht (jedenfalls bei mir nicht) aber im release schon (habs zwar noch nicht ohne das was du gesagt hast getestet im release mode.

Werbeanzeige