在C#中单击第三个按钮时,前两个按钮消失

时间:2014-01-12 00:05:35

标签: c# button tablelayoutpanel

这是我的代码,它完全正常,除非有一件事无法正常工作。当我单击两个按钮进行匹配时,它们应保持可见,直到用户单击第三个按钮。我怎样才能做到这一点?谢谢。

namespace Memorija_Seminarska
{
    public partial class Form1 : Form
    {

        public Form1()
        {
            InitializeComponent();
            tableLayoutPanel1.Enabled = false;
            label1.Visible = false;
            label2.Visible = false;
            label3.Visible = false;
            progressBar1.Visible = false;
            label2.Text = vreme.ToString();

        }

        public int vreme = 150;

        Random random = new Random();

        Button firstClicked = null;
        Button secondClicked = null;

        List<string> drzava = new List<string>() 
        { 
            "Македонија","Македонија", "Бугарија","Бугарија", "Србија","Србија",
            "Германија","Германија", "Канада","Канада", "Шпанија","Шпанија", 
            "Португалија","Португалија", "Австрија","Австрија", "Данска","Данска",
            "Индија","Индија", "Италија","Италија", "Англија","Англија", 
            "Турција","Турција", "Грција","Грција","Хрватска","Хрватска", 
            "Холандија","Холандија", "Русија", "Русија", "Швајцарија","Швајцарија"
        };

        private void startButton_Click(object sender, EventArgs e)
        {
            Add();
            tableLayoutPanel1.Enabled = true;
            label1.Visible = true;
            label2.Visible = true;
            progressBar1.Visible = true;
            timer2.Start();
            timer3.Start();

        }

        private void Add()
        {
            foreach (Control control in tableLayoutPanel1.Controls)
            {
                Button b = control as Button;

                    if (b != null)
                    {
                        int randNum = random.Next(drzava.Count);
                        b.Text = drzava[randNum];
                        b.ForeColor = b.BackColor;
                        drzava.RemoveAt(randNum);
                    }
            }
        }


        private void button_Click(object sender, EventArgs e)
        {
            if (timer1.Enabled == true)
                return;

            Button clickedButton = sender as Button;

            if (clickedButton != null)
            {
                if (clickedButton.ForeColor == Color.Black)
                    return;


                    if (firstClicked == null)
                    {
                        firstClicked = clickedButton;
                        firstClicked.ForeColor = Color.Black;
                        return;

                    }

                    secondClicked = clickedButton;
                    secondClicked.ForeColor = Color.Black;

                    Win();

                    if (firstClicked.Text == secondClicked.Text)
                    {
                        firstClicked.BackColor = Color.GreenYellow;
                        secondClicked.BackColor = Color.GreenYellow;

                        firstClicked = null;
                        secondClicked = null;
                        return;

                    }


                    timer1.Start();

                }
            }

        private void timer1_Tick(object sender, EventArgs e)
        {

            timer1.Stop();

            firstClicked.ForeColor = firstClicked.BackColor;
            secondClicked.ForeColor = secondClicked.BackColor;

            firstClicked = null;
            secondClicked = null;

        }

        private void timer2_Tick(object sender, EventArgs e)
        {

            vreme--;
            label2.Text = vreme.ToString();

            if (vreme == 0)
            {
                tableLayoutPanel1.Enabled = false;

                label3.Text = "Game over!";
                label3.Visible = true;
                label2.Visible = false;
                timer2.Stop();
                timer3.Stop();
                label1.Visible = false;
                progressBar1.Visible = false;
            }

        }

        private void timer3_Tick(object sender, EventArgs e)
        {
            progressBar1.Value -= 1;

            if (progressBar1.Value == 0)
            {
                timer3.Stop();
            }
        }

        private void Win()
        {
            foreach (Control control in tableLayoutPanel1.Controls)
            {
                Button button1 = control as Button;

                if (button1 != null)
                {

                    if (button1.ForeColor == button1.BackColor)
                    {
                        return;
                    }
                }
            }

            label3.Text = "Браво!!!";
            label3.Visible = true;
            tableLayoutPanel1.Enabled = false;
            timer2.Stop();
            timer3.Stop();
            label2.Visible = false;
            progressBar1.Visible = false;
            label1.Visible = false;

        }



    }
}

2 个答案:

答案 0 :(得分:4)

据我所见,您的timer1_Tick处理程序会在时间段到期时自动执行隐藏。如果您希望在单击第三张卡时手动进行隐藏,则不应该隐藏那里的按钮,而应该只在button_Click的开头执行检查:

private void button_Click(object sender, EventArgs e)
{
    //two cards are open and not matching (if they matched, they would be already null)
    if ( firstClicked != null && secondClicked != null )
    {
        //hide the buttons
        firstClicked.ForeColor = firstClicked.BackColor;
        secondClicked.ForeColor = secondClicked.BackColor;
        firstClicked = null;
        secondClicked = null;
    }
}

并从事件处理程序的末尾删除timer1.Start()

答案 1 :(得分:2)

我不擅长理解其他人的代码,但据我所知,你在这里做到这一点:     private void button_Click(object sender,EventArgs e)

  1. 检查为空
  2. 获取按钮1的参考并返回
  3. 获取按钮2的参考
  4. 做win()方法
  5. 检查是否平等
  6. 这里你应该把第5步发送到前线,检查是否为MZetko说的空,然后检查是否相等,所以它将是第三次点击,否则如果你得到参考,在第二个按钮填满后,检查也将推出

    我希望我有所帮助

相关问题