将int处理为列表名称

时间:2016-01-16 09:09:17

标签: c# list

我尝试用河内塔写一个简单的控制台应用程序。但我一度陷入困境。

在我的节目中,我要求一个人写一个塔想要放入磁盘,但是:我有三个列表作为塔,我会向游戏玩家索取一个号码,现在我如何构建一个& #34;比较方法"?因为我不想复制同一段代码6次......

class Towers : Disks
{
    //public Towers(int Value, int WhereItIs) : base(Value, WhereItIs) { }

    public List<Disks> Tower1 = new List<Disks>();
    public List<Disks> Tower2 = new List<Disks>();
    public List<Disks> Tower3 = new List<Disks>();

    public void Compare(int dyskFrom, int dyskWhere) {
    }

    public void Display() { 
        foreach(var i in Tower1){
            Console.WriteLine("Where: {0} | Value: {1}", i.WhereItIs, i.Value);
        }
    }

    public void Build(int TowerHigh) {
        for (int i = TowerHigh; i > 0; i--) {
            Tower1.Add(new Disks {Value = i, WhereItIs = 1 });
        }
    }
}

class Disks
{
    public int Value; //wartosc krazka
    public int WhereItIs; //na ktorej wiezy sie on znajduje
}

class Program
{
    static void Main(string[] args)
    {
        Towers Tower = new Towers();
        int TowerHigh;
        Console.Write("Podaj wysokość wieży: ");
        TowerHigh = int.Parse(Console.ReadLine());

        Tower.Build(TowerHigh);
        Tower.Display();
        Tower.Compare(1, 2);
    }
}

1 个答案:

答案 0 :(得分:0)

创建Stack<Disk>()数组更容易。这样您就可以按索引选择塔。

我会使用Stack,因为这通常是您需要的功能。

类似于: PSEUDO (在浏览器中输入,未检查语法)

class Disk
{
    public int Size {get; set;}
}

static void Main(string[] args)
{
    // create the Stack<Disk> array
    Stack<Disk>[] towers = new Stack<Disk>[3];

    // create each tower
    for(int i=0;i<towers.Length;i++)
    {   
        towers[i] = new Stack<Disk>();

        // fill the towers.
        for(int j=3;j>0;j--)
            towers[i].Enqueue(new Disk {  Size = j });
    }

    bool isHoldingDisk = false;

    while(true)
    {
        DisplayTowers(towers);

        if(isHoldingDisk)
            Console.WriteLine("On what tower do you want to place it?");
        else
            Console.WriteLine("Choose a tower to pick a disk");

        var key = Console.ReadKey(true);

        var chosenTowerIndex = 0;

        switch(key)
        {
            case(Key.Escape):
                break;

            case(Key.D1):
                chosenTowerIndex = 0;
                break;

            case(Key.D1):
                chosenTowerIndex = 1;
                break;

            case(Key.D1):
                chosenTowerIndex = 2;
                break;

            // etc...
        }

        if((chosenTowerIndex < 1) || (chosenTowerIndex >= towers.Length))
            continue;

        // check here if you are holding a disk

        if(isHoldingDisk)
        {
            // logic for testing if you can place the disk here... 
            // using towers[chosenTowerIndex]

            // check if it is completed...
            if(completed)
                break;

            isHoldingDisk = false;
        }
        else
        {
            // check if you can pickup a disk....(if there is any)
            isHoldingDisk = true;
        }
    }

    // final display...
    DisplayTowers(towers);

    Console.WriteLine("Thanks for playing");
}

static void DisplayTowers(Stack<Disk>[] towers)
{
    // draw some fancy asc-ii art...
}