好的,所以当我学习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添加到玩家的黄金中。我不想要一个确切的答案(否则我永远不会学习),但有人能抽象地帮助我吗?
答案 0 :(得分:2)
我不确定计时器的重点是什么。你想每秒或每次点击运行btnAutoMiner_Click吗?如果你添加每次点击,计时器的重点是什么?对不起,要理解你的目标有点困难。
Here是计时器文档,以备不时之需。
编辑:要从计时器执行单击,您可以使用.PerformClick模拟点击。
答案 1 :(得分:0)
假设您的GetGold
按钮按预期工作,您可以以编程方式触发它的点击处理程序:
btnGetGold.PerformClick();
您可以将此代码放入Timer的tick事件处理程序中。
答案 2 :(得分:0)
我的意思是最深刻的尊重,但您是否尝试使用调试器和断点检查是否所有内容都按预期展开。
我冒昧地重新创建你的程序,制作一个适合你代码的表单,我得到的是一个按照你所描述的行为的功能程序,当我点击GetGold
我的黄金增加了{{1} }值与预期值一样,与goldPerClick
相同。
当我点击UpgradeClick
我在按钮事件方法中有一个断点时,水平按预期上升了1并且计时器开始正常,再次使用断点我正在监视计时器事件方法,这是按预期每秒调用一次,因此结论是您的程序的行为与逻辑上的预期一致。
然而,对于GUI有一些问题,值没有更新,因为计时器滴答,所以我建议先看那里,也有些标签/按钮文本只有在点击某些按钮时才会更新,所以我再次建议将所有这些放在同一个地方,并在需要时调用该方法。
也是一些友好的设计建议(不过于具体):
一致性对于良好的设计很重要,这意味着使用Buy Auto-Miner
或value1 += value2
两者同样正确,但主要是为了保持一致性。
使用正确的值类型,对10之类的简单数字使用int值(sbyte,byte,short,ushort,int,uint或char),并对1.5(Double,Float)等值使用浮点值
我真的希望这些技巧可以帮助您顺利完成项目。