【发布时间】:2016-07-30 04:39:46
【问题描述】:
我正在尝试为在 C# 中模拟棋盘游戏的程序创建设置界面。我有 1 个组合框,它允许用户选择玩家的数量,然后隐藏或显示选定的组合框数量。每个组合框最初应该有所有四个选项(红色、蓝色、绿色、黄色),但是当从一个组合框中选择一种颜色时,它应该从剩余的组合框中删除该选项(即如果玩家 1 选择红色,那么玩家 2-4 应该也不能选择红色)。现在我正在尝试使用多个列表来显示每个组合框中的信息,但是我编写的用于从剩余组合框中删除颜色的代码产生了许多意想不到的后果。我想知道是否有更好的方法可以在所有组合框之间共享数据。任何帮助/想法将不胜感激!
我在下面附上了我的代码,让您更好地了解我正在使用什么。感谢您的宝贵时间!
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;
namespace StartPage.CS
{
public partial class SetUp : Form
{
// Create a static array to hold the players
public static Player[] players { get; private set; }
// create lists to hold the colors for each player
List<String> player1Colors = new List<String>();
List<String> player2Colors = new List<String>();
List<String> player3Colors = new List<String>();
List<String> player4Colors = new List<String>();
public SetUp()
{
InitializeComponent();
}
private void SetUp_Load(object sender, EventArgs e)
{
// initialize the selected index to 2 players
cboSelectPlayers.SelectedIndex = 0;
// add the colors to each list
player1Colors.Add("Red");
player1Colors.Add("Blue");
player1Colors.Add("Green");
player1Colors.Add("Yellow");
player2Colors.Add("Red");
player2Colors.Add("Blue");
player2Colors.Add("Green");
player2Colors.Add("Yellow");
player3Colors.Add("Red");
player3Colors.Add("Blue");
player3Colors.Add("Green");
player3Colors.Add("Yellow");
player4Colors.Add("Red");
player4Colors.Add("Blue");
player4Colors.Add("Green");
player4Colors.Add("Yellow");
// add each list to it's respective comboBox
for (int i = 0; i < player1Colors.Count; ++i)
{
cboPlayer1Color.Items.Add(player1Colors[i]);
}
for (int i = 0; i < player2Colors.Count; ++i)
{
cboPlayer2Color.Items.Add(player2Colors[i]);
}
for (int i = 0; i < player3Colors.Count; ++i)
{
cboPlayer3Color.Items.Add(player3Colors[i]);
}
for (int i = 0; i < player4Colors.Count; ++i)
{
cboPlayer4Color.Items.Add(player4Colors[i]);
}
}
// method to create the players and add them to the array
// handles displaying the number of players to select colors
private void cboSelectPlayers_SelectedIndexChanged(object sender, EventArgs e)
{
if (cboSelectPlayers.SelectedIndex == 0) // if players = 2
{
lblPlayer3Select.Hide();
cboPlayer3Color.Hide();
lblPlayer4Select.Hide();
cboPlayer4Color.Hide();
}
else if (cboSelectPlayers.SelectedIndex == 1) // if players = 3
{
lblPlayer3Select.Show();
cboPlayer3Color.Show();
lblPlayer4Select.Hide();
cboPlayer4Color.Hide();
}
else if (cboSelectPlayers.SelectedIndex == 2) // if players 4
{
lblPlayer3Select.Show();
cboPlayer3Color.Show();
lblPlayer4Select.Show();
cboPlayer4Color.Show();
}
}
// handles removing player1's selected color from other comboboxes
private void cboPlayer1Color_SelectedIndexChanged(object sender, EventArgs e)
{
if (cboPlayer1Color.SelectedItem == "Red")
{
// remove red from the other comboboxes
player2Colors.Remove("Red");
player3Colors.Remove("Red");
player4Colors.Remove("Red");
// make sure that the other colors that are supposed to be there are
if (!player2Colors.Contains("Blue") && !player3Colors.Contains("Blue") && !player4Colors.Contains("Blue"))
{
player2Colors.Add("Blue");
player3Colors.Add("Blue");
player4Colors.Add("Blue");
}
if (!player2Colors.Contains("Yellow") && !player3Colors.Contains("Yellow") && !player4Colors.Contains("Yellow"))
{
player2Colors.Add("Yellow");
player3Colors.Add("Yellow");
player4Colors.Add("Yellow");
}
if (!player2Colors.Contains("Green") && !player3Colors.Contains("Green") && !player4Colors.Contains("Green"))
{
player2Colors.Add("Green");
player3Colors.Add("Green");
player4Colors.Add("Green");
}
}
else if (cboPlayer1Color.SelectedItem == "Blue")
{
// remove blue from the other comboboxes
player2Colors.Remove("Blue");
player3Colors.Remove("Blue");
player4Colors.Remove("Blue");
// make sure that the other colors that are supposed to be there are
if (!player2Colors.Contains("Red") && !player3Colors.Contains("Red") && !player4Colors.Contains("Red"))
{
player2Colors.Add("Red");
player3Colors.Add("Red");
player4Colors.Add("Red");
}
if (!player2Colors.Contains("Yellow") && !player3Colors.Contains("Yellow") && !player4Colors.Contains("Yellow"))
{
player2Colors.Add("Yellow");
player3Colors.Add("Yellow");
player4Colors.Add("Yellow");
}
if (!player2Colors.Contains("Green") && !player3Colors.Contains("Green") && !player4Colors.Contains("Green"))
{
player2Colors.Add("Green");
player3Colors.Add("Green");
player4Colors.Add("Green");
}
}
else if (cboPlayer1Color.SelectedItem == "Yellow")
{
// remove yellow from the other comboboxes
player2Colors.Remove("Yellow");
player3Colors.Remove("Yellow");
player4Colors.Remove("Yellow");
// make sure that the other colors that are supposed to be there are
if (!player2Colors.Contains("Red") && !player3Colors.Contains("Red") && !player4Colors.Contains("Red"))
{
player2Colors.Add("Red");
player3Colors.Add("Red");
player4Colors.Add("Red");
}
if (!player2Colors.Contains("Blue") && !player3Colors.Contains("Blue") && !player4Colors.Contains("Blue"))
{
player2Colors.Add("Blue");
player3Colors.Add("Blue");
player4Colors.Add("Blue");
}
if (!player2Colors.Contains("Green") && !player3Colors.Contains("Green") && !player4Colors.Contains("Green"))
{
player2Colors.Add("Green");
player3Colors.Add("Green");
player4Colors.Add("Green");
}
}
else if (cboPlayer1Color.SelectedItem == "Green")
{
// remove green from the other comboboxes
player2Colors.Remove("Green");
player3Colors.Remove("Green");
player4Colors.Remove("Green");
// make sure that the other colors that are supposed to be there are
if (!player2Colors.Contains("Red") && !player3Colors.Contains("Red") && !player4Colors.Contains("Red"))
{
player2Colors.Add("Red");
player3Colors.Add("Red");
player4Colors.Add("Red");
}
if (!player2Colors.Contains("Blue") && !player3Colors.Contains("Blue") && !player4Colors.Contains("Blue"))
{
player2Colors.Add("Blue");
player3Colors.Add("Blue");
player4Colors.Add("Blue");
}
if (!player2Colors.Contains("Yellow") && !player3Colors.Contains("Yellow") && !player4Colors.Contains("Yellow"))
{
player2Colors.Add("Yellow");
player3Colors.Add("Yellow");
player4Colors.Add("Yellow");
}
}
// clear and then update the other comboboxes
cboPlayer2Color.Items.Clear();
cboPlayer3Color.Items.Clear();
cboPlayer4Color.Items.Clear();
for (int i = 0; i < player2Colors.Count; ++i)
{
cboPlayer2Color.Items.Add(player2Colors[i]);
}
for (int i = 0; i < player3Colors.Count; ++i)
{
cboPlayer3Color.Items.Add(player3Colors[i]);
}
for (int i = 0; i < player4Colors.Count; ++i)
{
cboPlayer4Color.Items.Add(player4Colors[i]);
}
}
// handles removing player2's selected color from other comboboxes
private void cboPlayer2Color_SelectedIndexChanged(object sender, EventArgs e)
{
if (cboPlayer2Color.SelectedItem == "Red")
{
// remove red from the other comboboxes
player1Colors.Remove("Red");
player3Colors.Remove("Red");
player4Colors.Remove("Red");
// make sure that the other colors that are supposed to be there are
if (!player1Colors.Contains("Blue") && !player3Colors.Contains("Blue") && !player4Colors.Contains("Blue"))
{
player1Colors.Add("Blue");
player3Colors.Add("Blue");
player4Colors.Add("Blue");
}
if (!player1Colors.Contains("Yellow") && !player3Colors.Contains("Yellow") && !player4Colors.Contains("Yellow"))
{
player1Colors.Add("Yellow");
player3Colors.Add("Yellow");
player4Colors.Add("Yellow");
}
if (!player1Colors.Contains("Green") && !player3Colors.Contains("Green") && !player4Colors.Contains("Green"))
{
player1Colors.Add("Green");
player3Colors.Add("Green");
player4Colors.Add("Green");
}
}
else if (cboPlayer2Color.SelectedItem == "Blue")
{
// remove blue from the other comboboxes
player1Colors.Remove("Blue");
player3Colors.Remove("Blue");
player4Colors.Remove("Blue");
// make sure that the other colors that are supposed to be there are
if (!player1Colors.Contains("Red") && !player3Colors.Contains("Red") && !player4Colors.Contains("Red"))
{
player1Colors.Add("Red");
player3Colors.Add("Red");
player4Colors.Add("Red");
}
if (!player1Colors.Contains("Yellow") && !player3Colors.Contains("Yellow") && !player4Colors.Contains("Yellow"))
{
player1Colors.Add("Yellow");
player3Colors.Add("Yellow");
player4Colors.Add("Yellow");
}
if (!player1Colors.Contains("Green") && !player3Colors.Contains("Green") && !player4Colors.Contains("Green"))
{
player1Colors.Add("Green");
player3Colors.Add("Green");
player4Colors.Add("Green");
}
}
else if (cboPlayer2Color.SelectedItem == "Yellow")
{
// remove yellow from the other comboboxes
player1Colors.Remove("Yellow");
player3Colors.Remove("Yellow");
player4Colors.Remove("Yellow");
// make sure that the other colors that are supposed to be there are
if (!player1Colors.Contains("Red") && !player3Colors.Contains("Red") && !player4Colors.Contains("Red"))
{
player1Colors.Add("Red");
player3Colors.Add("Red");
player4Colors.Add("Red");
}
if (!player1Colors.Contains("Blue") && !player3Colors.Contains("Blue") && !player4Colors.Contains("Blue"))
{
player1Colors.Add("Blue");
player3Colors.Add("Blue");
player4Colors.Add("Blue");
}
if (!player1Colors.Contains("Green") && !player3Colors.Contains("Green") && !player4Colors.Contains("Green"))
{
player1Colors.Add("Green");
player3Colors.Add("Green");
player4Colors.Add("Green");
}
}
else if (cboPlayer2Color.SelectedItem == "Green")
{
// remove green from the other comboboxes
player1Colors.Remove("Green");
player3Colors.Remove("Green");
player4Colors.Remove("Green");
// make sure that the other colors that are supposed to be there are
if (!player1Colors.Contains("Red") && !player3Colors.Contains("Red") && !player4Colors.Contains("Red"))
{
player1Colors.Add("Red");
player3Colors.Add("Red");
player4Colors.Add("Red");
}
if (!player1Colors.Contains("Blue") && !player3Colors.Contains("Blue") && !player4Colors.Contains("Blue"))
{
player1Colors.Add("Blue");
player3Colors.Add("Blue");
player4Colors.Add("Blue");
}
if (!player1Colors.Contains("Yellow") && !player3Colors.Contains("Yellow") && !player4Colors.Contains("Yellow"))
{
player1Colors.Add("Yellow");
player3Colors.Add("Yellow");
player4Colors.Add("Yellow");
}
}
// clear and then update the other comboboxes
cboPlayer1Color.Items.Clear();
cboPlayer3Color.Items.Clear();
cboPlayer4Color.Items.Clear();
for (int i = 0; i < player2Colors.Count; ++i)
{
cboPlayer2Color.Items.Add(player2Colors[i]);
}
for (int i = 0; i < player3Colors.Count; ++i)
{
cboPlayer3Color.Items.Add(player3Colors[i]);
}
for (int i = 0; i < player4Colors.Count; ++i)
{
cboPlayer4Color.Items.Add(player4Colors[i]);
}
}
// handles removing player3's selected color from other comboboxes
private void cboPlayer3Color_SelectedIndexChanged(object sender, EventArgs e)
{
}
// handles removing player4's selected color from other comboboxes
private void cboPlayer4Color_SelectedIndexChanged(object sender, EventArgs e)
{
}
/* method to update the comboBoxes
private void updateComboBoxes()
{
for (int i = 0; i < player1Colors.Count; ++i)
{
cboPlayer1Color.Items.Add(player1Colors[i]);
}
for (int i = 0; i < player2Colors.Count; ++i)
{
cboPlayer2Color.Items.Add(player2Colors[i]);
}
for (int i = 0; i < player3Colors.Count; ++i)
{
cboPlayer3Color.Items.Add(player3Colors[i]);
}
for (int i = 0; i < player4Colors.Count; ++i)
{
cboPlayer4Color.Items.Add(player4Colors[i]);
}
}*/
private void btnStart_Click(object sender, EventArgs e)
{
//Control control = new Control(players);
GameBoard gameboard = new GameBoard();
gameboard.ShowDialog();
this.Close();
}
}
}
【问题讨论】:
-
有什么意想不到的后果?此代码会产生错误吗?你并没有问太多问题。
-
意外后果包括:在为 player1 选择“红色”后,如果 player2 选择了一种颜色,则 player1 的选择要么是空白的(意味着他/她不能改变他们对颜色的想法),要么颜色将重复,因此玩家 1 现在有 7 个选项,而不是 3 个选项。该代码不会产生错误。