为什么我的 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。
我正在使用此代码及其后的其他方法,但无法弹出我在设计器中使用的表单。唯一成功弹出的是 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。