2017-10-13 168 views
0

我正在學習C#我正在寫一個程序,使數組填充50個隨機數字1-6像骰子,然後檢查每個值或「邊」出現的次數。我在本週早些時候在Python中做了一個骰子游戲,並且遇到了很多麻煩,所以我讓i = j =和match = print outs來測試循環和匹配是否正確迭代,所以我在這裏做了同樣的事情,並且注意到了一些邏輯錯誤:C#骰子游戲邏輯錯誤

  1. i循環似乎重複罰款,但每1次迭代的i,J應該重複50次,但我只得到過一次。

  2. i或j循環根本不會迭代,除非在第47行它指出j> dice.Length。寫作應該是j < dice.Length使它不會迭代。在屏幕上顯示的50個隨機數,所以我知道骰子是50的長度和j是0.

  3. 第三在第50行,如果骰[i] ==骰[j]我得到一個錯誤,j是無效的除非我在for循環之上聲明j,如果我這樣做,我不能在for循環中執行int j = 0,所以我放棄了for循環並做了一個while循環,但它仍然只爲第一個值添加一個值匹配,而不是下一個可能的49.

我只在靜態void編碼,因爲它是一個簡單的控制檯應用程序,感謝您的幫助。

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 

namespace wk8hw2 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     {//staticvoid 
      int size = 50; 
      int diceSides = 7; 
      int matchAdd = 0; 
      int[] dice = new int[size]; 
      int[] match = new int[diceSides]; 
      Random rnd = new Random(); 
      int j = 0; 

      Console.WriteLine("Press any key to roll the dice " + size + " times."); 
      Console.ReadKey(); 

      for (int i = 0; i < dice.Length; i++)//roll dice 
      { 
       dice[i] = rnd.Next(1, diceSides); 
      } 
      for (int i = 0; i < dice.Length; i++)//show dice 
      { 
       Console.Write(dice[i] + " "); 
      } 
      Console.WriteLine("done showing dice");//DEBUG 
      for (int i = 0; i < dice.Length; i++)//outer match loop 
      { 
       Console.Write("i = " + i);//DEBUG 
       if (match[dice[i]] == 0)//if not matched add to match array 
       { 
        Console.WriteLine("not yet matched"); 
        matchAdd = 1; 
       } 
       else//if alerady matched add no more 
       { 
        Console.WriteLine("already matched"); 
        matchAdd = 0; 
       } 
       j = 0; 
       while (j > dice.Length)//inner match loopSUPPOSED TRO BE LESS THAN 
       { 
        Console.WriteLine("j = " + j); 
        if (dice[i] == dice[j])//if equal add to match array 
        { 
         match[dice[i]] = match[dice[i]] + matchAdd; 
         Console.WriteLine("val " + match[dice[i]]); 
        } 
        j++; 
       } 
      }//endFORouter 

      for (int i = 1; i < match.Length; i++) 
      { 
       Console.WriteLine(i + " came up " + match[i] + " times."); 
      } 

      Console.ReadKey(); 
     }//endstaticvoid 
    } 
} 
+0

如果你在邏輯上滾動6面骰子,不要有一個值爲'7'的變量'diceSides'。使它成爲'6',因爲這是有道理的,並將滾動語句更改爲'rnd.Next(diceSides)+ 1'。 – itsme86

+0

最終值爲6是不是問題,在C#顯然你輸入的最大值實際上是最大+ 1,如果我把6我只得到1-5,如果我輸入7爲最大我得到1- 6 – JGoss

+0

但是,如果你像我建議的那樣做了'rnd.Next(6)+ 1',你可以以更清晰的方式得到(0-5)+ 1給你1 - 6,而不需要混淆讀者的想法,重新嘗試擲出7面骰子。 – itsme86

回答

0

我可是第一個答案同意...你說你正在學習C#和基於命名空間,這是一個家庭作業和你很可能學習陣列,所以我會重寫它有點不同

你似乎正在做很多循環的方法,並通常做的很多。讓代碼儘可能簡單並命名變量,告訴任何讀取代碼的人。

int numberOfRolls = 50; 
int diceSides = 6; 
int[] dice = new int[numberOfRolls]; 
int[] match = new int[diceSides]; 
Random random = new Random(); 

Console.WriteLine("Press any key to roll the dice " + numberOfRolls + " times."); 
Console.ReadKey(); 

for (int rollCount = 0; rollCount < numberOfRolls; rollCount++) 
{ 
    var rollResult = random.Next(1, diceSides+1); 
    match[rollResult-1]++; 
} 

for (int i = 0; i < match.Length; i++) 
{ 
    Console.WriteLine(i+1 + " came up " + match[i] + " times."); 
} 

Console.ReadKey(); 
+0

非常感謝你,我很難收集你開始時我在做,但我很確定我現在在理解它:您擲骰子並將其存儲在rollResult中,然後在點陣結果中向匹配數組添加1(我假設+1是佔事實上,0是數組中的第一個點,1是我們正在使用的最小值?)如果我想打印每個卷,因爲它發生了,我會打印rollResult在它設置的位置下的行嗎? – JGoss

+0

我應該添加更多文檔,但是對於匹配[rollResult-1]以及diceSides + 1,您是正確的。您也可以通過在第一個循環中添加一行來打印rollResult。 –

0

我已經重寫這件事爲:

Random rnd = new Random(); 
const int diceSides = 6; 
const int numDice = 50; 

Console.WriteLine("Press any key to roll the dice {0} times.", numDice); 
Console.ReadKey(); 

var diceByValue = Enumerable.Range(0, numDice) 
         .Select(_ => rnd.Next(diceSides) + 1) 
         .GroupBy(v => v) 
         .OrderBy(g => g.Key); 

foreach (var group in diceByValue) 
    Console.WriteLine("{0} came up {1} times.", group.Key, group.Count()); 
+0

只是忘了在範圍中使用numDice;) – OctoCode

+0

我是新手編程我在我的第一課,所以我試圖用簡單的邏輯來做,而不是使用每種語言的更強大的語句。我只是不知道enumerable.range是或.select .groupby,但我肯定會研究所有這些命令的確切含義,謝謝 – JGoss