#c# #winforms #tic-tac-toe
#c# #winforms #крестики-нолики
Вопрос:
Привет, я работаю над Visual Studio Winforms и пытаюсь создать tic-tac-toe. Я застрял в методе проверки выигрыша игрока. Я пытался сделать это в activated. небольшой пример:
private void StartForm_Activated(object sender, EventArgs e)
{
if ((_pcb1.Image == imagecircle) amp;amp; (_pcb2.Image == imagecircle) amp;amp; (_pcb3.Image == imagecircle))
{
MessageBox.Show("You Win!");
}
if ((_pcb4.Image == imagecircle) amp;amp; (_pcb5.Image == imagecircle) amp;amp; (_pcb6.Image == imagecircle))
{
MessageBox.Show("You Win!");
}
if ((_pcb7.Image == imagecircle) amp;amp; (_pcb8.Image == imagecircle) amp;amp; (_pcb9.Image == imagecircle))
{
MessageBox.Show("You Win!");
}
}
(Я знаю, что есть больше ситуаций для победы).
Это никогда не входит в метод, я пытаюсь найти метод, который активен всегда, когда форма открыта. пожалуйста, помогите 🙂
Комментарии:
1. Ваш подход неверен на стольких уровнях! Вам нужно сохранить объект модели, который представляет текущее состояние доски. Всякий раз, когда вы размещаете изображение на доске, отмечайте модель соответствующим элементом (крестом или кружком). Создайте метод в классе модели, чтобы определить, кто выиграл (если кто-нибудь). Вызывайте этот метод после каждого хода, чтобы решить, что делать дальше (отображать окно сообщения или ждать следующего хода).
2. Вы не хотите подключать
Activated
. Вместо этого проверьте наличие выигрыша в том же месте, где вы установили X или O, когда игрок нажимает.
Ответ №1:
Вы должны проверять победу игрока после каждого хода этого игрока. Я предполагаю, что ваши игроки делают свои ходы, нажав на кнопку «Сделать ход» или нажав на игровое поле. Также я предполагаю, что у вас есть Click
событие вашей кнопки или игрового поля. Поэтому вы должны вставить свой контрольный код в Click
событие вашей кнопки или игрового поля.
Комментарии:
1. @user3393134 Если этот ответ вам помог, пожалуйста, примите его.
Ответ №2:
Вот некоторый код, который будет распространяться на любой размер игры:
public class Level
{
private readonly Team[,] _game;
public Level(int extent)
{
_game = new Team[extent, extent];
}
public bool HasWon(Team team)
{
var yMax = GetYMax();
var xMax = GetXMax();
var won = false;
// check horizontally
for (var y = 0; y < yMax; y )
{
won = false;
for (var x = 0; x < xMax; x )
won |= _game[y, x] == team;
if (won) return true;
}
// TODO check vertically
// TODO check diagonally
return won;
}
public void SetTile(Team team, int x, int y)
{
var xMax = GetXMax();
var yMax = GetYMax();
if ((x < 0) || (x > xMax))
throw new ArgumentOutOfRangeException("x");
if ((y < 0) || (y > yMax))
throw new ArgumentOutOfRangeException("y");
_game[y, x] = team;
}
private int GetXMax()
{
var xMax = _game.GetUpperBound(1);
return xMax;
}
private int GetYMax()
{
var yMax = _game.GetUpperBound(0);
return yMax;
}
}
public enum Team
{
Red,
Blue
}
Что вам нужно сделать:
- реализовать логику для проверки, выиграла ли команда по вертикали или по диагонали
- реализуйте свою игру, используя этот класс, рисуя картинки в соответствии с массивом
_game
(сделайте его общедоступным) - изучите оператор
|
OR, чтобы понять, как он используется здесь: https://msdn.microsoft.com/en-us/library/6373h346.aspx - дальнейшая отладка кода (у меня нет 🙂
Ответ №3:
Если вы хотите найти какой-то метод, который постоянно вызывается, чтобы проверить, выиграли ли игроки, вы можете просто создать a Timer
, который выполняется каждые 1 миллисекунду. Тогда обработчиком события для Timer.Tick
будет такой метод.
Тем не менее, вы не должны находить такой метод для проверки выигрыша / проигрыша. Проверять это каждые 1 миллисекунду — пустая трата ресурсов.
Подумайте, какое действие может повлиять на результат игры в крестики-нолики? Конечно, когда любой из игроков ставит что-то (X или O) на доску! Именно тогда вам нужно проверить, выиграл ли кто-то. Кроме того, если поставленная вещь равна X, вам не нужно проверять, выиграл ли игрок, играющий в O, потому что это просто невозможно!
Кроме того, проверка того, равно ли изображение в графическом поле изображению X или O, на самом деле является «неабстрактным» кодом. Попробуйте поместить эти вещи в модель с помощью абстракции.