C# 骰子游戏(Windows申请表)多期
C# Dice Game (Windows Application Form) Multiple Issues
好的,所以我在处理一个教程问题时遇到了一些问题,所以希望能得到一些指导,因为我是 C# 的新手而且不太擅长。
场景是这样的:
编写一个程序,模拟两个骰子滚动 1000 次。该程序应计算掷双六的次数,并输出 1000 次掷骰子的平均分数。您不需要显示每 1000 卷的结果,只需每 100 卷点击一次“运行 模拟”按钮。按钮和输出应该有适当的标签。
虽然场景说要掷 1000 次并一次掷 2 个骰子,但目前我只掷 10 次和一次掷骰子,直到我能做到这一点。这是我到目前为止编写的代码:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace Dice_Roll_2___Advanced
{
public partial class Form1 : Form
{
int roll;
int countDouble;
int countRoll;
int count;
int count2;
int average;
int doubleSix;
public Form1()
{
InitializeComponent();
}
private void Dice_Roll_Click(object sender, EventArgs e)
{
Random rnd = new Random();
for(count = 0; count <1; count++)
{
for(count2 = 0; count2 < 10; count2++)
{
roll = rnd.Next (6) + 1;
MessageBox.Show(roll.ToString());
if(roll < 6)
{
countRoll++;
}
else if(roll == 6)
{
countDouble++;
}
}
}
}
private void Average_Click(object sender, EventArgs e)
{
average = (countRoll / 10);
Average.Text = average.ToString();
}
private void Doubles_Click(object sender, EventArgs e)
{
doubleSix = countDouble;
Doubles.Text = doubleSix.ToString();
}
第一期
在场景中,它说我必须一次输出100个数字。因为我现在只做 10 个,所以我希望一次输出 10 个。目前,这还没有发生。它给了我一个数字,然后我单击确定,然后它给了我下一个数字,依此类推。我认为代码中的这一行是问题所在,但不确定如何更正它。
MessageBox.Show(roll.ToString());
第 2 期
平均值根本不起作用,每次都给我一个0值。在我的代码中你会看到是否写了:
if(roll < 6)
{
countRoll++;
}
else if(roll == 6)
{
countDouble++;
}
然后在标签中我希望发送信息:
平均值 = (countRoll / 10);
Average.Text = average.ToString();
我知道信息很多,但如有任何帮助,我们将不胜感激。
几点建议:
- 你可以去掉只有运行一次的外层循环;这是不必要的(内部循环至少已经 运行 一次)。
- 通常,
Random
对象的声明是在 class 级别而不是在按钮的 Click
事件处理程序中完成的。以这种方式思考:使用您现在的代码,每次用户按下 Dice_Roll
按钮时,计算机都必须重新创建 Random
对象。这是对系统资源的浪费。
- 如果要在单个消息框中显示滚动,则必须将滚动存储在某个地方(如
int[]
或 List<int>
)。然后,在执行掷骰的循环之外,创建另一个循环来构建您要显示的消息。
- 每个骰子应该掷一次。在您当前的代码中,您只掷一个骰子(并且只检查那个骰子是否为 6)。
- 你应该把
10
"magic number" 变成一个常量(类似于 private const int numRolls = 10;
)。
average = (countRoll / 10);
没有意义。您将卷数除以 10(在这种情况下……是卷数)。对于平均值,您需要将每个卷起来得到总数,然后除以卷数。
- 您的
if
语句也需要一些调整。目前,只有 < 6
的卷才会被计算在内,这意味着 6
的卷不会被计算在内,并且会被排除在平均值之外(可能不是期望的行为)。 countRoll
每次进行掷骰时都应递增,而不管掷骰的值如何。
很遗憾,这是我有时间提供的所有反馈。请不要觉得我在试图拆开您的代码,我只是想指出一些应该让您回到正轨并稍微清理一下 code/logic 的东西。
祝你好运。
好的,所以我在处理一个教程问题时遇到了一些问题,所以希望能得到一些指导,因为我是 C# 的新手而且不太擅长。
场景是这样的: 编写一个程序,模拟两个骰子滚动 1000 次。该程序应计算掷双六的次数,并输出 1000 次掷骰子的平均分数。您不需要显示每 1000 卷的结果,只需每 100 卷点击一次“运行 模拟”按钮。按钮和输出应该有适当的标签。
虽然场景说要掷 1000 次并一次掷 2 个骰子,但目前我只掷 10 次和一次掷骰子,直到我能做到这一点。这是我到目前为止编写的代码:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace Dice_Roll_2___Advanced
{
public partial class Form1 : Form
{
int roll;
int countDouble;
int countRoll;
int count;
int count2;
int average;
int doubleSix;
public Form1()
{
InitializeComponent();
}
private void Dice_Roll_Click(object sender, EventArgs e)
{
Random rnd = new Random();
for(count = 0; count <1; count++)
{
for(count2 = 0; count2 < 10; count2++)
{
roll = rnd.Next (6) + 1;
MessageBox.Show(roll.ToString());
if(roll < 6)
{
countRoll++;
}
else if(roll == 6)
{
countDouble++;
}
}
}
}
private void Average_Click(object sender, EventArgs e)
{
average = (countRoll / 10);
Average.Text = average.ToString();
}
private void Doubles_Click(object sender, EventArgs e)
{
doubleSix = countDouble;
Doubles.Text = doubleSix.ToString();
}
第一期
在场景中,它说我必须一次输出100个数字。因为我现在只做 10 个,所以我希望一次输出 10 个。目前,这还没有发生。它给了我一个数字,然后我单击确定,然后它给了我下一个数字,依此类推。我认为代码中的这一行是问题所在,但不确定如何更正它。
MessageBox.Show(roll.ToString());
第 2 期
平均值根本不起作用,每次都给我一个0值。在我的代码中你会看到是否写了:
if(roll < 6)
{
countRoll++;
}
else if(roll == 6)
{
countDouble++;
}
然后在标签中我希望发送信息: 平均值 = (countRoll / 10); Average.Text = average.ToString();
我知道信息很多,但如有任何帮助,我们将不胜感激。
几点建议:
- 你可以去掉只有运行一次的外层循环;这是不必要的(内部循环至少已经 运行 一次)。
- 通常,
Random
对象的声明是在 class 级别而不是在按钮的Click
事件处理程序中完成的。以这种方式思考:使用您现在的代码,每次用户按下Dice_Roll
按钮时,计算机都必须重新创建Random
对象。这是对系统资源的浪费。 - 如果要在单个消息框中显示滚动,则必须将滚动存储在某个地方(如
int[]
或List<int>
)。然后,在执行掷骰的循环之外,创建另一个循环来构建您要显示的消息。 - 每个骰子应该掷一次。在您当前的代码中,您只掷一个骰子(并且只检查那个骰子是否为 6)。
- 你应该把
10
"magic number" 变成一个常量(类似于private const int numRolls = 10;
)。 average = (countRoll / 10);
没有意义。您将卷数除以 10(在这种情况下……是卷数)。对于平均值,您需要将每个卷起来得到总数,然后除以卷数。- 您的
if
语句也需要一些调整。目前,只有< 6
的卷才会被计算在内,这意味着6
的卷不会被计算在内,并且会被排除在平均值之外(可能不是期望的行为)。countRoll
每次进行掷骰时都应递增,而不管掷骰的值如何。
很遗憾,这是我有时间提供的所有反馈。请不要觉得我在试图拆开您的代码,我只是想指出一些应该让您回到正轨并稍微清理一下 code/logic 的东西。
祝你好运。