2017-10-26 9 views
3

チェス盤からタイルをチェックするために呼び出すコードが非常に長くなり、同じタイル名のピクチャボックスに適切なイメージが表示されます。コードを短縮する動的イメージ名

private void DisplayBoardDisplayTile(string xtile, string piece) 
    { 
    if (xtile == "a1") 
     { 
      if (piece == "0000") { a1.Image = WindowsFormsApplication5.Properties.Resources.S0000; } //empty 
      if (piece == "0001") { a1.Image = WindowsFormsApplication5.Properties.Resources.S0001; } //white pawn 
      if (piece == "0010") { a1.Image = WindowsFormsApplication5.Properties.Resources.S0010; } //white rook 
      if (piece == "0011") { a1.Image = WindowsFormsApplication5.Properties.Resources.S0011; } //white knight 
      if (piece == "0100") { a1.Image = WindowsFormsApplication5.Properties.Resources.S0100; } //white bishop 
      if (piece == "0101") { a1.Image = WindowsFormsApplication5.Properties.Resources.S0101; } //white queen 
      if (piece == "0110") { a1.Image = WindowsFormsApplication5.Properties.Resources.S0110; } //white king 
      if (piece == "0111") { a1.Image = WindowsFormsApplication5.Properties.Resources.S0111; } //black pawn 
      if (piece == "1000") { a1.Image = WindowsFormsApplication5.Properties.Resources.S1000; } //black rook 
      if (piece == "1001") { a1.Image = WindowsFormsApplication5.Properties.Resources.S1001; } //black knight 
      if (piece == "1010") { a1.Image = WindowsFormsApplication5.Properties.Resources.S1010; } //black bishop 
      if (piece == "1011") { a1.Image = WindowsFormsApplication5.Properties.Resources.S1011; } //black queen 
      if (piece == "1100") { a1.Image = WindowsFormsApplication5.Properties.Resources.S1100; } //black king 
     } 

完全なコードは、このリンクである:タイルが網掛けされhttps://pastebin.com/XLbEeZZH

場合は、私が「S」で始まるイメージ名を使用しない場合は「U」。 また、ピースの値がイメージ名とほとんど同じであるピースをチェックします。

私は

tiles[xtile].Image = ?????."S"+piece; 

または似たような名前のイメージの辞書を利用する(可能な場合)、このような方法でコードを短くしたいです。

ここには私が使ったimage namesのサンプルがあります。

+0

これは学校のプロジェクトのように見えますが、コードの構造をどの程度変更できますか? –

+0

学校のプロジェクトではありません。クラス変数はそのまま維持してください(xtile&piece)。 –

+0

'tiles [xtile] .Image =(Image)Resources.ResourceManager.GetObject(" S "+ piece); ' –

答えて

3

xtilepieceからマッピングする辞書を設定して、_tiles[xtile].Image = _shadings[xtile][piece];のコードを1行にする必要があります。

これを試してみてください:

private static Dictionary<string, System.Drawing.Image> _shaded = new Dictionary<string, System.Drawing.Image>() 
{ 
    { "0000", WindowsFormsApplication5.Properties.Resources.S0000 }, 
    { "0001", WindowsFormsApplication5.Properties.Resources.S0001 }, 
    //etc 
    { "1100", WindowsFormsApplication5.Properties.Resources.S1101 }, 
}; 

private static Dictionary<string, System.Drawing.Image> _unshaded = new Dictionary<string, System.Drawing.Image>() 
{ 
    { "0000", WindowsFormsApplication5.Properties.Resources.U0000 }, 
    { "0001", WindowsFormsApplication5.Properties.Resources.U0001 }, 
    // etc 
    { "1100", WindowsFormsApplication5.Properties.Resources.U1101 }, 
}; 

private static Dictionary<string, PictureBox> _tiles = new Dictionary<string, PictureBox>() 
{ 
    { "a1", a1 }, 
    { "b1", b1 }, 
    // etc 
    { "h8", h8 }, 
}; 

private static Dictionary<string, Dictionary<string, System.Drawing.Image>> _shadings = new Dictionary<string, Dictionary<string, System.Drawing.Image>>() 
{ 
    { "a1", _shaded }, 
    { "b1", _unshaded }, 
    // etc 
    { "h8", _shaded }, 
}; 

private void DisplayBoardDisplayTile(string xtile, string piece) 
{ 
    _tiles[xtile].Image = _shadings[xtile][piece]; 
} 
+0

陰と陰影のないタイルは、白と黒の部分とは関係ありません。 –

+0

@EmanSantos - 申し訳ありませんが、私はそれを逃しました。簡単に修正。 1ダニ。 – Enigmativity

+0

これは素晴らしいことです、私が心に描こうとしていたものです。どうもありがとう。 –

4

リソースは、名前で検索することができます。

Image img = (Bitmap)WindowsFormsApplication5.Properties.Resources.ResourceManager.GetObject("S0000"); 

とSまたはUは(テストしていない)いくつかのビット演算子で計算することができます。

(this.Controls[xtile] as PictureBox).Image = (Bitmap)WindowsFormsApplication5 
    .Properties.Resources.ResourceManager.GetObject("SU"[xtile[0] + xtile[1] & 1] + piece); 
+0

私はこのアプローチも好きですが、コンパイル時にチェックされていないことを心配しています。適切な単体テストや優れたプログラミング方法があれば良いですが、それ以外の場合は簡単に壊れる可能性があります。しかし、優れた代替案。 – Enigmativity

関連する問題