创建一个Checkers游戏

时间:2015-04-18 01:57:12

标签: c# button

我正在创建这个关于我刚刚遇到的问题。我正在尝试使用按钮创建一个原始的跳棋游戏,到目前为止,我只是测试如何让程序识别选择一个按钮并移动它。

我的代码:

    private void Checkers_Load(object sender, EventArgs e)
    {

    }

    string selectedChecker = "";
    string currentButton = "";
    int blankSpace = 0;

    int[] Board = new int[64];

    private void gameBoard()
    {
        foreach(var control in Controls)
        {
            var button = control as Button;

            if(button != null)
            {
                if(button.Name == currentButton)
                {
                    button.Image = System.Drawing.Image.FromFile("Red Checker.png");
                }
                else
                {
                    MessageBox.Show("Dead.");
                }
            }
            else
            {
                MessageBox.Show("Dead.");
            }   
        }
    }

    private void attemptMove()
    {
        string substringChecker = null;
        substringChecker = selectedChecker.Substring(0,2);
        int selectedCheckerNumber = Convert.ToInt32(substringChecker);

        string substringButton = null;
        substringButton = currentButton.Substring(0,2);
        int currentButtonNumber = Convert.ToInt32(substringButton);

        if((selectedCheckerNumber + 3 == currentButtonNumber) || (selectedCheckerNumber + 4 == currentButtonNumber))
        {
            Board[currentButtonNumber] = Board[selectedCheckerNumber];
            Board[selectedCheckerNumber] = blankSpace;

            gameBoard();
        }
    }

    private void newGameToolStripMenuItem_Click(object sender, EventArgs e)
    {
        int w = pictureBox1.Size.Width;
        int h = pictureBox1.Size.Height;
        int count = 8;
        Bitmap b = new Bitmap(w, h, System.Drawing.Imaging.PixelFormat.Format32bppArgb);
        w /= count;
        h /= count;
        Graphics g = Graphics.FromImage(b);
        for (int i = 0; i < count; i++)
        {
            for (int j = 0; j < count; j++)
            {
                Color c = (i + j) % 2 == 0 ? Color.Red : Color.Black;
                Brush br = new SolidBrush(c);
                g.FillRectangle(br, i * w, j * h, w, h);
                br.Dispose();
            }
        }
        g.Dispose();
        pictureBox1.Image = b;
        pictureBox1.Refresh();
    }

    private void exitToolStripMenuItem_Click(object sender, EventArgs e)
    {
        //Close form
        this.Close();
    }

    private void howToPlayToolStripMenuItem_Click(object sender, EventArgs e)
    {
        //MessageBox.Show("How to play a game of Checkers: Step 1 - Don't play.");
    }

    private void informationToolStripMenuItem_Click(object sender, EventArgs e)
    {

    }

    private void checkerSpace18_Click(object sender, EventArgs e)
    {

    }

    private void checkerSpace17_Click(object sender, EventArgs e)
    {
        Button btn = (Button)sender;
        string buttonClicked = btn.Name;

        if (selectedChecker == "")
        {
            selectedChecker = buttonClicked;
        }
        else
        {
            currentButton = buttonClicked;
            attemptMove();
        }
    }
}

我的问题与我的attemptMove()方法有关。我遇到了运行时错误:

  

“mscorlib.dll中发生了'System.FormatException'类型的未处理异常。附加信息:输入字符串的格式不正确。”

似乎每当我移动它一次移动它时将其移动到与该块相邻的另一个单元格时就会出现。这可能是因为我的程序在按钮切换时没有更新按钮的图片,但我想看看是否有任何指导可以解决这个问题。

2 个答案:

答案 0 :(得分:0)

您正在设置&#34; selectedChecker&#34;到单击的按钮.Name属性。然后你使用substring(0,2)获取前2个字符,并尝试将其转换为整数。

由于Name属性不能以数字开头,因此您尝试将一些随机文本转换为整数属性。

更好的方法是使用Tag属性来保存有关数字的信息,这可以是任何值。然后,您可以使用int.Parse来解析按钮的Tag值。

答案 1 :(得分:0)

按钮的命名约定是什么?好像你正试图从名称中获取一个数字,但转换失败了。

如果按钮名称为button00button63,那么您应该可以使用SubstringName.Length - 2开始获取该号码。请注意,所有按钮名称必须在末尾使用两位数字(000102等。)

例如:

// Get the last two characters of the button name
string substringChecker = selectedChecker.Substring(selectedChecker.Length - 2);

// Convert the characters to an integer
int selectedCheckerNumber = Convert.ToInt32(substringChecker);