Announcement

Collapse
No announcement yet.

[Random] Würfeln

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • [Random] Würfeln

    Hallo!

    Ich plane ein Würfelspiel zu programmieren, das ein Freund schon in Pearl programmiert hat.

    Dabei wird eine Zahl angegeben und man muss sie treffen bzw. so nah daran kommen, wie möglich.

    Meine Frage ist: Wie mache ich das?

    In Pearl gibt es den Befehl "redo", was es in C# meines Erachtens nicht gibt.

    Ich wollte mit do ... while (!(überrollt == false)); arbeiten, aber es klappt irgendwie nicht.

    Sagen wir mal man würfelt einen 6 seitigen würfel, also "W6" oder nur "6". Dann wird halt per Random die Zahl gewürfelt. Wenn die Zahl "6", also Maximum ist, soll automatisch so lange gewürfelt werden, bis es nicht mehr das Maximum ist. Dies soll dann im Log so angezeigt werden:

    User würfelt mit {Würfel}: 6> 2, als Beispiel.

    Dies sollte auch bei mehreren Würfeln klappen, z.B 4+6+10.

    Wie kann ich das als so ein Log anzeigen?

    Brauche bitte Ansätze.

    Vielen Dank.

    MfG

  • #2
    Ich wollte mit do ... while (!(überrollt == false)); arbeiten, aber es klappt irgendwie nicht.
    Du willst solange würfeln bist du einen Treffer hast aber auf jeden Fall willst du mindestens 1 mal würfeln. Somit bist du bei do .. while richtig.
    Die doppelte Verneining ist aber unnötig eine einfaches do ... while(überrrolt) ist lesbarer.

    PS. du meinst sicher Perl. Pearl ist eine altes Echtzeitsystem mit Programmiersprache. Jemand der ein entsprechendes System zur Verfügung hat würde wohl kaum ein Würfelspiel darauf programmieren. Obwohl ..... mmmhh

    Comment


    • #3
      Ich will, dass er aufhört, wenn der Würfel nicht überrollt wurde.

      6-seitiger Würfel:
      6> 6> 6> 6> 2 (was eigentlich unwahrscheinlich ist, aber möglich) ~ überrollen
      4 ~ nicht überrollen

      Er soll aufhören, wenn er NICHT überrollt.

      Bis jetzt klappt es nur mit einem Würfel, aber wie es mit mehreren geht, weiß ich nicht, da geht vieles durcheinander.

      [highlight=c#] static string Wurf(string input)
      {
      string satz = string.Empty;
      int ergebnis = 0;
      string wuerfel = Regex.Match(input, "/d (.+)").Groups[1].Value;
      int i = new Random().Next(1, int.Parse(wuerfel.Replace("w", string.Empty)) + 1);
      ergebnis = ergebnis + i;
      if (i == int.Parse(wuerfel.Replace("w", string.Empty)))
      {
      satz = "Mr. ? würfelt mit W" + wuerfel.Replace("w", string.Empty) + ": " + i;
      do
      {
      System.Threading.Thread.Sleep(100);
      i = new Random().Next(1, int.Parse(wuerfel.Replace("w", string.Empty)) + 1);
      satz = satz + "> " + i;
      ergebnis = ergebnis + i;
      }
      while (!(i != int.Parse(wuerfel.Replace("w", string.Empty))));
      }
      else
      {
      satz = "Mr. ? würfelt mit W" + wuerfel.Replace("w", string.Empty) + ": " + i;
      ergebnis = i;
      }
      if (ergebnis < c)
      {
      satz = satz + " = " + ergebnis.ToString() + ".";
      }
      else if (ergebnis > c)
      {
      satz = satz + " = " + ergebnis.ToString() + " und scheidet aus, da die Zahl überschritten wurde.";
      }
      else
      {
      satz = satz + " = " + ergebnis.ToString() + " (Genau getroffen!).";
      }
      return satz;
      }[/highlight]

      Ist schlecht geschrieben, jaja...

      Wie geht das nun mit mehreren Würfeln, dass angezeigt wird:

      Mr. ? würfelt W4+W6: 4> 3, 7 = 14 .... ?

      Ich habe es schon mit Splitten versucht (Eingabe: /d w8 oder /d 8 ~ /d w4+w6), aber nicht hinbekommen.

      MfG
      Zuletzt editiert von Jürgen Thomas; 05.03.2010, 09:59. Reason: Code mit [highlight=c#] oder notfalls [code] markieren; bitte künftig selbst darauf achten!

      Comment


      • #4
        PS. du meinst sicher Perl. Pearl ist eine altes Echtzeitsystem mit Programmiersprache. Jemand der ein entsprechendes System zur Verfügung hat würde wohl kaum ein Würfelspiel darauf programmieren. Obwohl ..... mmmhh
        http://de.wikipedia.org/wiki/Perl_%2...miersprache%29

        sogar hier

        http://entwickler-forum.de/forumdisplay.php?f=218
        Christian

        Comment


        • #5
          Ich komme nicht weiter, kann jemand ein Beispiel angeben? Oder wie ich ungefähr vorgehen muss?

          Er sollte z.B "/d w4+w6+w10" würfeln können, als Log:

          User {Name} würfelt mit W4+W6+W10: 2, 6> 4, 7 = 19.

          Die "w"s sind optional, keine Pflicht.

          Außerdem sollte dies bei "3W4" funktionieren, das heißt: [Anzahl]w[Augenzahl].

          MfG

          Comment


          • #6
            Wennd das PERL Programm das schon macht, brauchst du es doch nur zu übernehmen
            Christian

            Comment


            • #7
              Mir gruselt irgendwie wenn ich sehe wie das programmiert ist.

              Mal so auf die Schnelle:

              [highlight=c#]
              namespace DiceGame
              {
              class Program
              {
              static void Main(string[] args)
              {
              do
              {
              Console.Write("Bitte Würfel getrennt mit Leerzeichen eingeben:");
              String diceString = Console.ReadLine();

              if (diceString == null)
              diceString = "6";

              String[] diceStrings = diceString.Split(' ');

              IList<Dice> dices = new List<Dice>();
              foreach(String diceValue in diceStrings)
              dices.Add(new Dice(int.Parse(diceValue)));

              var game = new DiceGame(dices);
              game.Play();

              Console.WriteLine(" ");
              Console.Write("'play' eingeben um noch eine Runde zu spielen: ");
              } while (Console.ReadLine() == "play");

              }
              }

              public class Dice
              {
              private Random _random;
              private int _rolledValue;
              private int _sides;

              public Dice(int sides)
              {
              _sides = sides;
              _random = new Random();
              _rolledValue = _random.Next(1, _sides);
              }

              public int Roll()
              {
              _rolledValue = _random.Next(1, _sides);
              return _rolledValue;
              }

              public int RolledValue { get { return _rolledValue; } }
              public int Sides { get { return _sides; } }
              }

              public class DiceGame
              {
              public IEnumerable<Dice> Dices { get; set; }

              public DiceGame(IEnumerable<Dice> dices)
              {
              Dices = dices;
              }

              private void RollDices()
              {
              foreach (Dice dice in Dices)
              dice.Roll();
              }

              public void Play()
              {
              RollDices();

              int maxValue = 0;

              foreach (Dice dice in Dices)
              maxValue += dice.RolledValue;

              Console.WriteLine("MaxValue = " + maxValue.ToString());

              int roundValue = 0;
              while (roundValue < maxValue)
              {
              RollDices();

              foreach (Dice dice in Dices)
              {
              roundValue += dice.RolledValue;
              Console.WriteLine("W" + dice.Sides + " hat gewürfelt: " + dice.RolledValue);
              }

              if (roundValue < maxValue)
              Console.WriteLine("Rundenwert: " + roundValue + " < maxValue (" + maxValue + ") => next Round");
              }

              Console.WriteLine("Rundenwert: " + roundValue + " >= maxValue (" + maxValue + ") => Ende");
              }
              }
              }
              [/highlight]

              Ist zwar immer noch nicht optimal, aber wohl ein Anfang
              Zuletzt editiert von fanderlf; 05.03.2010, 17:38.

              Comment


              • #8
                Ich hab es ja nicht geschrieben, sondern ein Kumpel.

                MfG

                // Edit:

                Das Spiel ist nett, aber ich habe es mir etwas anders vorgestellt.

                Wenn man z.B 6 würfelt und eine 6 kommt, soll nochmal gewürfelt werden, solange, bis nicht mehr das Maximum erreicht wird, Beispiel:

                W6: 6> 6> 2 = 14
                Zuletzt editiert von String08; 05.03.2010, 18:19.

                Comment


                • #9
                  Dann addiere doch die Werte einfach auf. So schwer ist das an meinem Beispiel nicht abzuändern.

                  Comment

                  Working...
                  X