
ДЕПАРТАМЕНТ ОБРАЗОВАНИЯ ИВАНОВСКОЙ ОБЛАСТИ
областное государственное бюджетное образовательное учреждение
среднего профессионального образования
«ИВАНОВСКИЙ ПРОМЫШЛЕННО-ЭКОНОМИЧЕСКИЙ КОЛЛЕДЖ»
КУРСОВАЯ РАБОТА
по дисциплине: «Программирование и алгоритмизация»
тема: составление мини игры «Крестики нолики»
Выполнил студент:
гр.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;
}