Валерий Жарков - Справочник Жаркова по проектированию и программированию искусственного интеллекта. Том 2: Программирование на Visual C# искусственного интеллекта (продолжение 1)
- Название:Справочник Жаркова по проектированию и программированию искусственного интеллекта. Том 2: Программирование на Visual C# искусственного интеллекта (продолжение 1)
- Автор:
- Жанр:
- Издательство:неизвестно
- Год:неизвестен
- ISBN:9785005680433
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Валерий Жарков - Справочник Жаркова по проектированию и программированию искусственного интеллекта. Том 2: Программирование на Visual C# искусственного интеллекта (продолжение 1) краткое содержание
Справочник Жаркова по проектированию и программированию искусственного интеллекта. Том 2: Программирование на Visual C# искусственного интеллекта (продолжение 1) - читать онлайн бесплатно ознакомительный отрывок
Интервал:
Закладка:
label4 Label:
Property Name Property Value
Name lblBox3
Font Microsoft Sans Serif; 48pt
AutoSize False
BorderStyle None
Font Size 48
Text X
TextAlign MiddleCenter
Location 208; 66
Size 76; 76
label5 Label:
Property Name Property Value
Name lblBox4
Font Microsoft Sans Serif; 48pt
AutoSize False
BorderStyle None
Font Size 48
Text X
TextAlign MiddleCenter
Location 12; 177
Size 76; 76
label6 Label:
Property Name Property Value
Name lblBox5
Font Microsoft Sans Serif; 48pt
AutoSize False
BorderStyle None
Font Size 48
Text X
TextAlign MiddleCenter
Location 110; 177
Size 76; 76
label7 Label:
Property Name Property Value
Name lblBox6
Font Microsoft Sans Serif; 48pt
AutoSize False
BorderStyle None
Font Size 48
Text X
TextAlign MiddleCenter
Location 208; 177
Size 76; 76
label8 Label:
Property Name Property Value
Name lblBox7
Font Microsoft Sans Serif; 48pt
AutoSize False
BorderStyle None
Font Size 48
Text X
TextAlign MiddleCenter
Location 12; 287
Size 76; 76
label9 Label:
Property Name Property Value
Name lblBox8
Font Microsoft Sans Serif; 48pt
AutoSize False
BorderStyle None
Font Size 48
Text X
TextAlign MiddleCenter
Location 110; 287
Size 76; 76
label10 Label:
Property Name Property Value
Name lblBox9
Font Microsoft Sans Serif; 48pt
AutoSize False
BorderStyle None
Font Size 48
Text X
TextAlign MiddleCenter
Location 208; 287
Size 76; 76
label11 Label (used as grid line – make very skinny):
Property Name Property Value
Name label11
AutoSize False
BackColor Blue
BorderStyle None
Text [blank]
Location 12; 151
Size 272; 13
label12 Label (used as grid line – make very skinny):
Property Name Property Value
Name label12
AutoSize False
BackColor Blue
BorderStyle None
Text [blank]
Location 12; 263
Size 272; 13
label13 Label (used as grid line – make very skinny):
Property Name Property Value
Name label13
AutoSize False
BackColor Blue
BorderStyle None
Text [blank]
Location 94; 66
Size 10; 298
label14 Label (used as grid line – make very skinny):
Property Name Property Value
Name label14
AutoSize False
BackColor Blue
BorderStyle None
Text [blank]
Location 192; 66
Size 10; 298
groupBox1 Group Box:
Property Name Property Value
Name grpPlayers
AutoSize False
BackColor Blue
Text [blank]
Location 295; 12
Size 156; 74
radioButton1 Radio Button:
Property Name Property Value
Name rdoTwoPlayers
AutoSize False
ForeColor White
Font Size 9
Text Two Players
Checked True
Location 13; 19
Size 91; 19
radioButton2 Radio Button:
Property Name Property Value
Name rdoOnePlayer
AutoSize False
ForeColor White
Font Size 9
Text Player – Computer
Location 13; 44
Size 137; 19
groupBox2 Group Box:
Property Name Property Value
Name grpFirst
AutoSize False
BackColor Blue
Text [blank]
Location 295; 92
Size 156; 74
radioButton3 Radio Button:
Property Name Property Value
Name rdoYouFirst
AutoSize False
ForeColor White
Font Size 9
Text You Go First
Checked True
Location 13; 19
Size 91; 19
radioButton4 Radio Button:
Property Name Property Value
Name rdoComputerFirst
AutoSize False
ForeColor White
Font Size 9
Text Computer Goes First
Location 13; 44
Size 137; 19
groupBox3 Group Box:
Property Name Property Value
Name grpComputer
AutoSize False
BackColor Blue
Text [blank]
Location 295; 172
Size 156; 74
radioButton5 Radio Button:
Property Name Property Value
Name rdoRandom
AutoSize False
ForeColor White
Font Size 9
Text Random Computer
Checked True
Location 13; 19
Size 130; 19
radioButton6 Radio Button:
Property Name Property Value
Name rdoSmart
AutoSize False
ForeColor White
Font Size 9
Text Smart Computer
Location 13; 44
Size 115; 19
button1 Button:
Property Name Property Value
Name btnStartStop
AutoSize False
Font Size 10
Text Start Game
Location 308; 263
Size 123; 36
button2 Button:
Property Name Property Value
Name btnExit
AutoSize False
Font Size 10
Text Exit
Location 308; 305
Size 123; 36
Форма приняла вид, показанный на рис. 11.8.

Рис. 11.8.Форма Form1 после проектирования.
Выделяем элемент управления lblBox1, в панели Properties для этого элемента на вкладке Events выделяем событие Click, щёлкаем стрелку и из выпавшего списка выбираем событие lblBox1_Click (рис. 11.9).
Аналогично поступаем для остальных элементов управления lblBox2, lblBox3, lblBox4, lblBox5, lblBox6, lblBox7, lblBox8, lblBox9.


Рис. 11.9.Выделяем lblBox1 и выбираем событие lblBox1_Click.
На рис. 11.12 слева – сетка для игры Tic Tac Toe. Элементы управления Label имеются в большом количестве. Элемент управления Label используется, чтобы сказать Вам ситуацию в игре. Метки используются для маркировки X и O в сетке (несмотря на то, что только X показывают в этом режиме проектирования). Тонкие элементы управления Label используются для формирования тёмно-синей сетки. Справа три средства управления GroupBox и две Button. Каждый GroupBox содержит два средства управления типа переключателя RadioButton, используемые для установления игровых опций. Эти два кнопочных управления Button используются, чтобы запустить и остановить игру и выйти из программы.
Если в игре применяются звуковые файлы, то их можно разместить в одной папке с именем, например, Sounds, а можно разместить непосредственно в проект. Добавляем в проект звуковые файлы beep. wav и tada. wav по стандартной схеме: выполняем правый щелчок по имени проекта, в контекстном меню выбираем Add, Existing Item, в панели Add Existing Item в окне «Files of type» выбираем «All Files», в центральном окне находим (в папке файлы, например, из Интернета) и с нажатой клавишей Ctrl выделяем имена файлов и щёлкаем кнопку Add. В панели Solution Explorer мы увидим эти файлы (рис. 11.10).
Дважды щёлкая по имени файла в панели Solution Explorer, любой файл можно открыть, изучить и редактировать.
Схема записи и вывода справочной информации, например, с правилами игры после выбора команды Справка (например, для элемента управления MenuStrip) уже была дана в другой главе, а также в книгах с сайта ZharkovPress.ru.


Рис. 11.10.Панели Solution Explorer (слева) и Properties (справа).
11.4. Код и запуск программы
Открываем файл Form1.cs (например, по схеме: File, Open, File) и в классе Form1 записываем следующие переменные и методы.
Листинг 11.1.Переменные и методы.
Random myRandom = new Random ();
Label [] boxArray = new Label [9];
bool xTurn;
bool canClick = false;
int numberClicks;
String [] possibleWins = new String [8];
bool gameOver;
//System.Media.SoundPlayer drawSound;
//System.Media.SoundPlayer winSound;
private void lblBox_Click (object sender, EventArgs e)
{
String whoWon = «»;
int i;
if (canClick)
{
// see which box is clicked
Label clickedBox;
clickedBox = (Label) sender;
// last digit of name (-1) is index
i = Convert.ToInt32(clickedBox.Name [
clickedBox.Name. Length – 1].ToString ()) – 1;
// if already clicked then exit
if (boxArray [i].Text!= «»)
return;
numberClicks++;
if (xTurn)
{
boxArray [i].Text = «X»;
xTurn = false;
lblMessage. Text = «O’s Turn»;
}
else
{
boxArray [i].Text = «O»;
xTurn = true;
lblMessage. Text = «X’s Turn»;
}
// check for win – will establish a value for WhoWon
whoWon = CheckForWin ();
if (whoWon!= «»)
{
//winSound.Play ();
lblMessage. Text = whoWon + " wins!»;
gameOver = true;
btnStartStop.PerformClick ();
return;
}
else if (numberClicks == 9)
{
// draw
//drawSound.Play ();
lblMessage. Text = «It’s a draw!»;
gameOver = true;
btnStartStop.PerformClick ();
return;
}
if (rdoOnePlayer.Checked)
if ((xTurn && rdoComputerFirst.Checked) ||
(!xTurn && rdoYouFirst.Checked))
ComputerTurn ();
}
}
private String CheckForWin ()
{
String winner = «»;
int [] boxNumber = new int [3];
String [] mark = new String [3];
// check all possible for wins
for (int i = 0; i <8; i++)
{
for (int j = 0; j <3; j++)
{
boxNumber [j] = Convert.ToInt32 (
possibleWins[i][j].ToString ());
mark [j] = boxArray [boxNumber [j]].Text;
}
if (mark [0] == mark [1] && mark [0] == mark [2] &&
mark [1] ==
mark [2] && mark [0]!= «»)
{
// we have a winner
winner = mark [0];
for (int j = 0; j <3; j++)
boxArray[boxNumber[j]].BackColor =
Color.Red;
}
}
return (winner);
}
private void ComputerTurn ()
{
int selectedBox;
int i, n;
int j, k;
String computerMark, playerMark, markToFind;
int [] boxNumber = new int [3];
String [] mark = new String [3];
int emptyBox;
int [] bestMoves = {4, 0, 2, 6, 8, 1, 3, 5, 7};
if (rdoRandom.Checked)
{
// random logic
// put mark in Nth available square
n = myRandom.Next (9 – numberClicks) +1;
i = 0;
for (selectedBox = 0; selectedBox <9;
selectedBox++)
{
if (boxArray [selectedBox].Text == «»)
i++;
if (i == n)
break;
}
// put mark in SelectedBox
lblBox_Click (boxArray [selectedBox], null);
}
else
{
// smart computer
// determine who has what mark
if (rdoComputerFirst.Checked)
{
computerMark = «X»;
playerMark = «O»;
}
else
{
computerMark = «O»;
playerMark = «X»;
}
// Step 1 (K = 1) – check for win —
// see if two boxes hold
// computer mark and one is empty
// Step 2 (K = 2) – check for block —
// see if two boxes hold
// player mark and one is empty
for (k = 1; k <= 2; k++)
{
if (k == 1)
markToFind = computerMark;
else
markToFind = playerMark;
for (i = 0; i <8; i++)
{
n = 0;
emptyBox = 0;
for (j = 0; j <3; j++)
{
boxNumber [j] = Convert.ToInt32 (
possibleWins[i][j].ToString ());
mark [j] = boxArray [boxNumber [j]].Text;
if (mark [j] == markToFind)
n++;
else if (mark [j] == «»)
emptyBox = boxNumber [j];
}
if (n == 2 && emptyBox!= 0)
{
// mark empty box to win (K = 1) or
// block (K = 2)
lblBox_Click (boxArray [emptyBox], null);
return;
}
}
}
// Step 3 – find next best move
for (i = 0; i <9; i++)
{
if (boxArray [bestMoves [i]].Text == «»)
{
lblBox_Click (boxArray [bestMoves [i]], null);
return;
Интервал:
Закладка: