Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
крестики нолики основное.docx
Скачиваний:
0
Добавлен:
01.04.2025
Размер:
126.41 Кб
Скачать

ДЕПАРТАМЕНТ ОБРАЗОВАНИЯ ИВАНОВСКОЙ ОБЛАСТИ

областное государственное бюджетное образовательное учреждение

среднего профессионального образования

«ИВАНОВСКИЙ ПРОМЫШЛЕННО-ЭКОНОМИЧЕСКИЙ КОЛЛЕДЖ»

КУРСОВАЯ РАБОТА

по дисциплине: «Программирование и алгоритмизация»

тема: составление мини игры «Крестики нолики»

Выполнил студент:

гр.392 Баранов Алексей Александрович

специальность 220703: Автоматизация технологических процессов и производств

Проверил:

Преподаватель общепрофессиональных и

специальных дисциплине Леньков Александр Сергеевич

Иваново 2012

Оглавление

Лист задания 2

Введение 3

Описание алгоритма задачи 4

Графический способ решения 4

Словесное описание алгоритма игры «Крестики-нолики» 5

Описание переменных 6

Разработка программы 7

Заключение 14

Список используемой литературы 15

Лист задания Введение

Практически каждый школьник в тот или иной период своей жизни играл в эту игру. В последние годы в связи с появлением компьютеров и новых обучающих и развивающих программ вновь возрос интерес к ней. Если набрать запрос о поиске игры в Интернет, то поисковая машина выдаст несколько тысяч ссылок. Здесь и реклама, и различные варианты игры, и качественные исследования оптимальны Игра «Крестики нолики» достаточно хорошо известна и популярна. Стратегий игры и т.д. Но мало кто знает о том, что эта игра имеет серьезное научное и практическое приложение, и для ее анализа могут быть использованы современные математические и компьютерные методы. В качестве примера такого приложения можно привести проблему эффективного поиска записей в больших базах данных, обладающих сложной многоуровневой структурой.

Описание алгоритма задачи Графический способ решения

Рис1. Блок-схема мини игры «Крестики-нолики»

Словесное описание алгоритма игры «Крестики-нолики»

Смысл игры: заключается в том чтобы играть крестиками или ноликами и набрать больше выигрышных комбинаций.

Правила и описание программы: в игру играют два пользователя, которые выбирают между собой чем будут играть крестиком или ноликом и по очереди вводят в окне консоли посредством клавиатуры числа отвечающие за ячейки. Выигрывает тот пользователь который первым составит выигрышную комбинацию из из 3-х подряд крестиков или ноликов по горизонтали, по вертикали или по диагонали.

Описание переменных

items – массив который содержит

EXIT_MENU – Макрос равный 3, отвечающий за вход из программы

RED 4 - Макрос равный 4, отвечающий за красный цвет

GREEN 2 - Макрос равный 2, отвечающий за зелёный цвет

WHITE 7 - Макрос равный 7, отвечающий за белый цвет

BLUE 1 - Макрос равный 1, отвечающий за синий цвет

curent_x, curent_y – заданные переменные

player_step;- игра с другим игроком

play_with_computer; - игра против компьютера

i, j, x, y; - переменные

di = 6;

k ; - отвечает за очистку буферов

Разработка программы

// КрестикиНолики.cpp: определяет точку входа для консольного приложения.

//

#include "stdafx.h"

#include <stdio.h>

#include <Windows.h> //Из неё берем только system("cls");

#include <time.h>

//#include <Graphics.h>

#define EXIT_MENU 3

#define RED 4

#define GREEN 2

#define WHITE 7

#define BLUE 1

//Массив соответствующий клеткам поля

int items[3][3]; // 0 - не помеченная, 1 - крестик, 2 - нолик

int curent_x, curent_y;

int player_step;

int play_with_computer;

/*

0 = Черный

1 = Синий

2 = Зеленый

3 = Голубой

4 = Красный

5 = Лиловый

6 = Желтый

7 = Белый

*/

void setcolor(int color)

{

HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);

SetConsoleTextAttribute(handle, color);

}

void clrscr()

{

system("cls");

}

void clear()

{

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

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

items[i][j] = 0;

}

//Печать свободной клетки, n - строка

void print_free(int n)

{

switch(n)

{

case 0: printf("-------- "); break;

case 1: printf("| | "); break;

case 2: printf("| | "); break;

case 3: printf("| | "); break;

case 4: printf("| | "); break;

case 5: printf("-------- "); break;

}

}

//Печать клетки игрока

void print_player1(int n)

{

switch(n)

{

case 0: printf("-------- "); break;

case 1: printf("| X X | "); break;

case 2: printf("| XX | "); break;

case 3: printf("| XX | "); break;

case 4: printf("| X X | "); break;

case 5: printf("-------- "); break;

}

}

//Печать клетки второго игрока

void print_player2(int n)

{

switch(n)

{

case 0: printf("-------- "); break;

case 1: printf(" |||| "); break;

case 2: printf("||| ||| "); break;

case 3: printf("||| ||| "); break;

case 4: printf(" |||| "); break;

case 5: printf("-------- "); break;

}

}

void print()

{

int i, j, x, y;

int di = 6;

//Изменяем цвет

setcolor(GREEN);

//Двигаемся по высоте с 6-ью строками

for(i = 0; i < 3*di; i++) //y

{

//вычисляем к какой ячейке принадлежит данная строка

x = i / di;

//Двигаемся по ширине только три раза

for(j = 0; j < 3; j++) //x

{

//Текущая часть строки соответствует ячейке

y = j;

//Если это курсор рисуем его зеленым

if(x == curent_x && y == curent_y)

setcolor(GREEN);

//Если не курсор то просто красным

else setcolor(RED);

//Смотрим что находится в данной клетке

switch(items[x][y])

{

//Печатаем в зависимости от номера строки

case 0: print_free(i % di); break;

case 1: print_player1(i % di); break;

case 2: print_player2(i % di); break;

}

}

printf("\n");

}

setcolor(WHITE);

printf("Press (for num block buttons): \n4 - left, 6 - right, \n8 - top, 2 - bottom, \n5 - check, 0 - exit.\n");

}

//Проверка на конец игры, возвращает: 0 - никто не выйграл, 1 - первый игрок, 2 - второй игрок, 3 - тупиковая ситуация, когда нет пустых, и никто не выйграл

int verify()

{

int i, j, n;

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

{

//Пробегаемся по столбцам

if(items[i][0] != 0 && items[i][0] == items[i][1] && items[i][1] == items[i][2])

return items[i][0];

//Пробегаемся по строкам

if(items[0][i] != 0 && items[0][i] == items[1][i] && items[1][i] == items[2][i])

return items[0][i];

}

//Проверяем перекрестные

if(items[0][0] != 0 && items[0][0] == items[1][1] && items[1][1] == items[2][2])

return items[0][0];

if(items[0][2] != 0 && items[0][2] == items[1][1] && items[1][1] == items[2][0])

return items[0][2];

//Проверяем на то есть ли еще свободные места

n = 0; //n - свободные места

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

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

if(items[i][j] == 0)

{

n++;

}

//Если нет свободных ячеек, и нет победителя

//если был бы победитель то функция завершилась еще раньше

if(n == 0)

{

return 3;

}

return 0;

}

void pc_step()

{

int x, y;

//Выполняем пока не сгенерируем клетку где пусто

do

{

x = rand() % 3;

y = rand() % 3;

}

while(items[x][y] != 0);

//Ставим

items[x][y] = 2;

}

void game()

{

//задаем точку для генерации случайных чисел

srand(time(NULL));

//Подготавливаем все для игры

int k = 0;

curent_x = 1; //зеленый курсор стандартно посередине

curent_y = 1;

player_step = 1; //первый игрок

clear(); //Делаем все клетки не помеченными

int result = 0;

do

{

//Очищаем экран

clrscr();

//Выводим на экран текущее состояние поля

print();

//Получаем комманду

k = getchar() - 48;

//Выбираем определенное действие для конкретной комманды

switch(k)

{

//влево

case 4:

if(curent_y > 0)

curent_y--;

break;

//вправо

case 6:

if(curent_y < 2)

curent_y++;

break;

//вверх

case 8:

if(curent_x > 0)

curent_x--;

break;

//вниз

case 2:

if(curent_x < 2)

curent_x++;

break;

//Поставить

case 5:

//если клетка пуста

if(items[curent_x][curent_y] == 0)

{

//Помечаем

items[curent_x][curent_y] = player_step;

if(play_with_computer == 0)

{

//Меняем очередность ходов, следующий будет другой игрок

if(player_step == 1)

player_step = 2;

else player_step = 1;

}

else

{

pc_step();

}

}

break;

//Выход

case 0: return;

}

//Проверяем на выйгрыш

result = verify();

}

while(result == 0); //если победителя нет и тупиковой ситуации то играем

//Очищаем экран

clrscr();

//Выводим на экран постеднее состояние

print();

//Вывозим результат

setcolor(BLUE);

switch(result)

{

case 1: printf("\nPlayer1 Win!"); break;

case 2: printf("\nPlayer1 Win!"); break;

case 3: printf("\nGame Over"); break;

}

setcolor(WHITE);

//Запрос на нажатие кнопки, чтобы результат был виден

getchar();

getchar();

}

int main()

{

int k = 0;

do

{

//Очистка буферов

flushall();

//Очищаем экран

clrscr();

//Рисуем меню

printf("Tic-Tac-Toe \n\n");

printf("1 New Game.\n");

printf("2 New Game with PC.\n");

printf("3 Exit.\n");

//Получаем номер нажатой цифры на клавиатуре

k = getchar() - 48;

switch(k)

{

//Новая игра

case 1: play_with_computer = 0; game(); break;

case 2: play_with_computer = 1; game(); break;

//Выход

case 3: break;

}

}

while(k != EXIT_MENU); //Цикл повторяется пока не будет нажата клавиша выход

return 0;

}