скачать книгу бесплатно
}
}
}
}
Дважды щёлкаем по форме в режиме проектирования или в панели Properties (для формы) на вкладке Events дважды щёлкаем по имени события Load. Появившийся шаблон метода после записи нашего кода принимает следующий вид.
Листинг 11.2. Метод.
private void frmTicTacToe_Load (object sender, EventArgs e)
{
//’establish array
boxArray [0] = lblBox1;
boxArray [1] = lblBox2;
boxArray [2] = lblBox3;
boxArray [3] = lblBox4;
boxArray [4] = lblBox5;
boxArray [5] = lblBox6;
boxArray [6] = lblBox7;
boxArray [7] = lblBox8;
boxArray [8] = lblBox9;
// possible wins
possibleWins [0] = «012»;
possibleWins [1] = «345»;
possibleWins [2] = «678»;
possibleWins [3] = «036»;
possibleWins [4] = «147»;
possibleWins [5] = «258»;
possibleWins [6] = «048»;
possibleWins [7] = «246»;
// clear boxes
for (int i = 0; i <9; i++)
boxArray [i].Text = «»;
lblMessage. Text = «Game Stopped»;
grpFirst. Enabled = false;
grpComputer. Enabled = false;
//drawSound = new System.Media.SoundPlayer (
//Application.StartupPath + "\\beep. wav»);
//winSound = new System.Media.SoundPlayer (
//Application.StartupPath + "\\tada. wav»);
}
Дважды щёлкаем по первой кнопке в режиме проектирования или в панели Properties (для этой кнопки) на вкладке Events дважды щёлкаем по имени события Click. Появившийся шаблон метода после записи нашего кода принимает следующий вид.
Листинг 11.3. Метод.
private void btnStartStop_Click (object sender, EventArgs e)
{
if (btnStartStop. Text == «Start Game»)
{
btnStartStop. Text = «Stop Game»;
grpPlayers. Enabled = false;
grpFirst. Enabled = false;
grpComputer. Enabled = false;
btnExit. Enabled = false;
xTurn = true;
lblMessage. Text = «X’s Turn»;
// reset boxes
for (int i = 0; i <9; i++)
{
boxArray [i].Text = «»;
boxArray[i].BackColor = Color. White;
}
canClick = true;
numberClicks = 0;
gameOver = false;
if (rdoComputerFirst.Checked &&
rdoOnePlayer.Checked)
ComputerTurn ();
}
else
{
btnStartStop. Text = «Start Game»;
if (!gameOver)
lblMessage. Text = «Game Stopped»;
grpPlayers. Enabled = true;
if (rdoOnePlayer.Checked)
{
grpFirst. Enabled = true;
grpComputer. Enabled = true;
}
btnExit. Enabled = true;
canClick = false;
}
}
Дважды щёлкаем по второй кнопке в режиме проектирования или в панели Properties (для этой кнопки) на вкладке Events дважды щёлкаем по имени события Click. Появившийся шаблон метода после записи нашего кода принимает следующий вид.
Листинг 11.4. Метод.
private void btnExit_Click (object sender, EventArgs e)
{
this.Close ();
}
В панели Properties для второго переключателя на вкладке Events дважды щёлкаем по имени события Click. Появившийся шаблон метода после записи нашего кода принимает следующий вид.
Листинг 11.5. Метод.
private void rdoOnePlayer_Click (object sender, EventArgs e)
{
grpFirst. Enabled = true;
grpComputer. Enabled = true;
}
В панели Properties для первого переключателя на вкладке Events дважды щёлкаем по имени события Click. Появившийся шаблон метода после записи нашего кода принимает следующий вид.
Листинг 11.6. Метод.
private void rdoTwoPlayers_Click (object sender, EventArgs e)
{
grpFirst. Enabled = false;
grpComputer. Enabled = false;
}
Если мы желаем, чтобы при завершении игры с результатом «Ничья» или «Победа» звучала соответствующая музыка, необходимо раскомментировать строки кода, в которых есть слово «Sound», и отладить проект.
Строим и запускаем программу на выполнение обычным образом: Build, Build Selection; Debug, Start Without Debugging.
В ответ Visual Studio выводит форму Form1 с показанным выше полем игры из 9 клеток.
Далее Игрок играет с Компьютером или Игрок 1 играет с Игроком 2 в крестики-нолики согласно приведённым выше правилам.
По методике данной главы можно разрабатывать самые разнообразные игры в крестики-нолики как для игры Игрока с Компьютером, так и для игры Игрока 1 с Игроком 2.
Глава 12. Методика программирования искусственного интеллекта в игре в «Крестики-нолики» на сетке 6x7
12.1. Общие сведения
Разработаем методику проектирования и программирования типичной и широко распространённой игры типа игры в крестики-нолики. Известно много вариантов этой игры как в ручном, так и в компьютерном варианте.
В ручном варианте смысл игры состоит в том, что, например, в тетради в клеточку на поле из квадратов, например, 6 x 7 квадратов (цифры соответствуют количеству квадратов по оси абсцисс «x» и оси ординат «y») два игрока по очереди выделяют квадраты крестиками и ноликами, стараясь первым выделить горизонтальную, вертикальную или диагональную линию из определённого количества крестиков или ноликов.
Данную компьютерную игру мы будем разрабатывать, следуя статье [см. Список литературы: Article from the website: www.codeproject.com/netcf/Connect4AB.asp: Labib B. Connect4 using Alpha-Beta Search algorithm], но с нашими усовершенствованиями для современной версии Visual Studio.
В данной игре (игрока с компьютером) не будут использоваться графические файлы. Поэтому сначала методом FillRectangle класса Graphics на форме рисуется прямоугольник (поле игры), заполненный синим цветом RoyalBlue:
e.Graphics.FillRectangle (new SolidBrush(Color.RoyalBlue),
15, 70, 210, 180);
где 15, 70 – координаты верхнего левого угла прямоугольника (от верхнего левого угла формы, когда ось «y» направлена вниз);
210, 180 – размеры прямоугольника соответственно по осям «x» и «y».
Далее методом FillEllipse класса Graphics в этом прямоугольнике рисуются 6 x 7 кружочков (ноликов) диаметром 27 пикселей белого цвета White:
g.FillEllipse (new SolidBrush (Color. White),
x +3, y +3, 27, 27);
Когда игрок щёлкает мышью по белому кружочку, этот белый кружочек заменяется таким же кружочком, но жёлтого цвета Yellow:
g.FillEllipse (new SolidBrush (Color. Yellow),
x +3, y +3, 27, 27);
После расчёта вариантов (по определённому математическому алгоритму, реализованному в показанной далее программе) компьютер заменяет один белый кружочек таким же кружочком красного цвета Red:
g.FillEllipse (new SolidBrush(Color.Red),
x +3, y +3, 27, 27);
Так по очереди игрок и компьютер выделяют жёлтые и красные кружочки, стараясь первым выделить горизонтальную, вертикальную или диагональную линию из 4-х кружочков одинакового цвета. После каждого щелчка игроком поля игры (мышью) он слышит сигнал Beep (по-русски: Бип).
12.2. Правила игры
1. После запуска игры на форме появляется поле игры, состоящее из 7 x 6 белых кружочков (рис. 12.1). Напомним, что цифры соответствуют количеству квадратов по осям «x» и «y». В меню «Новая игра» по умолчанию установлен режим «Начинает игрок», но можно выбрать «Начинает компьютер» (рис. 12.1). В меню Уровень по умолчанию установлен режим Обычный, но можно выбрать Нормальный или Сложный (рис. 12.2).
Рис. 12.1. Меню Новая игра. Рис. 12.2. Меню Уровень (Level).
2. Игрок щёлкает мышью по выбранному им белому кружочку, этот белый кружочек заменяется жёлтым кружочком. После каждого щелчка игроком поля игры он слышит сигнал Beep.
После расчёта вариантов (по определённому математическому алгоритму, реализованному в показанной далее программе) компьютер заменяет один белый кружочек таким же кружочком красного цвета (рис. 12.3).
3. Так по очереди игрок и компьютер выделяют жёлтые и красные кружочки, стараясь первым выделить горизонтальную, вертикальную или диагональную линию из 4-х кружочков одинакового цвета. Но если игрок или компьютер «видят», что следующим ходом его соперник соберёт линию из 4-х кружочков одинакового цвета, он должен (чтобы не проиграть) на этот квадрат поместить свой кружок (даже в ущерб своей тактике игры). Середина игры показана на рис. 12.4.
4. Как только игрок или компьютер первым соберёт линию из 4-х кружочков своего цвета, появляется информационная панель Show класса MessageBox с сообщением для игрока, либо «Вы победили» (рис. 12.5), либо «Вы проиграли» (рис. 12.6).
На этой панели нужно щёлкнуть OK.
5. Для начала новой игры следует в меню «Новая игра» выбрать режим «Начинает игрок» (или «Начинает компьютер»).
6. Для закрытия игры следует на форме выбрать значок Close.
Рис. 12.3. Начало игры. Рис. 12.4. Середина игры.
Рис. 12.5. Победил игрок. Рис. 12.6. Победил компьютер.