2017-10-13 173 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