Würfeln in Matlab |
19.08.2012, 23:20 | liyaah | Auf diesen Beitrag antworten » | |||||||||||||||
Würfeln in Matlab Hallo ihr lieben Helfer, ich möchte gerne ein Würfelspiel in Matlab programmieren. Regeln: Spieler a spielt gegen Spieler b. Ich entscheide wer anfängt. Der Beginner würfelt so oft er will, wobei seine Augen addiert werden, aber: 1)er kann jederzeit stoppen womit seine augensumme gesichert wird und der Gegner am Zug ist 2)kommt eine 6 endet sein Zug mit 0 Punkten und der Gegner ist dran So geht das dann hin und her, bis einer ein Ziel, sagen wir 100 Punkte erreicht. Die Spieler müssen sich also überlegen, wie lange sie würfeln. Mein Ziel ist es nun ein Programm zu schreiben, dass diese Situation simuliert. z.B. soll Spieler a immer so lange würfeln bis er >= 15 Punkte hat und Spieler b bis er >= 17 Punkte hat. Das würde ich dann gerne so 10000 mal durchspielen und sehen wie oft wer gewonnen hat. Meine Ideen: Ich habe mich mal an Matlab probiert, mit folgendem Ergebnis: a=zeros(1,100000); n=15 for i=1:100000 while a(i)<n w=randi(6); if w <6 a(i)=a(i)+w; else a(i)=0; break end end end erfolg=0; verlust=0; for i=1:100000 if a(i)~=0 erfolg=erfolg+1; else verlust=verlust+1; end end erfolg verlust Das ist jetzt erstmal völlig unabhängig vom Punkteziel des Spiels und auch nur für einen Spieler. erfolg zeigt mir wie oft der Spieler es geschafft hat die Regel überhaupt einzuhalten (also ohne 6 bis mind. 15 zu würfeln). Ich könnte das gleiche ja für Spieler b schreiben, z.B. mit n=17, aber ich weiß z.B. nicht wie ich matlab dann sagen soll, dass wenn a eine 6 gewürfelt oder gestoppt hat Spieler b an der Reihe ist usw.. Wisst ihr weiter? |
|||||||||||||||||
20.08.2012, 00:02 | liyaah | Auf diesen Beitrag antworten » | |||||||||||||||
RE: Würfeln in Matlab Ich weiß leider nicht wie ich den Code schön posten kann, aber ich versuchs mal ein bischen besser: a=zeros(1,100000); n=15 for i=1:100000 while a(i)<n w=randi(6); if w <6 a(i)=a(i)+w; else a(i)=0; break end end end erfolg=0; verlust=0; for i=1:100000 if a(i)~=0 erfolg=erfolg+1; else verlust=verlust+1; end end erfolg verlust |
|||||||||||||||||
20.08.2012, 00:40 | Airblader | Auf diesen Beitrag antworten » | |||||||||||||||
[ code ] ... Quelltext ... [ /code ] Natürlich ohne die Leerzeichen. Edit: Mein Vorschlag würde in diese Richtung gehen (Matlab-/C-/JS-Pseudocode). Optimaler, flexibler und schöner würde man natürlich klassenorientiert arbeiten, aber du willst es ja mit Matlab umsetzen.
Aufruf dann sozusagen mit
bzw., wenn du es oft ausführen willst,
Ist nur aus dem Kopf runtergeschrieben, könnte also fehlerhaft sein. Aber die Idee sollte rüberkommen. Edit #2: Habe es aus Langeweile mal programmiert. Wenn man's eben auf Matlab anpasst, dann klappt es. air |
|||||||||||||||||
20.08.2012, 07:17 | Mystic | Auf diesen Beitrag antworten » | |||||||||||||||
Hm, sehe ich das richtig, dass deine Spieler auch dann noch weiterwürfeln, wenn sie das gameLimit schon erreicht haben, das turnLimit aber noch nicht? |
|||||||||||||||||
20.08.2012, 13:56 | Airblader | Auf diesen Beitrag antworten » | |||||||||||||||
Richtig. Alles wollte ich dann nicht vormachen. Es gibt noch 1-2 andere Dinge im obigen Code, über die man ein bisschen nachdenken muss, wenn man es auf Matlab umschreibt. (Das ist übrigens ein "Fehler", der behoben werden sollte, da er den Spielausgang tatsächlich verändern kann) Edit: Na gut, nachdem's schon angesprochen wurde: Ich würde dafür übrigens nicht über den Weg gehen, der erstmal naheliegt, und throwDice auch noch das gameLimit übergeben. Stattdessen würde ich mich darum kümmern, in startGame einfach ein kleineres turnLimit an throwDice zu übergeben, falls nötig. air |
|||||||||||||||||
21.08.2012, 20:18 | Airblader | Auf diesen Beitrag antworten » | |||||||||||||||
Scheinbar mal wieder in gleich zwei Threads völlig umsonst die Mühe gemacht, zu helfen. Bei der Rate, die bei programmier-bezogenen Threads zumindest gefühlsmäßig besteht, ist es echt kein Wunder, dass einem die Lust daran vergeht. |
|||||||||||||||||
Anzeige | |||||||||||||||||
|
|||||||||||||||||
04.09.2012, 20:14 | liyaah | Auf diesen Beitrag antworten » | |||||||||||||||
Hallo Airblader, danke für deine Hilfe. Es tut mir leid, dass ich mich bisher nicht gemeldet habe, aber es kam etwas sehr wichtiges dazwischen... Jedenfalls habe ich mich jetzt mal mit deinem Programm beschäftigt. throwDice ist ja relativ äquivalent zu meinem. Die Spielerunterscheidung nach gerade und ungerade ist natürlich clever , aber matlab kann ja mit dem nullten Eintrag nichts anfangen. Deshalb habe ich alles ein bischen umgeschrieben:
So weit funktioniert alles auch super, aber eine Sache wird noch nicht beachtet: Hat der Beginner die (bei mir) 50-Marke erreicht, dann darf der Nicht-Beginner noch einen Zug durchführen.(Damit beide gleich viele Züge hatten.) Hast du vielleicht eine Idee wie ich das noch reinschreiben könnte? Viele Grüße liyaah |
|||||||||||||||||
04.09.2012, 20:44 | Airblader | Auf diesen Beitrag antworten » | |||||||||||||||
Modifiziere
indem du eine Bool-Variable á la "lastTurn" einführst (nur eine von mehreren Möglichkeiten). Wo du den Wert wie zu setzen hast überlasse ich dir mal zum Nachdenken – so schwierig ist es nicht, zumal ich dir ja doch einen großen Teil der Arbeit abgenommen habe. Das mit der Nullindizierung war übrigens Absicht – wie gesagt, ein paar Implementierungsdinge muss man dir ja auch noch überlassen. air |
|||||||||||||||||
04.09.2012, 21:22 | liyaah | Auf diesen Beitrag antworten » | |||||||||||||||
Hab mich gerad nochmal kurz an das Problem, dass weitergewürfelt wird wenn das gamelimit erreicht wurde, aber das turnlimit nicht.
Ich glaub das ist so richtig. Was meinst du? |
|||||||||||||||||
04.09.2012, 22:08 | liyaah | Auf diesen Beitrag antworten » | |||||||||||||||
Zu dem Problem, dass der Nicht-Beginner nochmal würfeln darf, habe ich folgendes geschrieben:
Es wäre schön, wenn du mir zu den letzten eiden Posts ein Feedback geben würdest. Liyaah |
|||||||||||||||||
04.09.2012, 22:20 | Airblader | Auf diesen Beitrag antworten » | |||||||||||||||
Sieht gut aus air |
|
Verwandte Themen
Die Beliebtesten » |
|
Die Größten » |
|
Die Neuesten » |