添加计时器到空闲游戏

时间:2016-01-14 03:18:25

标签: c# timer

好的,所以当我学习C#时,我遇到了一个我无法完全理解的问题。

我正在建造一个闲置的游戏来学习书本教我的东西。无论如何,我正在添加一个“自动点击器”功能。我认为我应该添加一个计数到1秒的计时器,并为玩家的分数添加金币。也许这不是解决这个问题的最好方法,但到目前为止我还有:

根据请求更新了代码,错误尝试加载System.Timers.Timer;

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;
using System.Timers;

namespace IdleClicker1
{

public partial class Form1 : Form
{
    public double gold = 0;
    public double goldPerClick = 1;
    public double upgradeCost = 20;
    public double autoMinerLevel = 0;
    public double autoMinerCost = 10;
    public System.Timers.Timer autoMineTimer = new System.Timers.Timer();

    public Form1()
    {
        InitializeComponent();
    }

    private void btnGetGold_Click(object sender, EventArgs e)
    {
        gold += goldPerClick;
        updateGoldShown();
    }

    public void updateGoldShown()
    {
        lblGold.Text = "Gold: " + gold.ToString();
        lblGoldPerClick.Text = "Gold per click: " + goldPerClick.ToString();
        lblAutoMiner.Text = "Auto-Miner Level: " + autoMinerLevel.ToString();
    }

    private void btnUpgradeClick_Click(object sender, EventArgs e)
    {
        if (gold >= upgradeCost)
        {
            gold = gold - upgradeCost;
            goldPerClick = goldPerClick + 1;
            upgradeCost = upgradeCost + 10;
            lblUpgradeCost.Text = "Cost to upgrade: " + upgradeCost.ToString();
            updateGoldShown();
        }
        else
        {
            MessageBox.Show("Sorry bub... not enough gold yet!", "Error buddy!");
        }
    }

    public void btnAutoMiner_Click(object sender, EventArgs e)
    {
        if (gold >= autoMinerCost)
        {
            autoMinerLevel++;
            gold = gold - autoMinerCost;
            autoMinerCost = autoMinerCost + 10;
            btnAutoMiner.Text = "Buy Auto-Miner for: " + autoMinerCost.ToString();
            updateGoldShown();

            //Adding a new timer
            System.Timers.Timer autoMineTimer = new System.Timers.Timer();
            autoMineTimer.Tick += new EventHandler(timer_Tick);
            autoMineTimer.Interval = 1000;
            autoMineTimer.Enabled = true;
            autoMineTimer.Start();

        }
        else {
            MessageBox.Show("Sorry... not enough gold!", "Error again... yo!");
        }
    }

    void timer_Tick(object sender, EventArgs e)
    {
        updateGoldShown();
        btnGetGold.PerformClick();
    }
}

}

基本上,这是一个非常简单的设置。我只是想通过练习和应用自己来学习。所以当用户点击btnAutoMiner时,它应该启动一个计时器,它会将goldPerClick添加到玩家的黄金中。我不想要一个确切的答案(否则我永远不会学习),但有人能抽象地帮助我吗?

3 个答案:

答案 0 :(得分:2)

我不确定计时器的重点是什么。你想每秒或每次点击运行btnAutoMiner_Click吗?如果你添加每次点击,计时器的重点是什么?对不起,要理解你的目标有点困难。

Here是计时器文档,以备不时之需。

编辑:要从计时器执行单击,您可以使用.PerformClick模拟点击。

答案 1 :(得分:0)

假设您的GetGold按钮按预期工作,您可以以编程方式触发它的点击处理程序:

btnGetGold.PerformClick();

您可以将此代码放入Timer的tick事件处理程序中。

答案 2 :(得分:0)

我的意思是最深刻的尊重,但您是否尝试使用调试器和断点检查是否所有内容都按预期展开。

我冒昧地重新创建你的程序,制作一个适合你代码的表单,我得到的是一个按照你所描述的行为的功能程序,当我点击GetGold我的黄金增加了{{1} }值与预期值一样,与goldPerClick相同。

当我点击UpgradeClick我在按钮事件方法中有一个断点时,水平按预期上升了1并且计时器开始正常,再次使用断点我正在监视计时器事件方法,这是按预期每秒调用一次,因此结论是您的程序的行为与逻辑上的预期一致。

然而,对于GUI有一些问题,值没有更新,因为计时器滴答,所以我建议先看那里,也有些标签/按钮文本只有在点击某些按钮时才会更新,所以我再次建议将所有这些放在同一个地方,并在需要时调用该方法。

也是一些友好的设计建议(不过于具体):
一致性对于良好的设计很重要,这意味着使用Buy Auto-Minervalue1 += value2两者同样正确,但主要是为了保持一致性。
使用正确的值类型,对10之类的简单数字使用int值(sbyte,byte,short,ushort,int,uint或char),并对1.5(Double,Float)等值使用浮点值

我真的希望这些技巧可以帮助您顺利完成项目。