C# 在宾果游戏中跟踪选定的数字

C# 在宾果游戏中跟踪选定的数字,c#,C#,我必须创建一个类来跟踪在生成棋盘和在游戏中选择数字的过程中已经选择的数字 我需要的3个课程: 1一个重置类,在卡上填满数字后初始化该类,以便再次使用该数组跟踪游戏期间选择的数字 2一个IsNumberSeed类,它被赋予随机整数并检查随机数是否在NumberList数组中 3一个setUsedNumber类,用于将生成的唯一随机数添加到NumberList数组中 我一直在努力,希望得到任何反馈。谢谢大家! public class SelectedNumbersListType { pr

我必须创建一个类来跟踪在生成棋盘和在游戏中选择数字的过程中已经选择的数字

我需要的3个课程:

1一个重置类,在卡上填满数字后初始化该类,以便再次使用该数组跟踪游戏期间选择的数字

2一个IsNumberSeed类,它被赋予随机整数并检查随机数是否在NumberList数组中

3一个setUsedNumber类,用于将生成的唯一随机数添加到NumberList数组中

我一直在努力,希望得到任何反馈。谢谢大家!

public class SelectedNumbersListType
{
    private int[] numbersList;
    private int position;

    public SelectedNumbersListType()
    {
        numbersList = new int[76];
        position = 0;


    }
    public void reset()
    {
        // position = numbersList[0];
        // position++;
        for (position = 0; position < numbersList.Length; position++)
        {
            numbersList[position] = 0;

            if (position == numbersList.Length)
            {
                position = numbersList[0];
            }
        }
       // reset();
        }
    public bool isNumberUsed(int rn)
    {
        position = numbersList[0];
        position++;
        if (numbersList[position] == rn)
        {

            return true;
        }
        return false;
    }

    public bool setUsedNumber(int rn)
    {

        if (numbersList.Contains(rn))
        {
            Array.Resize(ref numbersList, numbersList.Length+1);
            numbersList[numbersList.Length + 1] = rn;

        }
        return false;
    }

}   

}我认为退一步,从头开始是有道理的。正如@ThomasWeller所指出的,面向对象的分析从识别问题空间中的名词开始,然后识别作用于这些名词的动词

当我看你的宾果游戏问题时,我只看到一个名词,宾果游戏。所以,我要给我上一节课。从调用方的角度来看,有两个主要的动作动词作用于该名词:DrawNumber和RestartGame。此外,我认为能够获得游戏中绘制的数字列表非常有用,包括平局顺序和排序顺序。因此,我又看到了两个动词getDrawnNumber和getDrawnNumber

在C族语言中,从0开始计数总是比从1开始计数更有意义。所以,我将使用0-74范围内的数字,而不是1-75范围内的数字。每当我显示一个数字时,我都会在它前面加上适当的字母B、I、N、G或O,然后加上一个。因此,我创建了一个私有函数来实现这一点:GetBingoNumberFromNumber

为了画一个数字,我需要一个随机性的来源。该框架提供了一个系统。随机-它不是最好的随机数生成器。不要用它来创建赌场,但在这里它已经足够好了

我还需要一种方法来保留已绘制的数字,既可以用于显示,也可以在游戏中拒绝任何重复的数字。我会在列表中记录这些。最后,我需要知道宾果游戏中的字母是什么,所以我将保留一个字母数组。我本可以将字符串宾果游戏视为一个字符数组,但我认为字符数组更明显。因此,我的课程从以下内容开始:

 public class BingoGame
 {
     private readonly List<int> _drawnNumbers = new List<int>();
     private readonly Random _random = new Random();
     //the indexes for this array are (naturally) 0 through 4
     private static readonly char[] BingoChars = {'B', 'I', 'N', 'G', 'O'};
 }
要得出一个数字,我们将依赖随机。接下来,从0到74之间提取数字。然而,我们需要注意的是,在单场比赛中拉取重复号码的情况。如果发生这种情况,我们将扔掉新绘制的数字,再获取一个。我们将查看先前绘制的编号列表,以确定是否已绘制编号:

 public string DrawNumber()
 {
     int nextNum;
     do
     {
         nextNum = _random.Next(0, 75); //this will return a number between 0 & 74

     } while (_drawnNumbers.Contains(nextNum));
     _drawnNumbers.Add(nextNum);
     return GetBingoNumberFromNumber(nextNum);
 }
这是我们第一次不得不将0-74的数字转换成宾果游戏中有意义的数字。让我们执行该功能:

 private string GetBingoNumberFromNumber(int num)
 {
     //this will result in a number in the 0-4 range
     var bingoIndex = num / 15;
     return $"{BingoChars[bingoIndex]}-{num + 1}";
 }
在读取该函数时,理解整数除法非常重要。将0和14之间的任何整数除以整数15将得到零。类似地,15到29之间的任何数字除以15将得到1。等等

最后,我们需要得到当前游戏的数字。我们将返回绘制的数字列表,使用GetBingoNumberFromNumber进行转换。转换集合的最简单方法是使用LINQ,因此:

 public IEnumerable<string> GetDrawnNumbers()
 {
     return from num in _drawnNumbers
         select GetBingoNumberFromNumber(num);
 }

如果它是工作代码,那么它就不属于这里。代码检查可能没问题。一个对象相当于一个对象。因为对象是由类构成的,所以类应该是名词。做某事的东西是一种方法。方法应该是动词。所以,你的想法是错误的。重置是一个动词,应该是一种方法。isNumberUsed正在做某事,因此它应该是一种方法。setUsedNumber也在做一些事情,应该是一种方法。您需要3个方法,而不是3个类。构造函数中的代码应该替换Reset中的代码,并且构造函数应该调用Reset。另外,请更正方法名称以使用PascalCase。此外,您还可以修复格式缩进、空行、注释代码位置=数字[0];看起来像个虫子。将其设置为存储在第一个索引中的数字,然后递增,然后将其用作数组的索引。如果存储的第一个数字是100怎么办?setUsedNumber似乎会在此处引发异常:NumberList[NumberList.Length+1]。数组的最大索引是numbersList.Length-1。另外,逻辑让我感到困惑——如果数组包含数字,请调整数组大小并将数字添加到最后一个索引中。不管怎样,总是返回错误
 public IEnumerable<string> GetDrawnNumbers()
 {
     return from num in _drawnNumbers
         select GetBingoNumberFromNumber(num);
 }
 public IEnumerable<string> GetDrawnNumbersSorted()
 {
     return from num in _drawnNumbers
         orderby num
         select GetBingoNumberFromNumber(num);
 }
public partial class Form1 : Form
{
    private readonly BingoGame _game = new BingoGame();
    public Form1()
    {
        InitializeComponent();
        _game.StartGame();
    }

    private void StartGameBtn_Click(object sender, EventArgs e)
    {
        _game.StartGame();
        NumbersList.Items.Clear();
        SortedList.Items.Clear();
    }

    private void DrawNumberBtn_Click(object sender, EventArgs e)
    {
        _game.DrawNumber();
        SetListboxItems(NumbersList, _game.GetDrawnNumbers());
        SetListboxItems(SortedList, _game.GetDrawnNumbersSorted());
    }

    private void SetListboxItems(ListBox listbox, IEnumerable<string> numbers)
    {
        listbox.Items.Clear();
        foreach (var item in numbers)
        {
            listbox.Items.Add(item);
        }
    }
}