Autor |
Beitrag |
GeilerFeger
Hält's aus hier
Beiträge: 6
|
Verfasst: Do 24.05.12 08:42
Hi.
Also ich habe ein Projekt angefangen indem ich 4 Gewinnt programmieren möchte.
Nun habe ich das Problem, dass ich nicht weiter bei meinem Programm komme.
( Bin Anfänger )
C#-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18:
| using System;
class VierGewinnt { static void Main () { int [,] werte = new int [6,7];
werte[5, 0] = 1;
for (int i = 0; i<6; i++){ for (int j= 0; j<7; j++){ Console.Write(werte[i,j] + " "); } Console.WriteLine(); } Console.WriteLine ("\n1 2 3 4 5 6 7"); Console.ReadLine (); } } |
Das Feld an sich ist schonmal sichtbar, aber wie kriege ich das mit den Münzen hin?
Lg
Moderiert von Th69: C#-Tags hinzugefügt
|
|
daeve
      
Beiträge: 116
Erhaltene Danke: 3
Windows (XP Pro, 7 Ultimate x64)
C#,WPF,Java,ASP.Net, VS 2010 Ultimate (x86)
|
Verfasst: Sa 26.05.12 21:15
Hallo
also mit deinem ansatz wird das relativ schwer für dich
ich habe mal ein vier gewinnt in Java programmiert.(mit swing)
du könntest mit einem Switch-Case die spalte auswählen lassen in deinem Array, und danach deine Steine pro Spalte einfügen.
|
|
Palladin007
      
Beiträge: 1282
Erhaltene Danke: 182
Windows 11 x64 Pro
C# (Visual Studio Preview)
|
Verfasst: Mo 28.05.12 22:09
Also ich würde das ganze mit einer Liste machen. Die sind zwar minimal langsamer, aber das sollte hier nicht auffallen.
Aber das ist sowieso unwichtig, da die Vorteile der Liste hier gar nicht zum Tragen kommen.
Ich denke mal, du hast das Problem, wie man eine Münze setzt und das dann auch noch speichert.
Das ist in der Tat ein Problem.
Also zuerst würde ich mir eine Methode schreiben, die das Array nun in die Konsole schreibt, so, wie du es haben willst.
Das sind dann die beiden Schleifen, nur in einer Methode.
Du solltest eine Methode nehmen, da du die dann immer aufrufen kannst, wenn ein Spieler eine Zahl setzt.
Außerdem solltest du am Anfang der Methode Console.Clear(); schreiben. Das leert die Konsole und sieht einfach besser aus.
Die Methode zum hinzu fügen einer Münze...
Da musst du dir überlegen, wie du das Feld änderst. Das ist doch etwas komplizierter, da du in die zweite Ebene greifen musst. Ich hab dir mal eine Methode geschrieben, die das tut. Deine Entscheidung, ob du sie nimmst, oder nicht, aber verstehen solltest du sie auf jeden Fall.
C#-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| static void SetCoin(int[,] werte, int Rift, int Player) { Rift--; for (int i = werte.GetLength(0) - 1; i >= 0; i--) { if (werte[i,Rift] == 0) { werte[i,Rift] = Player; break; } } } |
Die Werte, die ihr übergeben werden, sind das Array, das alles enthält, die Zeile, in der die Münze geworfen werden soll und die Nummer, des Spielers, also eventuell 1 und 2.
Die Methode tut genau das, was du willst, jetzt musst du nur noch die Spielumgebung bauen. ^^
Aber versuch die Methode erst mal zu verstehen.
Tipp:
- break hat die Aufgabe, eine Schleife zu unterbrechen.
- Die Schleife ist umgekehrt, zählt also bis 0.
@daeve:
Switch finde ich in diesem Fall gänzlich ungeeignet.
Lass doch einfach alle Zahlen durch gehen und eine Suchen, die 0 ist. Dann kannst du da rein speichern. ^^
Das Prinzip ist nicht sonderlich Fehler-Resistent, aber das soll es am Anfang ja auch gar nicht sein.
Zuletzt bearbeitet von Palladin007 am Mi 30.05.12 17:17, insgesamt 1-mal bearbeitet
|
|
GeilerFeger 
Hält's aus hier
Beiträge: 6
|
Verfasst: Mi 30.05.12 10:47
Danke schonmal für die ausführlichen Antworten das Feld ist soweit ausgebaut und das mit dem Münzeinwurf funktioniert einwandfrei danke dafür.
Nun habe ich noch folgende Frage diesbezüglich Spieler 1 und Spieler 2:
Wie kriege ich es hin das sich die Münzen abwechseln sprich einmal die 1 anschließend die 2 erscheint.
Mein Programmcode:
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:
| using System; class VierGewinnt { static void Main() { int [,] werte = new int [6,7];
Console.WriteLine ("\n1 2 3 4 5 6 7"); Console.WriteLine("Spieler 1 geben Sie Spalte ein"); int a = 5; int a2 = 5; int a3 = 5; int a4 = 5; int a5 = 5; int a6 = 5; int a7 = 5;
do { string Taste = Console.ReadLine(); switch (Taste) { case "1":
werte[a, 0] = 1; a--; for (int i = 0; i < 6; i++) { for (int j = 0; j < 7; j++) { Console.Write(werte[i, j] + " "); } Console.WriteLine();
} break;
case "2":
Console.Clear(); werte[a2, 1] = 1; a2--;
for (int i = 0; i < 6; i++) { for (int j = 0; j < 7; j++) { Console.Write(werte[i, j] + " "); } Console.WriteLine(); } break;
case "3":
Console.Clear(); werte[a3, 2] = 1; a3--;
for (int i = 0; i < 6; i++) { for (int j = 0; j < 7; j++) { Console.Write(werte[i, j] + " "); } Console.WriteLine(); } break;
case "4":
Console.Clear(); werte[a4, 3] = 1; a4--;
for (int i = 0; i < 6; i++) { for (int j = 0; j < 7; j++) { Console.Write(werte[i, j] + " "); } Console.WriteLine(); } break;
case "5":
Console.Clear(); werte[a5, 4] = 1; a5--;
for (int i = 0; i < 6; i++) { for (int j = 0; j < 7; j++) { Console.Write(werte[i, j] + " "); } Console.WriteLine(); } break;
case "6":
Console.Clear(); werte[a6, 5] = 1; a6--;
for (int i = 0; i < 6; i++) { for (int j = 0; j < 7; j++) { Console.Write(werte[i, j] + " "); } Console.WriteLine(); } break;
case "7":
Console.Clear(); werte[a7, 6] = 1; a7--;
for (int i = 0; i < 6; i++) { for (int j = 0; j < 7; j++) { Console.Write(werte[i, j] + " "); } Console.WriteLine(); } break; }
} while (true);
}} |
Ich hoffe ihr macht euch nocheinmal die Mühe und helft mir weiter.
Lieben Gruß.
Moderiert von Th69: C#-Tags hinzugefügt
|
|
Cäptin Pommes
      
Beiträge: 142
Erhaltene Danke: 2
|
Verfasst: Mi 30.05.12 11:00
du musst nur in einer varibale speichern welcher spieler gerade seinen zug gemacht hat und dann musst du einfach nur den andern spieler nehmen
|
|
ujr
      
Beiträge: 102
Erhaltene Danke: 12
|
Verfasst: Mi 30.05.12 11:33
Palladin007 hat folgendes geschrieben : | Ich hab dir mal eine Methode geschrieben, die das tut. Deine Entscheidung, ob du sie nimmst, oder nicht, aber verstehen solltest du sie auf jeden Fall. |
Hast Du die mal ausprobiert?
Length kann man in mehrdimensionalen Arrays nicht so benutzen. Richtig wäre GetLength.
Auch ist das umgekehrte Speichern zwar nützlich für die Darstellung in der Konsole, aber es verkompliziert doch eher die Auswertung.
In jedem Fall ist dies aber, wie man sieht, der bessere Weg gegenüber der switch/case-Orgie.
|
|
Palladin007
      
Beiträge: 1282
Erhaltene Danke: 182
Windows 11 x64 Pro
C# (Visual Studio Preview)
|
Verfasst: Mi 30.05.12 17:11
Ja, hatte ich getestet, allerdings hatte ich das erst mit verschachtelten Arrays^^
Hab dann noch nachträglich ein mehrdimensionales Array daraus gemacht, dann aber das mit Length vergessen, danke dafür ^^
Und je nachdem, wie rum du das machst, entweder die Ausgabe oder das Auswerten wird verkompliziert. Bei dem Spiel kommt man eben nicht ohne eine umgedrehte Schleife aus^^ Zumindest nicht, wenn man es halbwegs einfach belassen will.
@GeilerFeger:
Ein OOP-Fanatiker (objektorientierte Programmierung) würde dich jetzt rupfen
Das, was du in jeden Case-Block gelegt hast, das kannst du komplett als Methode extrahieren, das heißt, die Methode wird nur einmal geschrieben und immer aufgerufen.
Wenn du die ganzen Variablen darüber nun als Array machst, gibt das auch kein weiteres Problem mehr, du kannst dir im Prinzip sogar den ganzen switch-Block sparen, weil du den Index des Arrays nur der Methode übergeben musst und die erledigt dann den Rest.
Also eigentlich so, wie in der Methode von mir.
Den Fehler mit dem Length werd ich gleich korrigieren.
|
|
GeilerFeger 
Hält's aus hier
Beiträge: 6
|
Verfasst: Mi 13.06.12 10:18
so ich habe mal noch ein wenig rumprobiert...
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:
| using System; class VierGewinnt { static void Main() { int [,] werte = new int [6,7];
Console.WriteLine ("\n1 2 3 4 5 6 7"); Console.WriteLine("Spieler 1 geben Sie Spalte ein"); int a = 5; int a2 = 5; int a3 = 5; int a4 = 5; int a5 = 5; int a6 = 5; int a7 = 5;
int b = 1;
do { string Taste = Console.ReadLine(); switch (Taste) { case "1": werte[a, 0] = b; a--; for (int i = 0; i < 6; i++) { for (int j = 0; j < 7; j++) { Console.Write(werte[i, j] + " "); } Console.WriteLine();
} break;
case "2":
Console.Clear(); werte[a2, 1] = b; a2--;
for (int i = 0; i < 6; i++) { for (int j = 0; j < 7; j++) { Console.Write(werte[i, j] + " "); } Console.WriteLine(); } break;
case "3":
Console.Clear(); werte[a3, 2] = b; a3--;
for (int i = 0; i < 6; i++) { for (int j = 0; j < 7; j++) { Console.Write(werte[i, j] + " "); } Console.WriteLine(); } break;
case "4":
Console.Clear(); werte[a4, 3] = b; a4--;
for (int i = 0; i < 6; i++) { for (int j = 0; j < 7; j++) { Console.Write(werte[i, j] + " "); } Console.WriteLine(); } break;
case "5":
Console.Clear(); werte[a5, 4] = b; a5--;
for (int i = 0; i < 6; i++) { for (int j = 0; j < 7; j++) { Console.Write(werte[i, j] + " "); } Console.WriteLine(); } break;
case "6":
Console.Clear(); werte[a6, 5] = b; a6--;
for (int i = 0; i < 6; i++) { for (int j = 0; j < 7; j++) { Console.Write(werte[i, j] + " "); } Console.WriteLine(); } break;
case "7":
Console.Clear(); werte[a7, 6] = b; a7--;
for (int i = 0; i < 6; i++) { for (int j = 0; j < 7; j++) { Console.Write(werte[i, j] + " "); } Console.WriteLine(); } break; } if (b==1){ b=2; } else{ b=1; }
} while (true);
}} |
nur mein Problem ist jetzt wie angezeigt wird, dass man 4 Münzen in einer Reihe hat
Danke lg
Moderiert von Christian S.: C#-Tags hinzugefügt
|
|
daeve
      
Beiträge: 116
Erhaltene Danke: 3
Windows (XP Pro, 7 Ultimate x64)
C#,WPF,Java,ASP.Net, VS 2010 Ultimate (x86)
|
Verfasst: Do 14.06.12 18:08
so wie du dein Spielfeld ausgibst ist wirklich nicht ideal... du macht in jedem Switch block genau das selbe.
Mach doch bitte eine Methode daraus und rufe jeweils nur die Methode auf.(hier unten die Methode)
C#-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| public static void SpielAusgeben() {
for (int i = 0; i < 6; i++) { for (int j = 0; j < 7; j++) { Console.Write(werte[i, j] + " "); }
Console.WriteLine(); } |
Zu deinem Problem: Du möchtest eine Automatische Gewinn Ermittlung ? jetzt musst du eine neue Methode machen in der du Prüfst ob in einem Spielfeld 4 in einer Reihe liegen.
|
|
Palladin007
      
Beiträge: 1282
Erhaltene Danke: 182
Windows 11 x64 Pro
C# (Visual Studio Preview)
|
Verfasst: Do 14.06.12 21:14
@daeve: Kann es sein, dass du da eine geschweifte Klammer vergessen hast? Die for-Schleife wird nicht geschlossen.
@GeilerFeger:
Die 7 a-Variablen sind ja immer noch da? O.O
Mach daraus doch ein Array, ist viel einfacher und praktischer.
Um zu erkennen, ob es bereits eine Reihe gibt, musst du dir überlegen, wie du das auslesen kannst.
Da eine Reihe ja sowohl waagerecht, senkrecht, als auch diagonal sein kann, musst du das beachten.
Wie du das machen kannst, müsste ich jetzt auch erst überlegen, da es bei dieser Form der Herangehensweise tatsächlich etwas unpraktisch ist.
Ich bastel nachher mal was zusammen und erkläre dir dann meine Herangehensweise, wie ich das Feld prüfen lasse.
Für diesen Beitrag haben gedankt: GeilerFeger
|
|
KanneM
      
Beiträge: 26
Erhaltene Danke: 1
Win98, Win XP, Win 7
Java, C#
|
Verfasst: Fr 15.06.12 09:20
Palladin007 hat folgendes geschrieben : |
Um zu erkennen, ob es bereits eine Reihe gibt, musst du dir überlegen, wie du das auslesen kannst.
Da eine Reihe ja sowohl waagerecht, senkrecht, als auch diagonal sein kann, musst du das beachten.
Wie du das machen kannst, müsste ich jetzt auch erst überlegen, da es bei dieser Form der Herangehensweise tatsächlich etwas unpraktisch ist.
Ich bastel nachher mal was zusammen und erkläre dir dann meine Herangehensweise, wie ich das Feld prüfen lasse. |
Ich weiß nicht welche Kenntnisse der User schon hat, aber ich denke man kann da mal ganz spartanisch rangehen:
Du musst dich Fragen: "Wie ist so eine Reihe aufgebaut und wie kann ich sie erkennen?"
Nun, wie erkennst du eine Reihe im realen Leben? Du schaust dir alle deine Steine an und prüfst dann, ob 4 nebeneinander liegen!
Wie wäre es also, wenn du dir eine Methode ausdenkst, die alle deine Steine sucht und dann prüft, ob in der direkten nachbarschaft noch ein stein liegt? Wenn einer vorhanden ist, würdest du von dem aus weiter prüfen und einen Zähler übergeben, der dir sagt der wievielte Stein das schon in Folge ist.
C#-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| for(int i = 0; i<feld.GetLenght(0); i++){ for(int j = 0; j<feld.GetLenght(1); i++) { if(feld[i,j] == 1; { feld.PruefeNachbarschaft(0); } } } |
(Habe den Code nicht auf Fehler geprüft, hab das hier schnell während der Arbeit getippt^^)
Natürlich fehlt hier noch der Code für PruefeNachbarschaft(int zaehler){...}, darüber kann er ja mal nachdenken, dann wird er vielleicht auch später den fertigen Code (partiell) nachvollziehen können.
Wiegesagt ich weiß nicht wieweit er das schon kann (sry wenns zu leicht ist), aber man kann sich darüber ja mal Gedanken machen. Für den Anfang ist das denke ich eine praktische und anschauliche Lösung...
LG
Für diesen Beitrag haben gedankt: GeilerFeger
|
|
GeilerFeger 
Hält's aus hier
Beiträge: 6
|
Verfasst: Mo 18.06.12 12:06
Danke ich bin in Programmiern ein Anfänger und probiere alles zu verstehen, da mir das nicht ganz leicht fällt danke ich euch für eure intensive hilfe
LG
|
|
Palladin007
      
Beiträge: 1282
Erhaltene Danke: 182
Windows 11 x64 Pro
C# (Visual Studio Preview)
|
Verfasst: Mo 18.06.12 17:00
Dafür ist ein Forum da, zumindest solange der der Hilfe suchende nicht alle Arbeit auf uns abwälzen will, ist das kein Problem. ^^
Bei deinem Problem, zu überprüfen, ob es bereits eine Reihe gibt, müsste ich erst einmal herum probieren. Ich denke, ich würde sogar mal schauen, ob man das eventuell mit einer Klasse regeln kann, dass jedes Feld eine Referenz dieser Klasse ist und dann als Eigenschaft den darauf liegenden Stein besitzt. Als weitere Eigenschaft (oder als Methode) kann dann ja jedes angrenzende Feld abgefragt werden, dann musst du das nur einmal programmieren und musst nur noch der Reihe nach immer vom nächsten Stein das richtige Feld abfragen. Ich finde das theoretisch einfacher, ob es sich lohnt, würde sich zeigen, wenn ich es versuche.
Ob du das machen kannst, weiß ich nicht, weil du dazu das Klassen-Design und das Prinzip von Referenzen kennen musst.
Vielleicht solltest du wirklich mal ein gutes C#-Buch lesen. Kostet erst Überwindung, weil das nach so extrem viel Theorie und Langeweile klingt, aber wenn du die ganzen Grundlagen dann verstehst, dann macht das Ausprobieren um so mehr Spaß.
Du solltest zum Beispiel dir unbedingt Arrays oder Listen anschauen. Listen sind eventuell für die die aktive Arbeit damit besser geeignet, weil sie mehr nützliche Eigenschaften und Methoden besitzen, als die Arrays.
Aber allgemein Auflistungs-Klassen sind extrem wichtig und die findest du wirklich an jeder Ecke, ob du sie nun selber schreibst und benutzt, oder eine andere Klasse sie verwendet, du wirst ihr definitiv immer begegnen.
Auch kannst du dich dann schnell in Windows-Forms einlesen. Das wird zwar nicht mehr weiter entwickelt, ist aber eine gute und einfache Möglichkeit, Programme mit Windows-Oberfläche zu programmieren und ich wage zu behaupten, dass dein Vorhaben da etwas einfacher ist. Abgesehen davon ist es für den Nutzer dann deutlich angenehmer, wenn er nur einen Button über der jeweiligen Spalte drücken muss. ^^
|
|
|