You are not logged in.

  • Login

1

Tuesday, June 7th 2011, 4:19pm

[nur Hilfe und konstruktive, angemessene Kritik] TicTacToe (Schüler)

Also, hab mich mal an TicTacToe versucht, und, was ist, es macht nicht immer das was es soll, hab die brutale Methode genommen, alles durchzugehen, kann mir jemand helfen den Fehler zu finden? Ich weiß, ist nicht die beste Methode, aber vorher, wo nicht alles drin war, hats gefuntzt, und nicht ärgern, hab den Quelltext schon verschönert...
Außerdem wäre ich froh, wenn mir jemand sagen könnte, wie ich eine KI baue, bei der man auch verlieren kann? (nicht zu 100% Unentschieden spielen oder Verlieren) Danke schon mal im voraus :D
Steht nur im Dateianhang, weil es über 15.000 Zeichen geht...

Wer sich meinen schlechten programmierstil nochmal angucken möchte, für den lass ich den Dateianhang da, wer besseren sehen will wartet bis zum Wochenende...

edit: hab vom Sturm noch erledigt drin gehabt (nicht wichtig), werde heute irgendwann wahrscheinlich, die bessere Version posten (vielleicht auch morgen).
mfg gn0m
gn0m has attached the following file:
  • ttt.cpp.txt (17.88 kB - 31 times downloaded - latest: Apr 3rd 2012, 3:35pm)

This post has been edited 5 times, last edit by "gn0m" (Jun 10th 2011, 11:32am)


2

Tuesday, June 7th 2011, 4:23pm

Highlighte den Code aber zu aller erst: finde selbst die Problemstelle indem du mit 'nem Debugger drüber gehst.

3

Tuesday, June 7th 2011, 4:24pm

??? geht nicht, habs als .txt hochgeladen, wird irgendwo in der KI sein, nur habs nicht gefunden, kompilieren lässt es sich ja...
edit: vielleicht ist kompiler noch interessant, benutze den g++ auf Linux Open Suse 11.4
ein Fehler mal eben so: Ich: 1 PC:5 Ich:2 PC:7 Ich 3 und gewonnen??? hab ich nicht gefunden den Fehler

This post has been edited 1 times, last edit by "gn0m" (Jun 7th 2011, 4:35pm)


4

Tuesday, June 7th 2011, 5:06pm

Niemand wird sich 15.000 Zeilen code einfach so geben
Wenn du der meinung bist das es bei der Überprüfung ist, dann poste doch einfach nur diesen Teil
UNd verwende unbedingt das Highlighting.
Dazu drückst du unten (über absenden) auf den knopf mit "C & C++"

Dann helfen wir dir gerne

5

Tuesday, June 7th 2011, 5:15pm

@Pocky Es geht über 15.000 Zeichen, nicht Zeilen, hab ich da aber auch geschrieben :D (Bin ich superman, das ich das an einem tag schaffe???), außerdem wär die .txt Datei dann größer :D Vielleicht füge ich einfach mal den Teil ein, den ich wichti finde, also die KI:
Am anfang das, zum verstehen:

C/C++ Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
bool BSpielfeld[3][3];
    //zur Überprüfung, ob ein Feld belegt ist
    char CSpielfeld[3][3];
    CSpielfeld[0][0] = '1';
    CSpielfeld[0][1] = '2';
    CSpielfeld[0][2] = '3';
    CSpielfeld[1][0] = '4';
    CSpielfeld[1][1] = '5';
    CSpielfeld[1][2] = '6';
    CSpielfeld[2][0] = '7';
    CSpielfeld[2][1] = '8';
    CSpielfeld[2][2] = '9';
    //Dient als Spielfeld und zur Anzeige der bereits gesetzten x und o
    bool KIZug; //Sorgt dafür, dass KI nur einmal ziehen darf
    bool control = false; // damit die erste if anweisung nur einmal ausgeführt wird


C/C++ Quellcode

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
if(control == false) //Start der KI, um den besten Startpunkt zu bekommen
        {
            if(CSpielfeld[0][0] == 'x')
            {
                CSpielfeld[1][1] = 'o';
                BSpielfeld[1][1] = true;
                KIZug = true;
            }
            if(CSpielfeld[0][1] == 'x')
            {
                CSpielfeld[1][1] = 'o';
                BSpielfeld[1][1] = true;
                KIZug = true;
            }
            if(CSpielfeld[0][2] == 'x')
            {
                CSpielfeld[1][1] = 'o';
                BSpielfeld[1][1] = true;
                KIZug = true;
            }
            if(CSpielfeld[1][0] == 'x')
            {
                CSpielfeld[1][1] = 'o';
                BSpielfeld[1][1] = true;
                KIZug = true;
            }
            if(CSpielfeld[1][1] == 'x')
            {
                CSpielfeld[0][0] = 'o';
                BSpielfeld[0][0] = true;
                KIZug = true;
            }
            if(CSpielfeld[1][2] == 'x')
            {
                CSpielfeld[1][1] = 'o';
                BSpielfeld[1][1] = true;
                KIZug = true;
            }
            if(CSpielfeld[2][0] == 'x')
            {
                CSpielfeld[1][1] = 'o';
                BSpielfeld[1][1] = true;
                KIZug = true;
            }
            if(CSpielfeld[2][1] == 'x')
            {
                CSpielfeld[1][1] = 'o';
                BSpielfeld[1][1] = true;
                KIZug = true;
            }
            if(CSpielfeld[2][2] == 'x')
            {
                CSpielfeld[1][1] = 'o';
                BSpielfeld[1][1] = true;
                KIZug = true;
            }
            control = true; // damits nur einmal ausgeführt wird
        }
// ab hier geht die KI alle möglichkeiten durch, also die brutale Methode
 
        if(CSpielfeld[0][2] && CSpielfeld[1][1]  == 'o' && KIZug == false) //Wenn 5 und 3 belege 7
        {
            if(BSpielfeld[2][0] != true)
            {
                CSpielfeld[2][0] = 'o';
                BSpielfeld[2][0] = true;
                KIZug = true;
            }
        }
 
        if(CSpielfeld[0][0] && CSpielfeld[0][1]  == 'o' && KIZug == false) //Wenn 1 und 2 belege 3
        {
            if(BSpielfeld[0][2] != true)
            {
                CSpielfeld[0][2] = 'o';
                BSpielfeld[0][2] = true;
                KIZug = true;
            }
        }
        if(CSpielfeld[2][0] && CSpielfeld[1][1]  == 'o' && KIZug == false) //Wenn 7 und 5 belege 3
        {
            if(BSpielfeld[0][2] != true)
            {
                CSpielfeld[0][2] = 'o';
                BSpielfeld[0][2] = true;
                KIZug = true;
            }
        }
        if(CSpielfeld[0][0] && CSpielfeld[1][0]  == 'o' && KIZug == false) //Wenn 1 und 4 belege 7
        {
            if(BSpielfeld[2][0] != true)
            {
                CSpielfeld[2][0] = 'o';
                BSpielfeld[2][0] = true;
                KIZug = true;
            } 
        }
        if(CSpielfeld[2][0] && CSpielfeld[1][0]  == 'o' && KIZug == false) //Wenn 7 und 4 belege 1 
        {
            if(BSpielfeld[2][2] != true)
            {
                CSpielfeld[2][2] = 'o';
                BSpielfeld[2][2] = true;
                KIZug = true;
            } 
        }
        if(CSpielfeld[1][1] && CSpielfeld[0][1]  == 'o' && KIZug == false) //Wenn 2 und 5 belege 8
        {
            if(BSpielfeld[2][1] != true)
            {
                CSpielfeld[2][1] = 'o';
                BSpielfeld[2][1] = true;
                KIZug = true;
            } 
        }
        if(CSpielfeld[2][2] && CSpielfeld[1][1]  == 'o' && KIZug == false) //Wenn 9 und 5 belege 1
        {
            if(BSpielfeld[0][0] != true)
            {
                CSpielfeld[0][0] = 'o';
                BSpielfeld[0][0] = true;
                KIZug = true;
            } 
        }
        if(CSpielfeld[0][0] && CSpielfeld[2][0]  == 'o' && KIZug == false) //Wenn 1 und 7 belege 4
        {
            if(BSpielfeld[1][0] != true)
            {
                CSpielfeld[1][0] = 'o';
                BSpielfeld[1][0] = true;
                KIZug = true;
            } 
        }
        if(CSpielfeld[2][0] && CSpielfeld[2][2]  == 'o' && KIZug == false) // wenn 7 und 9 belege 8
        {
            if(BSpielfeld[2][1] != true)
            {
                CSpielfeld[2][1] = 'o';
                BSpielfeld[2][1] = true;
                KIZug = true;
            } 
        }
        if(CSpielfeld[2][0] && CSpielfeld[2][1]  == 'o' && KIZug == false) // wenn 7 und 8 belege 9
        {
            if(BSpielfeld[2][2] != true)
            {
                CSpielfeld[2][2] = 'o';
                BSpielfeld[2][2] = true;
                KIZug = true;
            } 
        }
        if(CSpielfeld[2][2] && CSpielfeld[2][1]  == 'o' && KIZug == false) // Wenn 9 und 8 belege 7
        {
            if(BSpielfeld[2][0] != true)
            {
                CSpielfeld[2][0] = 'o';
                BSpielfeld[2][0] = true;
                KIZug = true;
            } 
        }
        if(CSpielfeld[0][2] && CSpielfeld[2][2]  == 'o' && KIZug == false) // Wenn 9 und 3 belege 6
        {
            if(BSpielfeld[1][2] != true)
            {
                CSpielfeld[1][2] = 'o';
                BSpielfeld[1][2] = true;
                KIZug = true;
            } 
        }
        if(CSpielfeld[0][2] && CSpielfeld[0][1]  == 'o' && KIZug == false) //Wenn 3 und 2 belege 1
        {
            if(BSpielfeld[0][0] != true)
            {
                CSpielfeld[0][0] = 'o';
                BSpielfeld[0][0] = true;
                KIZug = true;
            } 
        }
 
        if(CSpielfeld[0][2] && CSpielfeld[1][1]  == 'o' && KIZug == false) //Wenn 5 und 3 belege 7
        {
            if(BSpielfeld[2][0] != true)
            {
                CSpielfeld[2][0] = 'o';
                BSpielfeld[2][0] = true;
                KIZug = true;
            }
        }        
        if(CSpielfeld[0][0] && CSpielfeld[0][1]  == 'x' && KIZug == false) //Wenn 1 und 2 belege 3
        {
            if(BSpielfeld[0][2] != true)
            {
                CSpielfeld[0][2] = 'o';
                BSpielfeld[0][2] = true;
                KIZug = true;
            } 
        }
        if(CSpielfeld[2][0] && CSpielfeld[1][1]  == 'x' && KIZug == false) //Wenn 7 und 5 belege 3
        {
            if(BSpielfeld[0][2] != true)
            {
                CSpielfeld[0][2] = 'o';
                BSpielfeld[0][2] = true;
                KIZug = true;
            }
        }
        if(CSpielfeld[0][0] && CSpielfeld[1][0]  == 'x' && KIZug == false) //Wenn 1 und 4 belege 7
        {
            if(BSpielfeld[2][0] != true)
            {
                CSpielfeld[2][0] = 'o';
                BSpielfeld[2][0] = true;
                KIZug = true;
            } 
        }
        if(CSpielfeld[2][0] && CSpielfeld[1][0]  == 'x' && KIZug == false) //Wenn 7 und 4 belege 1 
        {
            if(BSpielfeld[2][2] != true)
            {
                CSpielfeld[2][2] = 'o';
                BSpielfeld[2][2] = true;
                KIZug = true;
            } 
        }
        if(CSpielfeld[1][1] && CSpielfeld[0][1]  == 'x' && KIZug == false) //Wenn 2 und 5 belege 8
        {
            if(BSpielfeld[2][1] != true)
            {
                CSpielfeld[2][1] = 'o';
                BSpielfeld[2][1] = true;
                KIZug = true;
            } 
        }
        if(CSpielfeld[2][2] && CSpielfeld[1][1]  == 'x' && KIZug == false) //Wenn 9 und 5 belege 1
        {
            if(BSpielfeld[0][0] != true)
            {
                CSpielfeld[0][0] = 'o';
                BSpielfeld[0][0] = true;
                KIZug = true;
            } 
        }
        if(CSpielfeld[0][0] && CSpielfeld[2][0]  == 'x' && KIZug == false) //Wenn 1 und 7 belege 4
        {
            if(BSpielfeld[1][0] != true)
            {
                CSpielfeld[1][0] = 'o';
                BSpielfeld[1][0] = true;
                KIZug = true;
            } 
        }
        if(CSpielfeld[2][0] && CSpielfeld[2][2]  == 'x' && KIZug == false) // wenn 7 und 9 belege 8
        {
            if(BSpielfeld[2][1] != true)
            {
                CSpielfeld[2][1] = 'o';
                BSpielfeld[2][1] = true;
                KIZug = true;
            } 
        }
        if(CSpielfeld[2][0] && CSpielfeld[2][1]  == 'x' && KIZug == false) // wenn 7 und 8 belege 9
        {
            if(BSpielfeld[2][2] != true)
            {
                CSpielfeld[2][2] = 'o';
                BSpielfeld[2][2] = true;
                KIZug = true;
            } 
        }
        if(CSpielfeld[2][2] && CSpielfeld[2][1]  == 'x' && KIZug == false) // Wenn 9 und 8 belege 7
        {
            if(BSpielfeld[2][0] != true)
            {
                CSpielfeld[2][0] = 'o';
                BSpielfeld[2][0] = true;
                KIZug = true;
            } 
        }
        if(CSpielfeld[0][2] && CSpielfeld[2][2]  == 'x' && KIZug == false) // Wenn 9 und 3 belege 6
        {
            if(BSpielfeld[1][2] != true)
            {
                CSpielfeld[1][2] = 'o';
                BSpielfeld[1][2] = true;
                KIZug = true;
            } 
        }
        if(CSpielfeld[0][2] && CSpielfeld[0][1]  == 'x' && KIZug == false) //Wenn 3 und 2 belege 1
        {
            if(BSpielfeld[0][0] != true)
            {
                CSpielfeld[0][0] = 'o';
                BSpielfeld[0][0] = true;
                KIZug = true;
            } 
        }
        if(CSpielfeld[0][0] && CSpielfeld[0][2]  == 'x' && KIZug == false) //Wenn 1 und 3 belege 2
        {
            if(BSpielfeld[0][1] != true)
            {
                CSpielfeld[0][1] = 'o';
                BSpielfeld[0][1] = true;
                KIZug = true;
            } 
        }

6

Tuesday, June 7th 2011, 5:30pm

Vollkommen falscher ansatz.
Du kannst doch nicht einfach alle Sachen Händisch durchprobieren.
Für sowas gibt es For-Schleifen (in deinem Fall müsstest du sie verschachteln)

7

Tuesday, June 7th 2011, 5:59pm

@Pocky Ich versuchs einfach mal in Klassen zu erstellen, verstehe nämlich noch immer einiges nicht in c++(templates, try-catch, und einige andere Funkionen), bitte nicht sauer sein wenn ich soviel frage, ok?
Habt Mitleid mit einem Schüler!!! (Nicht Student, das kommt erst ganz viel später)
mfg gn0m
edit: immerhin bin ich kein Scriptkiddie mehr, das kann ich nach über 3 Jahren festem lernen aller möglichen Sprachen behaupten, C++ kann ich davon am besten.

This post has been edited 1 times, last edit by "gn0m" (Jun 7th 2011, 6:07pm)


8

Tuesday, June 7th 2011, 9:27pm

Was für Fehler sollst du den haben?

ein Fehler mal eben so: Ich: 1 PC:5 Ich:2 PC:7 Ich 3 und gewonnen??? hab ich nicht gefunden den Fehler

Und wo ist da der Fehler?
Die Anwendung macht nur das was du programmeirt hast.

Ansonsten würde ich dir Dringen das Projekt neu zu machen und bevor du beginst schreib dir die Logik auf nen Blatt Papier.
->Versuche ähnlichen Programmierabschnitte durch einen kürzeren Code zu ersetzen.

Ne KI kannst du unter anderem mit Zuffalszahlen realisieren. (->srand, rand)

Mfg Rushh0ur

9

Wednesday, June 8th 2011, 5:12pm

Ja ich versteh ja schon:

C/C++ Quellcode

1
Moral--;

Hast ja recht.

Und hab ja geschrieben ich brauch Praxis, hab aber fast nur gelesen die 3 Jahre über...

Und eine for-Schleife besteht aus einer Initialisierung, einer Bedingung, und einer Aktion, Beispiel müsste gehen, habs noch nicht probiert, nochmal sry:

C/C++ Quellcode

1
2
3
4
5
6
7
8
9
for( ;KIZug == false; )
{
    int i = rand() % 9 + 1; // oder halt mit /dev/random für linux
    if(KIRandom[i] != 'x' || 'o')
{
    KIRandom[i] = 'o';
    KIZug = true;
}
}

Oder ist das auch eine schlechte Lösung?
@Pocky warum den Thread löschen? Stehen wir halt als schlechtes Beispiel da, zum Code: vom PC gelöscht...
@CJ, müssen ja keine Freunde sein, Frieden, Streit bringt nur Frust!?
@Alle anderen: ;( kommt nicht mehr vor so schnell vor, versprochen, hab mich zu schnell reingesteigert...
edit: @Pocky Warum sollte ich fragen was das soll, sehs ja ein, der Code ist ****, nur CJ hätte (wie ich das Wort 'hätte' liebe...),
es auch angemessen sagen können, denn ich steiger mich sehr schnell in Sachen rein, und dann wirds primitiv...

@edit, wird wohl Zeit es offen zu sagen, bringt ja nix es zu verschweigen, sonst versteht ihr in dem Forum mich nicht: Ich bin Asperger Autist (nicht erschrecken ), deshalb werde ich sehr, sehr, schnell aggressiv, ganz ehrlich, hatte die halbe Nacht trainiert nach dem Vorfall, bis ich irgendwann um 3 Uhr ca. müde ins Bett fiel...

This post has been edited 1 times, last edit by "gn0m" (Jun 8th 2011, 5:35pm)


10

Wednesday, June 8th 2011, 8:14pm

So oft durchlesen bis du alles verstanden hast!
Da sind jetzt einige Dinge etwas umständlich gelöst, zeigt aber recht schön wie man das realisieren kann.
Ist jetzt nicht 100% durchgetestet, Fehler können sich immer irgendwo einschleichen, aber eig muss es gehen.

C/C++ Quellcode

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
#include <iostream>
using namespace std;
 
int main(void)
{
	char feld[3][3] = 	{
							{'x', ' ', 'o'},
							{'x', 'o', 'x'},
							{'o', 'x', 'o'}
						}; //Ich geb mal ein Spielfeld vor, nen ganzes Eingabe-ding Programmier ich jetzt nicht
 
	int win[8][2]; //Wir haben 8 gewinnmöglichkeiten für 2 Spiele (3 Zeilen, 3 Reihen, 2 Diagonal)
	for(int i = 0; i < 8; i++)
	{
		win[i][0] = 0;
		win[i][1] = 0;
	} // Variablen niemals uninitialisiert lassen!
 
	for(int y = 0; y < 3; y++)
	{
		for(int x = 0; x < 3; x++)
		{
			cout << feld[y][x];
			if(x < 2)
			{
				cout << "|";
			}
		}
		if(y < 2)
		{
			cout << endl << "-----" << endl;
		}
	} // Dieses Konstrukt malt das Spielfeld
 
	cout << endl << endl;
 
	for(int y = 0; y < 3; y++)
	{
		for(int x = 0; x < 3; x++)
		{
			if(feld[y][x] == 'x')
			{
				win[y][0]++;
			}
			if(feld[y][x] == 'o')
			{
				win[y][1]++;
			}
		}
	}
 
	for(int y = 0; y < 3; y++)
	{
		for(int x = 0; x < 3; x++)
		{
			if(feld[y][x] == 'x')
			{
				win[x+3][0]++;
			}
			if(feld[y][x] == 'o')
			{
				win[x+3][1]++;
			}
		}
	}
 
	for(int x = 0; x < 3; x++)
	{
		if(feld[x][x] == 'x')
		{
			win[6][0]++;
		}
		if(feld[x][x] == 'o')
		{
			win[6][1]++;
		}
 
		if(feld[2-x][x] == 'x')
		{
			win[7][0]++;
		}
		if(feld[2-x][x] == 'o')
		{
			win[7][1]++;
		}
	}
 
	cout << "Zeile 1:    x: " << win[0][0] << " | o: " << win[0][1] << endl;
	cout << "Zeile 2:    x: " << win[1][0] << " | o: " << win[1][1] << endl;
	cout << "Zeile 3:    x: " << win[2][0] << " | o: " << win[2][1] << endl << endl;
 
	cout << "Spalte 1:   x: " << win[3][0] << " | o: " << win[3][1] << endl;
	cout << "Spalte 2:   x: " << win[4][0] << " | o: " << win[4][1] << endl;
	cout << "Spalte 3:   x: " << win[5][0] << " | o: " << win[5][1] << endl << endl;
 
	cout << "Diagonal:   x: " << win[6][0] << " | o: " << win[6][1] << "   ( oben links  -> unten rechts )" << endl;
	cout << "Diagonal:   x: " << win[7][0] << " | o: " << win[7][1] << "   ( oben rechts -> unten links  )" << endl << endl;
 
	for(int i = 0; i < 8; i++)
	{
		if(win[i][0] == 3)
		{
			cout << "x hat gewonnen" << endl;
			return(0);
		}
 
		if(win[i][1] == 3)
		{
			cout << "o hat gewonnen" << endl;
			return(0);
		}
	}
 
	cout << "Niemand hat gewonnen" << endl;
 
	return(0);
}

11

Wednesday, June 8th 2011, 9:54pm

Den hab ich schon zu 90% verstanden, war eine gute Lösung, nur auf die Idee wär ich nicht gekommen, danke...
edit: Muss Schluss machen für heute, bis Morgen.
@CJ: Wenn du was zu sagen hast bitte was produktives, oder lass es, du machst dir, wenn ich mich nicht täusche, grade nen sehr schlechten Ruf hier.

This post has been edited 1 times, last edit by "gn0m" (Jun 8th 2011, 10:22pm)


12

Friday, June 10th 2011, 12:58pm

Sry, für Doppelpost, aber sonst denkt jeder, dass hier sei erledigt. :D
Hab aber grad wohl nen Fehler, weil ich den Namen der Funktion nicht weiß.
Den Befehl, um Daten von dem typ FILE in int umzuwandeln, bwz. wie geht das?

@Pocky Ist klar, dass ichs nicht so gut wie du hinbekomme,
hab halt sehr wenig Praxis, fast nur Theorie, deshalb helfe ich viel, um Übung zu bekommen. :D


C/C++ Quellcode

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
for(bool random = true; random == true;)
{
    FILE *Zufallswert = fopen("/dev/random", "r");
    if (Zufallswert!=NULL)
    {
        n >> Zufallswert; // Hier ist der Fehler, kann mir einer sagen, wies geht bzw. richtig geht, oder kann man das casten, wohl eher nicht, oder?
        //-------------   ab hier wird, bzw. soll  :)  die Zahl ins Array umgerechnet werden.
        n %= 9 -1;
        if (n > 2)
        {
            m = n % 3;
        }            
        else{
            m = 0;
        }
        for(;n>2; n-3){};
    }
 
    if(feld[m][n] != 'x')
    {
        feld[m][n] = 'o';
        fclose (Zufallswert);
        random = false;
    }
}

13

Friday, June 10th 2011, 1:33pm

Ich wundere mich zwar warum du die C und nicht die C++ methode anwendest, aber gut
http://www.cplusplus.com/reference/clibrary/cstdio/fread/
Wenn du englisch kannst ist das eine der besten Seiten


Wenn ich mich jetzt irre (hab lange nicht mehr mit fread gearbeitet...), müsstest du sowas benütigen:

C/C++ Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <stdio.h>
 
int main(void)
{
	FILE *file = fopen("main2.c", "r");
 
	int i = 0;
 
	fread(&i, sizeof(i), 1, file); //Hier wird vom der File gelesen
	//Hab grad Windoof an, deswegen kann ichs mit /dev/random nicht testen, sollte aber gehen
 
 
	printf("%i\n", i);
 
	fclose(file);
 
	return(0);
}

14

Friday, June 10th 2011, 5:19pm

Was willst du denn immer mit dem dev/random ? Ja, das gibt es unter Linux, aber srand und rand gehen genauso und machen die Sache wesentlich portabler und imho auch sauberer.

15

Friday, June 10th 2011, 9:00pm

@Rondrer Kein Witz, dachte das wär nur für Windows (gerade nachgegooglet),
aber da das auch mit Linux geht, nehm ich natürlich dann das. :D

@Pocky, hab das Programm schon in C++ geschrieben, aber mir fehlen halt Praxis:

C/C++ Quellcode

1
#include <cstdio>


Mag unsauber sein, aber wie gesagt, mir fehlt jede menge Übung.

Außerdem: Ich hab mir mal was gegönnt, nämlich eine Packung Chips, und hab jetzt fürchterliche Bauchschmerzen... (wahrscheinlich, weil es Discounter Chips waren)
(eine Hälfte gegessen, andere Hälte der Packung wollte ich wegchmeißen, hat aber jemand anderes drauf bestanden, dass er Sie kriegt.)
Wenn es sich bis morgen Mittag nicht bessert, melde ich mich nochmal (wenns geht), und mach es Sonntag weiter...

P.S.: Müsst mich nicht bedauern oder sonst was, nur das ihr drauf eingestellt seid,
dass ich mich morgen vielleicht gar nicht mehr melde, wenns schlimmer wird, hatte ja gesagt, dass ichs heute und morgen mache...
Aber ich brauch jetzt einfach Ruhe, hab immer noch 5 Promill Chipsfett intus, lag wohl echt daran, dass sie so fettig waren... :D
Bin dann auch gleich schon schlafen, schönes Wochenende euch allen.
mfg gn0m

edit: Geht wieder, etwas ausgeruht, danach heißen kakao getrunken und jetzt gehts wieder, werd morgen weiter machen.
Haben in unserem Haus keine richtige Leitung, sondern nur D-Lan Stecker, die haben gehangen, hätte mich sonst schon vor einer halben Stunde gemeldet.

mfg gn0m

edit2: Neues noch nicht fertiges TicTacToe, irgendwo hat sich beim Testen ein Fehler eingeschlichen,
wenn ihn jemand findet, bitte nicht für sich behalten, kann nur Zahlen zwischen 1-3 eingeben, die angenommen werden, hat aber schonmal geklappt.
Gewinnbedingungen bau ich noch ein, keine Sorge.
Und ein unbesiegbares Computerspiel mag denke ich auch niemand. :)

@Pocky, hoffe es ist ok dass ich kleine Teile deines Programms übernommen hab, wenn nein, änder ich das natürlich um.
hab eigentlich fast nur die Felderstellung übernommen, die fand ich cool gemacht. :)

Außerdem ganz wichtig: Was kann ich besser machen?
Bitte nicht so antworten: Einfach alles, oder der ganze Source ist Mist, will ja wissen, wenn ja, warum.
Danke

C/C++ Quellcode

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
#include <iostream>
#include <cstdlib>
using namespace std;
int main(void)
{
    int n, m;
    char feld[3][3] = 	{{'1', '2', '3'},
                         {'4', '5', '6'},
                         {'7', '8', '9'}
                        };
 
    for(int loop = 0; loop <= 9; loop++)
    {
        cout << "Geben Sie eine Zahl zwischen 1-9 ein, um zu setzen.:  ";
        cin >> n;
        n--;
        //------------ Hier liegt glaube ich auch irgendwo der Fehler
        if(n>9)
        {
            cout << "Geben Sie bitte nur Zahlen zwischen 1-9 an!" << endl;
            n = 0;
            continue;
        }
        if(n>2){ //wenn eingabe über 2
            m = n % 3; // feld[m][] = Rest von Modulo von eingabe, damit es nicht über 2 geht
        }
        else{ //sonst
            m = 0; //wenn eingabe nicht größer als 3, gibt es ja auch keine m Reihe, also m = 0;
        }
        for(;n>2; n-3){}; // hier wird n auch auf eine gültige Zahl heruntergelassen.
        if(feld[m][n] != 'o' || 'x') // wenn das Feld nicht besetzt ist von einem gegnerischen oder eigenen Stein
        {
            feld[m][n] = 'x'; // setze Stein
        }
        else // wenn bereits belegt, gebe Text aus, setze n zurück und starte Schleife von vorn
        {
            cout << "Wählen Sie ein Feld, welches noch nicht belegt ist" << endl;
            n = 0;
            continue;
        }
        /*das kommt weiter unten nochmal vor, meine Frage:
        lohnt es für doppeltes Vorkommmen schon eine Funktion zu erstellen, 
        weiß ja genau, dass ich es nicht noch ein drittes mal brauche?
        Wäre nicht das Problem, ist nur eine Frage, bevor es doch wieder kritisiert wird.*/
        int x, y;
        do
        {
            y = rand()%9;
            if (y > 2)
            {
                x = y % 3;
                y--;
            }
            else{
                x = 0;
            }
            for(;y>2; y-3){};
            if(feld[x][y] != 'o' || 'x')
            {
                feld[y][x] = 'o';
                break;
            }
        }while(true);
        for(y = 0; y < 3; y++)
        {
            for(x = 0; x < 3; x++)
            {
                cout << feld[y][x];
                if(x < 2)
                {
                    cout << "|";
                }
            }
            if(y < 2)
            {
                cout << endl << "-----" << endl;
            }
        }
        y = 0, x = 0;
        cout << endl;
 
    }
}

This post has been edited 2 times, last edit by "gn0m" (Jun 11th 2011, 11:48am)


Similar threads

Social bookmarks