Autor Beitrag
GokiLoki
Hält's aus hier
Beiträge: 1



BeitragVerfasst: Mo 15.08.22 11:55 
Hallo.
Ich habe ein Vier-Gewinnt-Spiel programmiert und ich wollte fragen, ob jemand Ideen hat was für Tests mit XUnit dazu schreiben kann und wie die aussehen würden. Ich lerne nämlich grade wie man automatisierte Tests in C# schreibt und wollte das als Übung machen.

Das ist der Code:
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:
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:
using System;
using System.Text.RegularExpressions;

namespace Spiel
{
    public class vierGewinnt
    {
        public class game
        {
            public string[,] board = new string[1018];

            public game()
            {
                for (int j = 0; j < 9; j++)
                {
                    for (int i = 0; i < 15; i += 1)
                    {
                        if (i % 2 == 0) board[j, i] = "|";
                        else board[j, i] = " ";
                    }
                }

                for (int j = 0; j < 10; j++)
                {
                    for (int i = 0; i < 18; i += 1)
                    {
                        Console.Write(board[j, i]);
                    }
                    Console.Write("\n");
                }
                Console.WriteLine(" 1 2 3 4 5 6 7");
            }

            public void output()
            {
                for (int j = 0; j < 10; j++)
                {
                    for (int i = 0; i < 18; i += 1)
                    {
                        Console.Write(board[j, i]);
                    }
                    Console.Write("\n");
                }
                Console.WriteLine(" 1 2 3 4 5 6 7");
            }

            public bool evaluate(string[,] game)
            {
                //prüfen ob 4 gleiche nebeneinander

                //array waagerecht
                string[] horizontal = new string[80];
                int k = 0;

                for (int j = 0; j < 10; j++)
                {
                    for (int i = 1; i < 16; i += 2)
                    {
                        horizontal[k] = game[j, i];
                        k += 1;
                    }
                }

                //array senkrecht
                string[] vertical = new string[80];
                k = 0;

                for (int j = 1; j < 16; j += 2)
                {
                    for (int i = 0; i < 10; i++)
                    {
                        vertical[k] = game[i, j];
                        k += 1;
                    }
                }

                //array diagonal links nach rechts
                string[] diagonal = new string[160];
                k = 0;

                for (int h = 0; h < 9; h++)
                {
                    int i = h;
                    int j = 1;
                    do
                    {
                        diagonal[k] = game[i, j];
                        k++;
                        i++;
                        j += 2;
                    }
                    while (i < 9);
                    diagonal[k] = " ";
                    k++;
                }

                for (int h = 3; h <= 16; h += 2)
                {
                    int j = h;
                    int i = 0;
                    do
                    {
                        diagonal[k] = game[i, j];
                        k++;
                        i++;
                        j += 2;
                    }
                    while (j <= 16);
                    diagonal[k] = " ";
                    k++;
                }

                //rechts nach links
                for (int h = 0; h < 9; h++)
                {
                    int i = h;
                    int j = 17;
                    do
                    {
                        diagonal[k] = game[i, j];
                        k++;
                        i++;
                        j -= 2;
                    }
                    while (i < 9);
                    diagonal[k] = " ";
                    k++;
                }

                for (int h = 15; h <= 16; h += 2)
                {
                    int j = h;
                    int i = 0;
                    do
                    {
                        diagonal[k] = game[i, j];
                        k++;
                        i++;
                        j += 2;
                    }
                    while (j <= 16);
                    diagonal[k] = " ";
                    k++;
                }

                //prüfen ob vier gleiche nebeneinander
                int rowHorizontal = 1;
                int rowVertical = 1;
                int rowDiagonal = 1;
                int s = 0;
                while (s < horizontal.Length)
                {
                    if ((horizontal[s] == "O" || horizontal[s] == "X") && (horizontal[s] == horizontal[s + 1])) rowHorizontal += 1;
                    else rowHorizontal = 1;
                    if ((vertical[s] == "O" || vertical[s] == "X") && (vertical[s] == vertical[s + 1])) rowVertical += 1;
                    else rowVertical = 1;

                    if (rowHorizontal == 4 || rowVertical == 4)
                    {
                        Console.WriteLine("GEWONNEN");
                        return true;
                    }
                    s++;
                }

                s = 0;
                while (s < diagonal.Length)
                {
                    if (diagonal[s] == "O" || diagonal[s] == "X") rowDiagonal += 1;
                    else rowDiagonal = 1;

                    if (rowDiagonal == 4)
                    {
                        Console.WriteLine("GEWONNEN");
                        return true;
                    }
                    s++;
                }
                return false;
            }
        }

        public class player
        {
            string Name;
            public string Sign;

            public player(string Name, string Sign)
            {
                this.Name = Name;
                this.Sign = Sign;
            }

            public int move()
            {
                Console.WriteLine("Player {0}: Choose a column!", Name);
                int col = Int32.Parse(Console.ReadLine()!);
                return col;
            }
        }

        static void Main()
        {
            player AA = new player("A""X");
            player BB = new player("B""O");
            game A = new game();

            int column;
            bool end = false;

            while (!end)
            {
                column = AA.move() * 2 - 1;

                for (int j = 9; j >= 0; j--)
                {
                    if (A.board[j, column] == "|")
                    {
                        Console.WriteLine("error");
                        break;
                    }

                    else if (A.board[j, column] == " ")
                    {
                        A.board[j, column] = AA.Sign;
                        break;
                    }

                    else if (A.board[j, column] == "X" || A.board[j, column] == "O")
                    {
                        continue;
                    }
                }
                Console.Clear();
                A.output();
                end = A.evaluate(A.board);

                if (!end)
                {
                    column = BB.move() * 2 - 1;

                    for (int j = 9; j >= 0; j--)
                    {
                        if (A.board[j, column] == "|")
                        {
                            Console.WriteLine("error");
                            break;
                        }

                        if (A.board[j, column] == " ")
                        {
                            A.board[j, column] = BB.Sign;
                            break;
                        }

                        else if (A.board[j, column] == "X" || A.board[j, column] == "O")
                        {
                            continue;
                        }

                    }
                    Console.Clear();
                    A.output();
                    end = A.evaluate(A.board);
                }
                else break;
            }
        }
    }
}

Danke im Voraus

Moderiert von user profile iconTh69: C#-Tags hinzugefügt
Moderiert von user profile iconTh69: Topic aus C# - Die Sprache verschoben am Mo 15.08.2022 um 11:58
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4700
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Mo 15.08.22 12:26 
Zum testen gehört erstmal Code so zu schreiben das er testbar wird.
Wichtig ist hierbar das Wort "Unit". Du mußt Einzelteile schaffen die auch einzeln testbar sind. Und einzeln heißt auch harte Abhängigkeiten los zuwerden.
In deinem Code fällt insbesondere die direkte Verwendung con Console auf.

Schritt 1 wäre Console wegzukapseln so das die austauschbar wird und du gezielt Daten zum testen in den Code einfüllen kannst. Für den diesen IO wäre es also sinnvoll ein Interface zu schaffen mit einer Implementierung die die Console benutzt und eine weitere Implementierung die sich die Daten von woanders holt und in den Tests benutzt werden kann.

Wenn du das hast und auch ausprobiert hast die Testversion dieser Klasse zu verwenden kann man weiterschauen. Du hast viele Methode die einen inneren State verwenden das ist in Unittest abbildbar aber eher unschön. Da sollten wir aber erst nach schauen sobald du Console in der eigentlich Logik los bist.

Edit: Vielleicht auch nochmal über das Naming nachdenken. Insbesondere über das Casing von Dingen. Du benutzt eine untypische Variante für C# und bist dabei nichtmal konsequent.
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4764
Erhaltene Danke: 1052

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Mo 15.08.22 14:44 
Hallo und :welcome:

und bitte Crossposts verlinken: myCSharp.de: Vier Gewinnt mit XUnit testen