Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ИДЗ_Кораблев.doc
Скачиваний:
3
Добавлен:
24.08.2019
Размер:
145.92 Кб
Скачать
  1. Структура приложения

    1. Описание классов, их полей и методов

class X0

Поля класса: string массив, int индексы массивов;

Виртуальный метод Step:

  1. считывает данные с “dataGridView1.Rows[i].Cells[j]”

  2. все данные переносит в массив массивов “W[i][j]”

  3. проверяет количество “X”, “0” в строках/столбцах/диагоналях

  4. возвращает значение, исходя из полученных данных

Производные классы от класса Учащийся:

class X0

Поля класса: string массив, int индексы массивов;

Переопределяющий метод Conv: конвертирует индексы массива “W[i][j]”, чтобы в массиве “A[i,z]” не было выхода за пределы массива.

  1. Распределение исходного кода по файлам проекта

    1. Проект Main

Является запускаемым проектом. Содержит ссылки на проекты Library. Основное окно приложения, реализующее отображение выходных данных и основные элементы управления:

  • Новая игра

  • О программе

  • Выход

    1. Проект Library

Библиотека классов приложения, организующая взаимоотношения между классом, его методами.

  1. Контрольный пример и описание результатов

  1. запустим приложение

  2. при нажатии “О программе” появиться окно с правилами игры

  3. нажимая на ячейки, появляется “X”, следом ходит противник “0” (компьютер делает обдуманный шаг)

  4. выигрыш или проигрыш пользователя

  5. можно посмотреть счет побед

  6. при нажатии на “Новая игра” игра начинается заново

  7. выход из приложения

В данном примере продемонстрированы основные возможности приложения.

    1. Код библиотеки классов x0

public static void Conv(ref int n,ref int m)

{

//n=i, m=z

for (int i = 0; i < 3; i++) if (n == 3 && m == i) { m = 0; n = i; };

for (int i = 0; i < 3; i++) if (n == 4 && m == i) { m = 1; n = i; };

for (int i = 0; i < 3; i++) if (n == 5 && m == i) { m = 2; n = i; };

for (int i = 0; i < 3; i++) if (n == 6 && m == i) { m = i; n = i; };

for (int i = 0; i < 3; i++) if (n == 7 && m == i) { m = 2-i; n = i; };

// 00 01 02

// 10 11 12

// 20 21 22

}

public static int Step(ref string[,] A)

{

string[][] W = new string[8][];

//все линии -> массивы (массив массивов)

for (int i = 0; i < 3; i++) // по строкам

{

W[i] = new string[3];

for (int j = 0; j < 3; j++)

{

W[i][j] = A[i, j];

}

}

for (int j = 0; j < 3; j++) //по столбцам

{

W[j+3] = new string[3];

for (int i = 0; i < 3; i++)

{

W[j + 3][i] = A[i, j];

}

}

W[6] = new string[3]; //главня диаг.

for (int i = 0; i < 3; i++)

{

W[6][i] = A[i, i];

}

W[7] = new string[3]; //диаг

for (int i = 0; i < 3; i++)

{

W[7][i] = A[i, 2-i];

}

//проверяем победы

for (int i = 0; i < 8; i++)

{

if (W[i][0] == "x" && W[i][1] == "x" && W[i][2] == "x") return 1; //PLAYER WIN

if (W[i][0] == "o" && W[i][1] == "o" && W[i][2] == "o") return 2; //COMP WIN

}

//если 2 нолика -> третий : COMP WIN

for (int i = 0; i < 8; i++)

{

int k = 0;

for (int j = 0; j < 3; j++)

{

if (W[i][j] == "o") ++k;

}

if (k == 2)

{

for (int z = 0; z < 3; z++) if (W[i][z] == "")

{

Conv(ref i, ref z);

A[i, z] = "o"; return 2;

}

}

}

//если 2 крестика -> закрываем

for (int i = 0; i < 8; i++)

{ int k=0;

for (int j = 0; j < 3; j++)

{

if (W[i][j] == "x") ++k;

}

if (k == 2) { for (int z = 0; z < 3; z++) if (W[i][z] =="") {Conv(ref i, ref z);

A[i, z] = "o"; return 0; } }

}

//если есть один О -> ещё О

for (int i = 0; i < 8; i++)

{

int k = 0, n = 0;

for (int j = 0; j < 3; j++)

{

if (W[i][j] == "o") ++k; if (W[i][j] == "") ++n;

}

if (k == 1&&n==2) { for (int z = 0; z < 3; z++) if (W[i][z] =="") {Conv(ref i, ref z);

A[i, z] = "o"; return 0; } }

}

//случайно ставим O

bool e = false;

for (int i = 0; i < 3; i++)

for (int j = 0; j < 3; j++)

if (A[i, j] != "o" && A[i, j] != "x") e = true;

if (e == false) return 3;

else

{

Random ran = new Random();

int ir = ran.Next(3); int jr = ran.Next(3);

if (A[ir, jr] != "o" && A[ir, jr] != "x") { A[ir, jr] = "o"; return 0; }

else

while (A[ir, jr] == "o" || A[ir, jr] == "x") { ir = ran.Next(3); jr = ran.Next(3); }

A[ir, jr] = "o"; return 0;

}

}

}

}

    1. Код Form1(Main)

public partial class Form1 : Form

{

public Form1()

{

InitializeComponent();

dataGridView1.RowTemplate.Height = 95;

dataGridView1.RowCount = 3;

dataGridView1.ColumnCount = 3;

for (int i = 0; i < 3; i++)

for (int j = 0; j < 3; j++)

dataGridView1.Rows[i].Cells[j].Value = "";

}

private void dataGridView1_CellContentClick(object sender, DataGridViewCellEventArgs e)

{

}

private void dataGridView1_CellClick(object sender, DataGridViewCellEventArgs e)

{

if (dataGridView1.CurrentCell.Value != "") return;

dataGridView1.CurrentCell.Value = "x";

string[,] s = new string[3, 3];

for (int i = 0; i < 3; i++)

for (int j = 0; j < 3; j++)

s[i, j] = dataGridView1.Rows[i].Cells[j].Value.ToString(); //в массив dataGridView1

switch (X0.Step(ref s))

{

case 0:

for (int i = 0; i < 3; i++)

for (int j = 0; j < 3; j++)

{

dataGridView1.Rows[i].Cells[j].Value = s[i, j];

if (dataGridView1.Rows[i].Cells[j].Value == "o") dataGridView1.Rows[i].Cells[j].Style.ForeColor = Color.Blue;

}

break;

case 1: for (int i = 0; i < 3; i++)

for (int j = 0; j < 3; j++)

{

dataGridView1.Rows[i].Cells[j].Value = s[i, j];

if (dataGridView1.Rows[i].Cells[j].Value == "o") dataGridView1.Rows[i].Cells[j].Style.ForeColor = Color.Blue;

}

label2.Text = (int.Parse(label2.Text) + 1).ToString(); MessageBox.Show("Вы выйграли!", "Ура!");

for (int i = 0; i < 3; i++)

for (int j = 0; j < 3; j++)

{ dataGridView1.Rows[i].Cells[j].Value = ""; dataGridView1.Rows[i].Cells[j].Style.ForeColor = Color.Red; }

break;

case 2: for (int i = 0; i < 3; i++)

for (int j = 0; j < 3; j++)

{

dataGridView1.Rows[i].Cells[j].Value = s[i, j];

if (dataGridView1.Rows[i].Cells[j].Value == "o") dataGridView1.Rows[i].Cells[j].Style.ForeColor = Color.Blue;

}

label3.Text = (int.Parse(label3.Text) + 1).ToString(); MessageBox.Show("Вы проиграли!", "Увы!");

for (int i = 0; i < 3; i++)

for (int j = 0; j < 3; j++)

{dataGridView1.Rows[i].Cells[j].Value = ""; dataGridView1.Rows[i].Cells[j].Style.ForeColor=Color.Red;} break;

case 3: for (int i = 0; i < 3; i++)

for (int j = 0; j < 3; j++)

{

dataGridView1.Rows[i].Cells[j].Value = s[i, j];

if (dataGridView1.Rows[i].Cells[j].Value == "o") dataGridView1.Rows[i].Cells[j].Style.ForeColor = Color.Blue;

} MessageBox.Show("Ничья!", "Жаль...");

for (int i = 0; i < 3; i++)

for (int j = 0; j < 3; j++)

{dataGridView1.Rows[i].Cells[j].Value = ""; dataGridView1.Rows[i].Cells[j].Style.ForeColor=Color.Red;} break;

}

}

private void label2_Click(object sender, EventArgs e)

{

}

private void label3_Click(object sender, EventArgs e)

{

}

private void Form1_Load(object sender, EventArgs e)

{

}

private void label4_Click(object sender, EventArgs e)

{

}

private void выходToolStripMenuItem_Click(object sender, EventArgs e)

{

Application.Exit();

}

private void игроToolStripMenuItem_Click_1(object sender, EventArgs e)

{

for (int i = 0; i < 3; i++)

for (int j = 0; j < 3; j++)

{

dataGridView1.Rows[i].Cells[j].Value = "";

label2.Text = "0"; label3.Text = "0";

}

}

private void ToolStripMenuItem_Click(object sender, EventArgs e)

{

}

private void оПрограммеToolStripMenuItem_Click(object sender, EventArgs e)

{

MessageBox.Show("Правила игры: \nИгроки по очереди ставят на свободные клетки поля 3х3 знаки (один всегда крестики, другой всегда нолики). Первый, выстроивший в ряд 3 своих фигуры по вертикали, горизонтали или диагонали, выигрывает. Первый ход делает игрок, ставящий крестики.", "Крестики-нолики");

}

}

}