在(Tic Tac Toe 的 C# 程序)中出现错误
Getting an error in (C# Program for Tic Tac Toe)
关于计划:
我已经编写了用于制作井字游戏的 C# 代码。它以 windows 形式申请 (Visual studio)。
在玩这个游戏时,当 X 或 O 获胜时,调用方法 => checkForwinner() 进行水平、垂直和对角线检查以确定获胜者。变量 there_is_a_winner 设置为 true 并显示消息“winner wins”。否则它会检查平局。
错误:
当我编译这段代码时,它显示 0 error/warning/messages。但尽管如此,这段代码还是不起作用。它无法确定获胜者。弹出框,显示谁 won/draw..从不执行,除此之外,这段代码工作正常。我希望有人能提供帮助。
提前致谢。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
bool turn = true;//(To check turn) True means X's turn, False=Y turn
int turn_count = 0;
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
}
private void aboutToolStripMenuItem_Click(object sender, EventArgs e)/*About Section*/
{
MessageBox.Show("This Program is of Tic Tac Toe. It was created by Me for his C# project.","Tic Tac Toe -About");
}
private void exitToolStripMenuItem_Click(object sender, EventArgs e)/*Exit Section*/
{
Application.Exit();
}
private void button_click(object sender, EventArgs e)
{
Button b = (Button)sender;
if(turn)
b.Text="x";
else
b.Text="o";
turn=!turn;
b.Enabled = false;//disable the button, to prevent double entering.
turn_count++;
}
private void checkForwinner()
{
bool there_is_a_winner= false;
//horizontal check
if ((A1.Text == A2.Text) && (A2.Text == A3.Text) && (!A1.Enabled))
there_is_a_winner = true;//if above conditions are true, then bool variable=true.
else if ((B1.Text == B2.Text) && (B2.Text == B3.Text) && (!B1.Enabled))
there_is_a_winner = true;
else if ((C1.Text == C2.Text) && (C2.Text == C3.Text) && (!C1.Enabled))
there_is_a_winner = true;
//Vertical Check
else if ((A1.Text == B1.Text) && (B1.Text == C1.Text) && (!A1.Enabled))
there_is_a_winner = true;
else if ((A2.Text == B2.Text) && (B2.Text == C2.Text) && (!A2.Enabled))
there_is_a_winner = true;
else if ((A3.Text == B3.Text) && (B3.Text == C3.Text) && (!A3.Enabled))
there_is_a_winner = true;
//Diagonal Check
else if ((A1.Text == B2.Text) && (B2.Text == C3.Text) && (!A1.Enabled))
there_is_a_winner = true;
else if ((A3.Text == B2.Text) && (B2.Text == C1.Text) && (!C1.Enabled))
there_is_a_winner = true;
if (there_is_a_winner)
{
dissableButtons();// If there is a winner call for buttons to be disbaled.
String winner = "";
if (turn)
winner = "0";
else
winner = "x";
MessageBox.Show(winner + "Wins!", "Congratulations!");
}
else
{
if (turn_count == 9)
MessageBox.Show("Match Draw", "Result");
}
}
private void dissableButtons()
{
try
{
foreach (Control c in Controls)
{
Button b = (Button)c;
b.Enabled = false;//If there is a winner, disable all the buttons on the form
}
}
catch { }
}
// New Game//Need to Reset Everything
private void toolStripMenuItem2_Click(object sender, EventArgs e)
{
turn = true;
turn_count = 0;
try
{
foreach (Control c in Controls)
{
Button b = (Button)c;
b.Enabled = true;
b.Text = "";//Initially we want blank Text
}
}
catch { }
}
}
}
问题是函数 checkForwinner() 从未在程序的任何地方被调用。
我希望 button_click 函数在适当的单元格中放置 X 或 O,因此当单击该按钮时,它还需要检查是否有获胜者。我建议您将 checkForwinner() 作为 button_click 函数的最后一行调用,这样每次单击它时,都会执行检查。
此外,作为样式说明,请将其重命名为 checkForWinner,并使用大写字母 W。此外,您应该缩进行 b.Text="o";像这样:
if(turn)
b.Text="x";
else
b.Text="o";
话虽如此,我更喜欢在单行上使用花括号,所以我更喜欢这个:
if(turn)
{
b.Text="x";
}
else
{
b.Text="o";
}
尽管这会占用更多的行,但当您将另一行添加到 "if" 子句或 "else" 子句中而忘记添加所有这些时,它确实可以避免将来出现问题-重要的大括号。养成一个好习惯——花括号无处不在
当你问问题时,你必须更具体。在这种情况下,您需要做的更多,因为我在这段代码中看到了几个大错误。我只是指出其中的几个:
你永远不应该这样做:
try
{
...
}
catch {}
如果你这样做,你就会 "eat" 异常,你永远不知道发生了什么。需要使用 catch 的情况很少。在您知道自己在做什么之前,不要使用 catch。
相反,您可以在应用程序级别显示任何异常:
在Program.cs中,在Main方法中添加:
static class Program
{
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.ThreadException += Application_ThreadException;
AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException;
Application.Run(new Form());
}
private static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
{
MessageBox.Show(((Exception)e.ExceptionObject).Message);
}
private static void Application_ThreadException(object sender, System.Threading.ThreadExceptionEventArgs e)
{
MessageBox.Show(e.Exception.Message);
}
}
在你的方法 button_click 中你使用 if .. else ...
但检查你是否不需要添加 { ... }
:
if (...) {
code here
}
else {
code here
}
对私有字段使用可见性限定符 private:
private bool turn = true;//(To check turn) True means X's turn, False=Y turn
private int turn_count = 0;
而不是Application.Exit();
使用方法Form.Close()
:this.Close();
如果您使用 if .. else if ..
块,请始终使用 final else 块,但有例外。它会告诉你你错过了什么:
if (...)
{
...
}
else if (...)
{
...
}
else
{
throw new NotImplementedException("Not Implemented Yet");
}
关于计划:
我已经编写了用于制作井字游戏的 C# 代码。它以 windows 形式申请 (Visual studio)。 在玩这个游戏时,当 X 或 O 获胜时,调用方法 => checkForwinner() 进行水平、垂直和对角线检查以确定获胜者。变量 there_is_a_winner 设置为 true 并显示消息“winner wins”。否则它会检查平局。
错误:
当我编译这段代码时,它显示 0 error/warning/messages。但尽管如此,这段代码还是不起作用。它无法确定获胜者。弹出框,显示谁 won/draw..从不执行,除此之外,这段代码工作正常。我希望有人能提供帮助。
提前致谢。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
bool turn = true;//(To check turn) True means X's turn, False=Y turn
int turn_count = 0;
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
}
private void aboutToolStripMenuItem_Click(object sender, EventArgs e)/*About Section*/
{
MessageBox.Show("This Program is of Tic Tac Toe. It was created by Me for his C# project.","Tic Tac Toe -About");
}
private void exitToolStripMenuItem_Click(object sender, EventArgs e)/*Exit Section*/
{
Application.Exit();
}
private void button_click(object sender, EventArgs e)
{
Button b = (Button)sender;
if(turn)
b.Text="x";
else
b.Text="o";
turn=!turn;
b.Enabled = false;//disable the button, to prevent double entering.
turn_count++;
}
private void checkForwinner()
{
bool there_is_a_winner= false;
//horizontal check
if ((A1.Text == A2.Text) && (A2.Text == A3.Text) && (!A1.Enabled))
there_is_a_winner = true;//if above conditions are true, then bool variable=true.
else if ((B1.Text == B2.Text) && (B2.Text == B3.Text) && (!B1.Enabled))
there_is_a_winner = true;
else if ((C1.Text == C2.Text) && (C2.Text == C3.Text) && (!C1.Enabled))
there_is_a_winner = true;
//Vertical Check
else if ((A1.Text == B1.Text) && (B1.Text == C1.Text) && (!A1.Enabled))
there_is_a_winner = true;
else if ((A2.Text == B2.Text) && (B2.Text == C2.Text) && (!A2.Enabled))
there_is_a_winner = true;
else if ((A3.Text == B3.Text) && (B3.Text == C3.Text) && (!A3.Enabled))
there_is_a_winner = true;
//Diagonal Check
else if ((A1.Text == B2.Text) && (B2.Text == C3.Text) && (!A1.Enabled))
there_is_a_winner = true;
else if ((A3.Text == B2.Text) && (B2.Text == C1.Text) && (!C1.Enabled))
there_is_a_winner = true;
if (there_is_a_winner)
{
dissableButtons();// If there is a winner call for buttons to be disbaled.
String winner = "";
if (turn)
winner = "0";
else
winner = "x";
MessageBox.Show(winner + "Wins!", "Congratulations!");
}
else
{
if (turn_count == 9)
MessageBox.Show("Match Draw", "Result");
}
}
private void dissableButtons()
{
try
{
foreach (Control c in Controls)
{
Button b = (Button)c;
b.Enabled = false;//If there is a winner, disable all the buttons on the form
}
}
catch { }
}
// New Game//Need to Reset Everything
private void toolStripMenuItem2_Click(object sender, EventArgs e)
{
turn = true;
turn_count = 0;
try
{
foreach (Control c in Controls)
{
Button b = (Button)c;
b.Enabled = true;
b.Text = "";//Initially we want blank Text
}
}
catch { }
}
}
}
问题是函数 checkForwinner() 从未在程序的任何地方被调用。
我希望 button_click 函数在适当的单元格中放置 X 或 O,因此当单击该按钮时,它还需要检查是否有获胜者。我建议您将 checkForwinner() 作为 button_click 函数的最后一行调用,这样每次单击它时,都会执行检查。
此外,作为样式说明,请将其重命名为 checkForWinner,并使用大写字母 W。此外,您应该缩进行 b.Text="o";像这样:
if(turn)
b.Text="x";
else
b.Text="o";
话虽如此,我更喜欢在单行上使用花括号,所以我更喜欢这个:
if(turn)
{
b.Text="x";
}
else
{
b.Text="o";
}
尽管这会占用更多的行,但当您将另一行添加到 "if" 子句或 "else" 子句中而忘记添加所有这些时,它确实可以避免将来出现问题-重要的大括号。养成一个好习惯——花括号无处不在
当你问问题时,你必须更具体。在这种情况下,您需要做的更多,因为我在这段代码中看到了几个大错误。我只是指出其中的几个:
你永远不应该这样做:
try { ... } catch {}
如果你这样做,你就会 "eat" 异常,你永远不知道发生了什么。需要使用 catch 的情况很少。在您知道自己在做什么之前,不要使用 catch。
相反,您可以在应用程序级别显示任何异常:
在Program.cs中,在Main方法中添加:
static class Program
{
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.ThreadException += Application_ThreadException;
AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException;
Application.Run(new Form());
}
private static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
{
MessageBox.Show(((Exception)e.ExceptionObject).Message);
}
private static void Application_ThreadException(object sender, System.Threading.ThreadExceptionEventArgs e)
{
MessageBox.Show(e.Exception.Message);
}
}
在你的方法 button_click 中你使用
if .. else ...
但检查你是否不需要添加{ ... }
:if (...) { code here } else { code here }
对私有字段使用可见性限定符 private:
private bool turn = true;//(To check turn) True means X's turn, False=Y turn private int turn_count = 0;
而不是
Application.Exit();
使用方法Form.Close()
:this.Close();
如果您使用
if .. else if ..
块,请始终使用 final else 块,但有例外。它会告诉你你错过了什么:if (...) { ... } else if (...) { ... } else { throw new NotImplementedException("Not Implemented Yet"); }