C# 检查C中是否只有一个按钮未单击#

C# 检查C中是否只有一个按钮未单击#,c#,C#,我是C#的初学者,请容忍我。 我正在用C#创建一个棋盘游戏,但我有一个问题。 游戏如下所示: 这两个白点是您的起始位置。游戏的目标是用白点填充棋盘,但只有一个点保持黑色 我的问题是:如何检查所有按钮是否都是白色,只有一个是黑色 代码不是很优化。Form1类代表形式,Stone类代表所有点,Win form类代表赢得比赛时的形式 代码Form1类别: using System; using System.Windows.Forms; namespace Solo { public pa

我是C#的初学者,请容忍我。 我正在用C#创建一个棋盘游戏,但我有一个问题。 游戏如下所示:

这两个白点是您的起始位置。游戏的目标是用白点填充棋盘,但只有一个点保持黑色

我的问题是:如何检查所有按钮是否都是白色,只有一个是黑色

代码不是很优化。Form1类代表形式,Stone类代表所有点,Win form类代表赢得比赛时的形式

代码Form1类别:

using System;
using System.Windows.Forms;

namespace Solo
{
    public partial class Form1 : Form
    {
        //Objects
        public Stone[] st = new Stone[41];
        int[] x = { 50, 100, 150, 200, 250, 300, 350, 0, 50, 100, 150, 200, 250, 300, 350, 400, 0, 50, 100, 150, 200, 250, 300, 350, 400, 50, 100, 150, 200, 250, 300, 350, 100, 150, 200, 250, 300, 150, 200, 250, 200 };
        int[] y = { 0, 0, 0, 0, 0, 0, 0, 50, 50, 50, 50, 50, 50, 50, 50, 50, 100, 100, 100, 100, 100, 100, 100, 100, 100, 150, 150, 150, 150, 150, 150, 150, 200, 200, 200, 200, 200, 250, 250, 250, 300 };

        bool cl = true;

        public Form1()
        {
            InitializeComponent();

            for (int a = 0; a < 41; a++)
            {
                st[a] = new Stone();
            }

            st[12].getPen().Color = System.Drawing.Color.White;
            st[13].getPen().Color = System.Drawing.Color.White;
            st[0].setClick(cl);
        }

        public void Form1_Load(object sender, EventArgs a)
        {
            for (int i = 0; i < st.Length; i++)
            {
                st[i].setLocation(x[i], y[i]);
                st[i].Click += new EventHandler(st[i].stone_Click);

                this.Controls.Add(st[i]);
            }
        }
    }
}
代码Win表单类:

using System;
using System.Drawing;
using System.Windows.Forms;

namespace Solo
{
    public partial class Win : Form
    {
        Button okBut = new Button();
        Label txt = new Label();

        public Win()
        {
            InitializeComponent();

            this.Text = "U hebt Gewonnen!!!";
            this.BackColor = Color.Green;
            this.ForeColor = Color.White;
            this.StartPosition = FormStartPosition.CenterScreen;

            okBut.BackColor = Color.White;
            okBut.ForeColor = Color.Black;
            okBut.Size = new Size(90, 25);
            okBut.Location = new Point(140, 240);
            okBut.Text = "OK";
            okBut.Click += new EventHandler(this.okBut_Click);

            txt.Text = "U hebt Gewonnen!!!";
            txt.Location = new Point(20, 100);
            txt.Size = new Size(400, 100);
            txt.Font = new Font("Arial", 25.0f, FontStyle.Bold);

            this.Controls.Add(okBut);
            this.Controls.Add(txt);
        }

        public void okBut_Click(object sender, EventArgs e)
        {
            this.Hide();
        }
    }
}
我希望这是足够的信息。
提前谢谢

如果我正确理解了您的代码,您还记得是否在
stone.clicked
变量中单击了一个stone

公开此变量,以便可以从
Stone
类外部访问它:

public class Stone : Button {
    public bool Clicked { get; private set; }
}
然后,您可以通过检查
Stone[]st
来检查每次单击后的总体状态。我使用LINQ执行此操作:

bool onlyOneNotClicked = st.Count(s => s.Clicked) == st.Length -1;
编辑

根据prof1990的建议,以下内容更具可读性:

bool onlyOneNotClicked = st.Count(s => s.!Clicked) == 1;

另外,将
Stone.Clicked
的setter设置为private可以确保没有人可以从外部扰乱状态。

如果我正确理解了您的代码,您还记得是否在
Stone.Clicked
变量中单击了一个Stone

公开此变量,以便可以从
Stone
类外部访问它:

public class Stone : Button {
    public bool Clicked { get; private set; }
}
然后,您可以通过检查
Stone[]st
来检查每次单击后的总体状态。我使用LINQ执行此操作:

bool onlyOneNotClicked = st.Count(s => s.Clicked) == st.Length -1;
编辑

根据prof1990的建议,以下内容更具可读性:

bool onlyOneNotClicked = st.Count(s => s.!Clicked) == 1;

此外,将
石头的设定者设置为私有。单击后的
可以确保没有人可以从外部扰乱国家。

您需要将石头颜色设置为公共属性,并在每次单击后在
Form1
类中检查获胜条件。 情况是:

st.Count(x => x.Color == Color.Black) == 1 &&
st.Count(x => x.Color == Color.White) == st.Count() - 1

您需要将石材颜色设置为公共属性,并在每次单击后在
表单1
类中检查获胜条件。 情况是:

st.Count(x => x.Color == Color.Black) == 1 &&
st.Count(x => x.Color == Color.White) == st.Count() - 1

假设没有点击的石头仍然是黑色的

        int numBlack = 0;
        for (int i = 0; i < st.Length; i++)
        {
            if (!st[i].Clicked) numBlack++;
        }
int numBlack=0;
对于(int i=0;i

每次单击石头时都可以运行此操作,以便您可以检查有多少石头仍然是黑色的

假设未单击的石头仍然是黑色的

        int numBlack = 0;
        for (int i = 0; i < st.Length; i++)
        {
            if (!st[i].Clicked) numBlack++;
        }
int numBlack=0;
对于(int i=0;i

每次单击石头时都可以运行此操作,以便您可以检查有多少石头仍然是黑色的

因此,实际上,您要检查的是
石头
s,而不是
按钮
s;在Linq的帮助下,您可以这样说:

如何检查所有按钮是否为白色,只有一个按钮为黑色

var blackCount=控件
第()类
.Count(stone=>stone.getPen().Color==System.Drawing.Color.Black);
如果(黑数==1){
...
}

p.S.事实上,我不喜欢将UI(按钮的颜色;如果将按钮重新绘制为灰色和黄色?)和逻辑(获取和激活的石头)混合在一起的条件
stone.getPen().Color==System.Drawing.Color.Black
。您可能应该将条件更改为类似于
stone=>stone的内容。单击

因此,实际上,您希望选中
stone
s,而不是
按钮
s;在Linq的帮助下,您可以这样说:

如何检查所有按钮是否为白色,只有一个按钮为黑色

var blackCount=控件
第()类
.Count(stone=>stone.getPen().Color==System.Drawing.Color.Black);
如果(黑数==1){
...
}

p.S.事实上,我不喜欢将UI(按钮的颜色;如果将按钮重新绘制为灰色和黄色?)和逻辑(获取和激活的石头)混合在一起的条件
stone.getPen().Color==System.Drawing.Color.Black
。您可能应该将条件更改为类似于
stone=>stone的内容。单击

可以只发布与您的问题相关的代码并更精确地指定问题。描述您当前的方法有什么问题我的问题是,我不知道如何检查板上的所有按钮是否都是白色的,只有一个除外。似乎添加了一些格式使您的问题足够清晰,可以在10分钟内得到4个答案。请您只发布与您的问题相关的代码,并更精确地指定问题。描述您当前的方法有什么问题我的问题是我不知道如何检查板上的所有按钮是否都是白色的,只有一个除外。似乎添加了一些格式使您的问题足够清晰,可以在10分钟内得到4个答案。非常优雅,但使用
st.Count(s=>!s.Clicked)==1
将更加清晰优雅,但使用
st.Count(s=>!s.Clicked)==1
将更加清晰