Autor Beitrag
hauptmann25
Hält's aus hier
Beiträge: 3



BeitragVerfasst: Mo 04.04.11 18:52 
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
private static bool FindFour(ref bool playerA,ref bool playerB, int[,] field)
        {
            for (int rows = 0; rows < field.GetLength(0); rows++)
            {
                int sumR = 0;
                for (int col = 0; col < field.GetLength(1); col++)
                {
                    sumR += field[rows, col];
                    if (sumR == 4)
                        playerA = true;
                    else if (sumR == -4)
                        playerB = true;
                }
                        
            }
            if (playerA == true)
                return playerA;
            if (playerB == true)
                return playerB;



Ich hab gerade ne Hausübung in der ich ein Spiel 4 gewinnt programmiere.
Allerdings habe ich ein Problem mit der Methode da es mich zwingen will auch das sumR zu returnen weil ich es in einer if verwendet habe.
Hat wer eine Ahnung was ich machen soll damit ich nur den Bool returnen kann ohne dass mich das SumR stört?
Bitte nicht zu arg schimpfen über den Schrott den ich da zusammenprogrammiert habe bin ja noch in der 1.HTL :nixweiss:
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4807
Erhaltene Danke: 1061

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Mo 04.04.11 19:16 
Hi,

überleg mal, was passiert wenn sowohl PlayerA als auch PlayerB false sind (was soll dann als Wert zurückgegeben werden?).

Und wenn es dann läuft, wirst du merken, daß deine Berechnung noch fehlerhaft ist (du mußt ja 4 benachbarte Felder suchen)...
hauptmann25 Threadstarter
Hält's aus hier
Beiträge: 3



BeitragVerfasst: Mo 04.04.11 19:31 
Th69 Danke für die Schnelle Antwort.
Also Punkt 1 hast Recht ich weis nur nciht wie ich beides zurückgeben kann z.B so:

playerA,playerB = FindFour(ref playerA,ref playerB,field);

und in der Methode:

return playerA,playerB;

nur geht das leider nicht und einzeln funktioniert es auch nicht da es bei return sofort aus der Methode aussteigt.

Punkt 2 :

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
private static bool FindFour(ref bool playerA,ref bool playerB, int[,] field)
        {
            for (int rows = 0; rows < field.GetLength(0); rows++)
            {
                int sumR = 0;
                for (int col = 0; col < field.GetLength(1)|| col < col+4; col++)
                {
                    sumR += field[rows, col];
                    if (sumR == 4)
                        playerA = true;
                    else if (sumR == -4)
                        playerB = true;
                }
                        
            }

So müsste jetzt passen da leere Felder mit 0 ,PlayerA mit -1 und PlayerB mit 1 intialisiert ist.
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4807
Erhaltene Danke: 1061

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Mo 04.04.11 19:59 
Hi,

was genau willst du denn zurückgeben? Bisher gibt du mit 'bool' ja nur entweder 'true' oder 'false' zurück (durch die Angabe 'ref' bei den ersten beiden Parametern gibst du aber auch schon diese Werte zurück an die aufgerufenen Variablen).

Schau jetzt ersteinmal, daß dein Programm kompiliert (zur Not also einfach ein 'return false' an das Ende der Methode) und dann kannst du ja Step-By-Step die weiteren Fehler per Debugging finden.
Hinweis: auch die Änderung 'col < col+4' ist nicht korrekt, denn dieser Ausdruck ist ja (in diesem Kontext) immer wahr.
hauptmann25 Threadstarter
Hält's aus hier
Beiträge: 3



BeitragVerfasst: Mo 04.04.11 20:10 
oh ja danke für den Hinweis habe da ein && hinmachen wollen

Ich habe das so gemacht das das spiel läuft solange PlayerA und PlayerB = false sind. Werden 4 gefunden ist eins true und das spiel ist vorbei. Kann ich jetzt nicht die ganze Variable zurückgeben? Denn ich muss nach jeden Spielzug überprüfen.

So hier mal die vollständige Methode noch ziemlich fehlerhaft mit allen Prüfvorgängen:

*edit: Wider mal ein paar Kleine Fehler ausgebügelt... Ich mach eindeutig zu viel davon O.o

ausblenden volle Höhe 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:
        private static bool FindFour(ref bool playerA,ref bool playerB, int[,] field)
        {
            for (int rows = 0; rows < field.GetLength(0); rows++)
            {
                int sum = 0;
                for (int col = 0; col < field.GetLength(1)&& col < col+4; col++)
                {
                    sum += field[rows, col];
                    if (sum == 4)
                        playerA = true;

                    else if (sum == -4)
                        playerB = true;
                }
                        
            }

            for (int col = 0; col < field.GetLength(1); col++)
            {
                int sum = 0;
                for (int rows = 0; rows < field.GetLength(0)&& rows < rows+4; rows++)
                {
                    sum += field[col,rows];
                    if (sum == 4)
                        playerA = true;
                    else if (sum == -4)
                        playerB = true;
                }

            }

            int sumR = 0;
            int sumL = 0;
            for (int rows = field.GetLength(0)-1; rows >= 3; rows--)
            {
                for (int col = 0; col < field.GetLength(1)-3; col++)
                {
                    
                    for (int i = 0; i < 4; i++)
                    {
                        if (rows - i >= 0 && col - i >= 0)
                            sumL += field[rows - i, col - i];
                        if(rows-i >= 0 && col+i < field.GetLength(1))
                            sumR += field[rows-i,col+i];
                    }
                }
            }

            if (sumR == 4 || sumL == 4)
                playerA = true;
            if (sumR == -4 || sumL == -4)
                playerB = true;

            if (playerA == true)
                return playerA;
            if (playerB == true)
                return playerB;
            
        }