2017-01-19 20 views
0

私はC#の初心者ですので、ご一緒ください。 C#でボードゲームを作成していますが、問題があります。 ゲームは、次のようになります。 Solo Board gameCで1つのボタンだけがクリックされていないことを確認してください。

2つの白いドットがあなたのスタート位置です。ゲームの目標は、白い点でボードを埋めることですが、1つの点だけが黒のままです。

私の質問は:すべてのボタンが白であり、一方だけが黒であるかどうかを確認する方法は?

コードはあまり最適化されていません。 Form1クラスはフォーム用、Stoneクラスはすべての点用、Winフォームクラスはゲームに勝ったときのフォーム用クラスです。

コード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]); 
      } 
     } 
    } 
} 

コード石クラス:

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

namespace Solo 
{ 
    public class Stone : Button 
    { 
     Pen pen = new Pen(Color.Black, 19); 

     bool clicked = false; 

     public Stone() 
     { 
      this.Paint += new PaintEventHandler(this.Stone_Paint); 
      this.FlatStyle = FlatStyle.Flat; 
      this.FlatAppearance.BorderSize = 0; 
      this.Size = new Size(40, 40); 
     } 

     public void setLocation(int x, int y) 
     { 
      Point loc = new Point(x, y); 
      this.Location = loc; 
     } 

     public void stone_Click(object sender, EventArgs a) 
     { 
      Button btn = sender as Button; 

      if (clicked == true) 
      { 
       pen.Color = Color.Black; 
       Invalidate(); 
       clicked = false; 
       Console.WriteLine(clicked); 
      } 

      else if (clicked == false && pen.Color == Color.Black) 
      { 
       pen.Color = Color.White; 
       Invalidate(); 
       clicked = true; 
       Console.WriteLine(clicked); 
      } 
     } 

     public void Stone_Paint(object sender, PaintEventArgs b) 
     { 
      b.Graphics.DrawEllipse(pen, 10, 10, 19, 19); 
     } 

     public Pen getPen() 
     { 
      return pen; 
     } 

     public void setClick(bool bl) 
     { 
      bl = clicked; 
     } 
    } 
} 

コードの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(); 
     } 
    } 
} 

私は、これは十分な情報であると思います。 ありがとうございます!

+3

あなたの問題に関連するコードだけを投稿し、問題をより正確に指定できますか?あなたの現在のアピールで何が問題なのかを説明してください –

+0

私の問題は、ボード上のすべてのボタンが白以外のものかどうかをチェックする方法がわかりません。 – geartzen9

+0

ちょっとした書式を追加すると、10分で4つの回答が得られるように質問が明確になりました。 – Filburt

答えて

1

あなたのコードを正しく理解していれば、Stone.clicked変数で石がクリックされたかどうかを覚えています。

それはStoneクラスの外からアクセスできるように、この変数を公開:

public class Stone : Button { 
    public bool Clicked { get; private set; } 
} 

次にあなたがStone[] stを検査することにより、すべてのクリックした後、全体の状態を確認することができます。私はこのLINQ使用してください:prof1990によって示唆されるように、

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

編集

を以下では、より読みやすいです:

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

また、Stone.Clicked民間のセッターを作ることは必ず誰ということになり外から国を混乱させることができます。

+1

非常に優雅ですが、 'st.Count(s =>!s.Clicked)== 1'を使用するとさらに明確になります – prof1990

0

石色をパブリックプロパティにする必要があります。クリックするたびにForm1クラスの勝利条件をチェックしてください。 条件ビーイング:

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

がクリックされていない石が黒いままと仮定すると...

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

あなたがそうまだ黒でどのように多くの石

1

を確認することができるようにこれは実際には、あなたがStone秒、ないButtonのを確認したい、石がクリックされるたびに実行することができます。 ?すべてのボタンが白であり、一方だけが黒であるかどうかを確認する方法

LINQのの助けを借りて、あなたはこのようにそれを置くことができますか

var blackCount = Controls 
    .OfType<Stone>() 
    .Count(stone => stone.getPen().Color == System.Drawing.Color.Black); 

    if (blackCount == 1) { 
    ... 
    } 

P.S.実際には、UI(ボタンの色、ボタンを灰色と黄色に書き換えるとどうなるでしょうか?)とロジック(撮影された石と生きている石)を混ぜた条件stone.getPen().Color == System.Drawing.Color.Blackが好きではありません。 stone => stone.Clicked

関連する問題