为什么我的 windows 表单无法加载?这只是我的构建还是这真的不会弹出任何东西?

Why does my windows form not load? Is it just my build or does this truly not pop anything up?

我正在使用此代码及其后的其他方法,但无法弹出我在设计器中使用的表单。唯一成功弹出的是 MessageBox 询问玩家是否愿意扮演 X。我试过对此进行评论,看看这是否是它无法加载的原因,但我完全迷失了为什么我的表单根本无法加载。

    namespace mmelichar_Topic6_Activity13
{
    public partial class mmelichar_TicTacToe : Form
    {
        int player = 0;
        int position;
        int turn = 0;
        int playerMove;
        int firstMove;
        int secondMove;
        string[,] location = new string[3, 3] { { "", "", "" }, { "", "", "" }, { "", "", "" } };

        public mmelichar_TicTacToe()
        {
            InitializeComponent();
        }

        private void mmelichar_TicTacToe_Load(object sender, EventArgs e)
        {
            //There's only two moves that have to be hard-coded for AI to be able to
            //play tic-tac-toe near perfectly, each game /should/ result in a tie or
            //a win for the CPU. Other than that, the tryWin and tryBlock methods
            //should be able to win the game if there is an availability for that,
            //or block the opponent from winning if they cannot win quite yet.
            Random rnd = new Random();



            DialogResult dialogResult = MessageBox.Show("Do you want to play as X?", "Player Choice", MessageBoxButtons.YesNo, MessageBoxIcon.Information);
            if (dialogResult == DialogResult.Yes)
            {
                player = 1;
            }
            else if (dialogResult == DialogResult.No)
            {
                player = 0;
            }
            //player is O
            if (player == 0 && turn == 0)
            {
                firstTurnCPU();
                //player turn
                mre.WaitOne();
            }
            //player is X
            if (player == 1 && turn == 0)
            {
                //player turn 1
                mre.WaitOne();

                //cpu turn 1
                firstTurnCPU();

                //player turn 2
                mre.WaitOne();

                //cpu turn 2
                secondTurnCPU();

                //player turn 3
                mre.WaitOne();

                //cpu turn 3
                tryWin();
                tryBlock();

                //player turn 4
                mre.WaitOne();

                //cpu turn 4
                tryWin();
                tryBlock();

                //player turn 

            }
        }
    private readonly ManualResetEvent mre = new ManualResetEvent(false);

    private void playerTurn_EventHandler(object sender, EventArgs e)
    {
        mre.Set();
    }

编辑:更新代码以删除 while 循环并包含我的 ManualResetEvent

你有一个无限循环:

while (playing)
{
    // perform a bunch of logic
    // but probably don't do anything async or properly interact with the UI
}

UI 威胁的无限循环肯定会阻止 UI 绘制到屏幕上。 (它也可能 运行 与 CPU 的距离比你想要的要多得多。)

如果您真的想要一种“游戏循环”风格的游戏构造,are approaches you can take Windows 形式。但现在是在走那条路之前真正考虑游戏设计的好时机。

Windows 表格高度 event-driven。它大部分时间处于空闲状态,并在用户与 UI 交互时响应。 (点击此处,点击 mouse-over 那里,等等)如果您的游戏适合该结构(回合制等),则使用该结构,因为它更适合 Windows 形式。

您也可以将两者结合起来,使用 Windows 表单事件来处理用户交互,但是当程序启动时您可以 create a separate thread 让您的游戏循环处理正在进行的 events/logic的背景。只需确保循环不会通过不断 运行 杀死 CPU。在循环的每次迭代中让线程休眠片刻是合理的。

我的代码有两个问题:

首先,一个我忘记删除的无限 while 循环,不必要地增加了 CPU 的使用。

其次,使用 ManualResetEvent 而不是仅使用程序中的正常流程将控制从玩家来回传递给 CPU 和 vice-versa。