C#Timer-Crop农场游戏错误

时间:2015-11-04 22:07:33

标签: c# timer

我有一个关于计时器的简短问题。在我的代码中,我想创建一个农作物种植游戏,带有一个计时器,显示工厂是否已完成 为什么这样:

    public static string currentPlant;
    public static Timer growTimer;
    public static void InitGrowTimer( int time, string name )
    {
        growTimer = new Timer();
        growTimer.Tick += new EventHandler(growTimer_Finished);
        growTimer.Interval = time;

        currentPlant = name;
    }
    public static void plantCrop(string crop)
    {
        if (plantActive == false)
        {
            if (plants.Contains(crop.ToLower()))
            {

                // growTimer.Interval = <plant>Time;
                // proceed plants
                switch (crop.ToLower())
                {
                    case "wheat":
                        InitGrowTimer(wheatTime, wheatName);
                        growTimer.Start();
                        break;

                    default:
                        MessageBox.Show("FATAL ERROR\nThe plant is contained in the definition list but not in the plant menu!", "Civilisation", MessageBoxButtons.OK, MessageBoxIcon.Error);
                        break;
                }

            }
            else
            {
                MessageBox.Show("This plant is not available!", "Civilisation", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }
        else
        {
            Console.ForegroundColor = ConsoleColor.Red;
            Console.WriteLine("There is already a plant in progress! Current plant: {0}", currentPlant);
        }
    }

    private static void growTimer_Finished (object sender, EventArgs e)
    {
        growTimer.Stop();
        MessageBox.Show("Your " + currentPlant + " is finished!", "Civilisation", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
    }

不启动计时器,或者只是在结尾处没有显示消息框。在创建计时器或创建计时事件时我做错了什么?

编辑:这是我的主要方法:

static void Main(string[] args)
    {
        InitializeLists();
        // game begin
        Farm.plantCrop("wheat");
        Console.ForegroundColor = ConsoleColor.Green;
        Console.Write("Please enter your desired name: ");
        QC.resetColors();
        name = Console.ReadLine();
        Console.WriteLine(/*Introduction*/"Welcome to the world of Civilisation. In this world it is your choice what\n" +
                                          "you are up to. You can be a farmer, miner or fighter, whatever you want, the\n" + 
                                          "world is yours to explore! Have fun!"
                                          );
        Console.ReadKey();
        Console.Clear();

        while (true) // run game
        {
            // menu
            Console.Write("         What do you want to do?\n" +
                          "Farm    Mine    Explore    Go to the city\n"
                          );
            input = Console.ReadLine();
            if (menuContent.Contains(input.ToLower()))
            {
                if (input.ToLower() == menuContent.ElementAt(0))
                {
                    // farm
                    Console.ForegroundColor = ConsoleColor.Green;
                    Console.WriteLine("-- Farm --\nSelect a crop to plant:");
                    Console.ForegroundColor = ConsoleColor.DarkGreen;
                    int icount = 0;
                    for ( int i = 0; i < Farm.plants.Count; i++)
                    {
                        if (icount < 3)
                        {
                            Console.Write(Farm.plants.ElementAt(i));
                            Console.Write("\t\t");
                            icount++;
                        }
                        else
                        {
                            Console.Write("\n");
                            icount = 0;
                            Console.Write(Farm.plants.ElementAt(i));
                            Console.Write("\t\t");
                            icount++;
                        }
                    }
                    Console.WriteLine();
                    QC.resetColors();
                    string crop = Console.ReadLine();
                    Farm.plantCrop(crop);
                }
                if (input.ToLower() == menuContent.ElementAt(1))
                {
                    // miner

                }
                if (input.ToLower() == menuContent.ElementAt(2))
                {
                    // fight

                }
            }





        }
    }

2 个答案:

答案 0 :(得分:2)

System.Windows.Forms.Timer计时器适用于具有单个UI线程的Windows窗体应用程序。

您需要使用System.Threading.Timer计时器代替您的控制台应用程序。

它的创建和回调的参数有点不同:

    public static void InitGrowTimer(int time, string name)
    {
        growTimer = new System.Threading.Timer(GrowTimer_Finished, null, time, Timeout.Infinite);
        currentPlant = name;
    }

    private static void GrowTimer_Finished(object sender)
    {
        MessageBox.Show("Your " + currentPlant + " is finished!", "Civilisation", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
    }

您不需要任何Start方法,它会在创建时自动启动。

您也不需要Stop;由于Timeout.Infinite参数,它只会运行一次。

如果需要,您可以将null替换为您希望回调接收的对象(即EventArgs中的内容)。

小方注意:我已经在PascalCase中重命名了你的回调方法。按照惯例,C#中的方法应始终以大写字母开头。

答案 1 :(得分:-2)

因为你告诉自己,不要启动计时器。

growTimer = new Timer();
growTimer.Tick += new EventHandler(growTimer_Finished);
growTimer.Interval = time;
growTimer.Start();