Реализация игры "Охота на лис"
Разработка игр как одна из многочисленных областей применения языка C, его применение в системном программировании и разработки программ-трансляторов. Алгоритм работы искусственного интеллекта, особенности интерфейса игры, порядок определения победителя.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | курсовая работа |
Язык | русский |
Дата добавления | 17.02.2019 |
Размер файла | 191,2 K |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
Размещено на http://www.allbest.ru/
Федеральное агентство железнодорожного транспорта
Омский государственный университет путей сообщения
Кафедра "Автоматика и системы управления"
РЕАЛИЗАЦИЯ ИГРЫ "ОХОТА НА ЛИС"
Пояснительная записка к курсовой работе
по дисциплине "Программирование"
Выполнил: студент гр. 25М
Р.Д. Актаев
Проверил: преподаватель
А.В. Александров
Омск 2016
Реферат
Курсовая работа содержит в себе 3 файла формата.c, содержащих исходный код, 1 заголовочный файл и полученное в результате компиляции готовое exe-приложение.
Программирование, логика, алгоритм, игра, функции, массивы.
Объектом курсовой работы является игра "Охота на лис".
Цель работы - применение знаний, полученных на занятиях по дисциплине при разработке пошаговой игры, закрепление и расширение знаний языка C.
Результатом курсовой работы является игра "Охота на лис", которая разработана с помощью компилятора MinGW. Исходный код реализовывался в кроссплатформенном текстовом редакторе Sublime Text 2.
В процессе разработки был углубленно изучен синтаксис языка C.
Пояснительная записка оформлена в текстовом редакторе MS Word 2013.
Оглавление
- Введение
- 1. Проект "Охота на лис"
- 1.1 Правила игры
- 1.2 Начало работы с приложением
- 1.3 Ход игры
- 1.4 Окончание ходов
- 2. Принцип работы программы
- 2.1 Заполнение поля лисами и вывод
- 2.2 Действия игрока
- 2.3 Игра с соперником
- 3. Искусственный интеллект и его стратегия
- 3.1 "Черный список"
- 3.2 Стратегия искусственного интеллекта
- 4. Главная функция
- Заключение
- Библиографический список
- Приложение А. Листинг
Введение
Язык C - типизированный язык программирования высокого уровня, разработанный в период 1969-1973 годов Деннисом Ритчи. Он является потомком интерпретируемого языка B (Би).
Си является отличается минимализмом и код на нем можно писать на уровне низком уровне абстракции. Язык разрабатывался так, чтобы код на нем компилировался с помощью однопроходного компилятора, который обходит его, не возвращаясь назад. Именно поэтому объявление функции должно предшествовать ее вызову. Несмотря на то, что формально C является высокоуровневым языком, его называют языком среднего, а иногда даже низкого уровня.
Большие программы на нем оформляются по правилам процедурного программирования, то есть путем разбиения ее на отдельные функции для применения структурного программирования.
Си широко используется в системном программировании (операционные системы, драйверы и т.д.), также он является одним из языков разработки программ-трансляторов. Но на самом деле перечислить все из области его применения невозможно - это и серверы, протоколы, игры и многое другое. В данной курсовой работе на C реализована игра "Охота на лис".
"Охота на лис" - известная логическая игра, созданная по мотивам одноименной дисциплины для любителей спортивной радиопеленгации. В ходе выполнения курсовой работы реализована эта игра, причем включена возможность как игры между двумя пользователями, так и игры человека против компьютера, следующего определенной стратегии.
1. Проект "Охота на лис"
1.1 Правила игры
На поле 8x8 случайным образом расставлено восемь лис. Игрок может стрелять по любой из этих клеток, введя координаты через пробел. В случае попадания на экран выводится символ "X", в случае промаха - количество лис на одной строке и одном столбце с этой клеткой. Игроки ходят по очереди, цель каждого из них - подстрелить всех лис за меньшее количество шагов, чем соперник.
Рисунок 1 - Ход игры
1.2 Начало работы с приложением
игра интерфейс алгоритм транслятор
Сразу после запуска приложения пользователь наблюдает текст, в котором вкратце рассказана суть игры. Нажатием любой клавиши производится переход к меню выбора режима игры - одиночной против компьютера или против другого человека (рисунок 2). В зависимости от выбора, будет предложено ввести имя одного или двух игроков.
Рисунок 2 - Меню выбора режима игры
1.3 Ход игры
После выбора режима игры выводится чистое поле 8x8 с пронумерованными координатами. Под ним можно видеть число сделанных игроком ходов и количество оставшихся в живых лис.
Рисунок 3 - Видимое поле
Текст ниже приглашает игрока ввести координаты клетки, в которую он хочет бить (первое число - номер строки, второе - номер столбца; вводятся через пробел).
После того, как он сделает это, увидит подстреленную лису в случае попадания, либо количество лис на одной строке и столбце с выбранной клеткой в случае промаха.
Рисунок 4 - Подстреленная лиса и промах
Как видно из рисунка 4, на всей второй строке и всем шестом столбце в общем располагается две лисы.
1.4 Окончание ходов
Ходы первого игрока заканчиваются, как только количество живых лис становится равным нулю. Он увидит уведомление об этом и до выступления соперника сможет наблюдать позиции лис.
Рисунок 5 - Уведомление о том, что все лисы подстрелены
После нажатия любой клавиши приходит очередь второго игрока или компьютера. После окончание выступления соперника сравнивается количество ходов того и другого и выводится имя победителя.
Рисунок 6 - Итоги игры
На рисунке 6 видно, что компьютер подстрелил всех лис быстрее, чем пользователь и победил.
2. Принцип работы программы
2.1 Заполнение поля лисами и вывод
Информацию о расстановке лис на поле хранит постоянный массив чисел field, а видимое поле - массив символов fieldForOutput.
За заполнение поля лисами в случайном порядке отвечает функция, показанная на листинге 1.
Листинг 1 - Функция заполнения поля лисами
void AutomaticInputField(int field[][EIGHT]) {
srand(time(NULL));
int i, j,
k = EIGHT;
for (i = 0; i<EIGHT; i++)
for (j = 0; j<EIGHT; j++)
field[i][j] = 0; //создание пустого поля для лис
while (k > 0) { //лисы расставляются только в пустые ячейки
i = rand()%EIGHT; //случайные координаты в области 0...8
j = rand()%EIGHT;
if(field[i][j] == 0) {
field[i][j]++; //увеличение количества лис в этой клетке
k--;
}
}
}
За вывод поля на экран отвечает функция, показанная на листинге 2.
Листинг 2 - Вывод поля
void OutputField(char fieldForOutput[][EIGHT]) { //вывод поля в консоль
printf ("\n | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |\n"); //нумерация столбцов
printf ("------------------------------------");
int i,j;
for(i = 0; i<EIGHT; i++) {
printf("\n%3d|",i+1); //нумерация строк
for(j = 0; j<EIGHT; j++)
printf("%2c |", fieldForOutput[i][j]);
printf("\n------------------------------------");
}
}
2.2 Действия игрока
За действия игрока отвечает функция, представленная на листинге 3. Она будет вызываться до тех пор, пока не функция победы (листинг 4) не вернет 1 (это произойдет тогда, когда обнулится количество лис, хранящихся в одноименной переменной). Чтобы не захламлять код глобальными переменными, они передаются из одной функции в другую через указатель (если разыменовать и изменить его, изменится и исходное значение). Также после каждого хода экран очищается и обновляется.
Листинг 3 - Функция хода игрока
int InputSteps(char *player, int field[][8], char fieldForOutput[][8], int* foxes, int* steps) { //функция самой игры
int coordinatesRow, coordinatesCol, //координаты
i, j, foxesOnTheLine = 0; //foxesOnTheLine - количество лис в одной строке и столбце
printf("\t\tХодит %s\n\n", player);
OutputField(fieldForOutput); //функция вывода поля вызывается после каждого хода игрока
printf("\nШагов сделано: %d\n", *steps);
printf("Осталось лис: %d",*foxes);
#ifdef DEBUG
printf("\nstep = %d", *steps);
#endif
printf("\nВведите координаты клетки, в которую хотите выстрелить: ");
//если введены координаты, выходящие за рамки поля или символы, функция возвращает ноль
if((scanf("%d%d", &coordinatesRow, &coordinatesCol) != 2) || (coordinatesRow <= 0) || (coordinatesRow > 8) || (coordinatesCol <= 0) || (coordinatesCol > 8))
return 0;
else {
//нельзя бить в обстрелянную ячейку
if(fieldForOutput[coordinatesRow-1][coordinatesCol-1] != ' ')
return 0;
else {
if(field[coordinatesRow-1][coordinatesCol-1] != 0) { //если в поле есть лисы, на экран выводится символ X
fieldForOutput[coordinatesRow-1][coordinatesCol-1] = 'X';
--(*foxes);
}
else
for(i=0; i<8; i++) {
foxesOnTheLine+=field[coordinatesRow-1][i]; //подчет лис в одной строке
foxesOnTheLine+=field[i][coordinatesCol-1]; // и одном столбце
fieldForOutput[coordinatesRow-1][coordinatesCol-1] = (char)48+foxesOnTheLine; //количество лис как символ
}
(*steps)++;
return 1;
}
}
}
Листинг 4 - Функция проверки на победу
int Win(int* foxes) {
if((*foxes) == 0)
return 1;
else return 0;
}
Само действие игрока (набор ходов до победы) реализовано в отдельной функции. Ее исходный код продемонстрирован на листинге 5. Обязательным условием продолжения действия является возвращаемое функцией ввода значение, равное единице (истина).
Листинг 5 - Набор ходов одного игрока
void PlayerGame(char *player, int* foxes, int* steps) {
int field[EIGHT][EIGHT]; //поле, значение каждого элемента которого показывает количество лис в данной клетке
char fieldForOutput[EIGHT][EIGHT]; //поле для вывода
int i,j;
AutomaticInputField(field); //поле заполняется лисами
system("cls");
for(i = 0; i<EIGHT; i++)
for(j = 0; j<EIGHT; j++)
fieldForOutput[i][j] = ' '; //видимое поле заполняется пустыми клетками
while(Win(foxes) != 1) {
system("cls");
if(InputSteps(player, field, fieldForOutput, foxes, steps) == 0) { //вызывается функция выполнения шагов одного игрока
printf("Вы ввели некорректные данные!");
_getch();
char buf[256]; //в случае ввода неверных данных поток очищается, а пользователь получает соответствующее уведомление
fgets(buf,256,stdin);
}
}
system("cls");
OutputField(fieldForOutput);
printf("\nВы подстрелили всех лис!"); //если все лисы убиты, игрок видит обстрелянное поле и уведомление об окончании действия
_getch();
}
2.3 Игра с соперником
Далее переходим к функции непосредственной игры между двумя игроками. Она дважды вызывает функцию действия каждого из игроков, сравнивает результирующее количество ходов того и другого и подводит итоги (листинг 6).
Листинг 6 - Игра между двумя игроками и ее итог
void TwoPlayers() {
int foxes = EIGHT, steps = 0; //число лис и ходов на начальном этапе
char player1[30], player2[30]; //строки для хранения имен игроков
int stepsOfFirstPlayer;
printf("Введите имя первого игрока: "); //ввод
gets(player1); // имен игроков
printf("Введите имя второго игрока: ");
gets(player2);
PlayerGame(player1, &foxes, &steps); //вызов функции набора ходов первого игрока
system("cls"); //очистка экрана
stepsOfFirstPlayer = steps; //количество ходов, сделанных первым игроком записываются в отдельную переменную
steps = 0; //количество шагов обнуляется
foxes = EIGHT; //а лис снова восемь
PlayerGame(player2, &foxes, &steps); //повторный вызов функции для второго игрока
system("cls");
printf("Игрок %s: %d ходов. \n", player1, stepsOfFirstPlayer); //подведение итогов
printf("Игрок %s: %d ходов. \n", player2, steps);
//сравнение результатов и вывод победителя
if(steps > stepsOfFirstPlayer)
printf("Победил игрок %s!", player1);
if(stepsOfFirstPlayer > steps)
printf("Победил игрок %s!", player2);
if(stepsOfFirstPlayer == steps)
printf("Ничья!");
_getch();
}
3. Искусственный интеллект и его стратегия
3.1 "Черный список"
Программа, созданная в ходе выполнения данной курсовой работы, подразумевает возможность игры против компьютера, следующего определенное стратегии. Функция игры против него практически аналогична функции состязания двух людей, однако вместо этого вызывается другая функция выбора шага.
Данная функция задает координаты из случайных чисел, однако помимо проверки нетронутости ячейки, проверяется, не занесена ли одна из координат в "черный список" - два массива, которые хранят значения строк и столбцов, в которых в принципе не может находиться ни одной скрытой лисы.
Функция проверки наличия координаты в массиве довольно проста (листинг 7).
Листинг 7 - Проверка наличия координаты в черном списке
int CheckCoordinates(int index, int blacklist[64]) { //проверка наличия координаты в черном списке
for(int i=0; i<64; i++)
if(blacklist[i] == index)
return 0;
return 1;
}
3.2 Стратегия искусственного интеллекта
Изначально компьютер бьет по случайным ячейкам, а уже потом, исходя из полученных данных, анализирует, куда бить следует, а куда - бессмысленно. В случае промаха он сравнивает только подсчитанное количество лис в одной строке и столбце с ячейкой и количество уже убитых лис. Если значения равны - бить по этим линиям не нужно - координаты заносятся в черный список. Функция сравнения реализована на листинге 8.
Листинг 8 - Сравнение общего количества лис на линиях с уже убитыми
//функция принятия решения: стрелять или не стрелять?
int ShootOrNotShoot(char fieldForOutput[][EIGHT], int foxesOnTheLine, int coordinatesRow, int coordinatesCol) {
int i,j;
int killedFoxes = 0;
for(i=0; i<EIGHT; i++)
if(fieldForOutput[coordinatesRow][i] == 'X' || fieldForOutput[i][coordinatesCol] == 'X')
killedFoxes++;
if(foxesOnTheLine == killedFoxes)
return 0;
else
return 1;
}
В случае попадания, анализу подвергаются все ячейки, находящиеся с выбранной на одной строке и одном столбце. Функция проверки одной ячейки представляет собой слегка видоизмененную функцию из листинга 8 и продемонстрирована на листинге 9.
Листинг 9 - Поиск убитых лис на обстрелянной ячейке
//поиск убитых лис на обстрелянной ячейке
int FindKilledFoxes(char fieldForOutput[EIGHT][EIGHT], int row, int col) {
int i,j;
int foxesOTL = fieldForOutput[row][col]-'0'; //получение из символьного значения видимого поля целого числа
int killedFoxes = 0;
for(i=0; i<EIGHT; i++) {
if(fieldForOutput[row][i] == 'X')
killedFoxes++; //увеличение количества лис, если встречается символ 'X'
if(fieldForOutput[i][col] == 'X')
killedFoxes++;
}
if(killedFoxes == foxesOTL) //сравнение
return 0;
else
return 1;
}
Рисунок 7 - Работа искусственного интеллекта
В качестве примера продемонстрируем ситуацию, представленную на рисунке 7. Компьютер не будет бить по шестой строке и восьмому столбцу, так как количество лис на них равно нулю. То е самое с пятой сторокй и четвертым столбцом. Также он не будет бить по второй строке и второму столбцу, поскольку значение, расположенное на их пересечении говорит о том, что все лисы уже подстрелены, аналогичная ситуация с седьмой строкой седьмым столбцом. Тем самым компьютер сужает количество целей до ячеек, в которых еще могут быть лисы, исключая пустые ячейки.
Листинг 10 отображает функцию пошаговых действий компьютера.
Листинг 10 - Ходы компьютера
void AutomaticInputSteps(int field[][EIGHT], char fieldForOutput[][EIGHT], int* foxes, int* steps, int blacklistRow[64], int blacklistCol[64], int* indexBlacklistRow, int* indexBlacklistCol) { //функция самой игры
int coordinatesRow, coordinatesCol, //координаты
i, j, foxesOnTheLine = 0; //foxesOnTheLine - количество лис в одной строке и столбце
printf("Ходит компьютер...\n\n");
OutputField(fieldForOutput);
printf("\nШагов сделано: %d\n", *steps);
printf("Осталось лис: %d",*foxes);
do{
coordinatesRow = rand()%EIGHT;
coordinatesCol = rand()%EIGHT;
} while((fieldForOutput[coordinatesRow][coordinatesCol] != ' ') || !CheckCoordinates(coordinatesRow, blacklistRow) || !CheckCoordinates(coordinatesCol, blacklistCol));
//цикл продолжается, пока будут подобраны координаты, не находящиеся в черном списке
if(field[coordinatesRow][coordinatesCol] != 0) { //если в поле есть лисы, на экран выводится символ X
fieldForOutput[coordinatesRow][coordinatesCol] = 'X';
--(*foxes);
for(i=0;i<8;i++) {
if(fieldForOutput[coordinatesRow][i] != ' ' && fieldForOutput[coordinatesRow][i] != 'X') {
if(!FindKilledFoxes(fieldForOutput, coordinatesRow, i)) { //проверка каждой ячейки на одной строке и столбце с битой
blacklistRow[(*indexBlacklistRow)] = coordinatesRow;
blacklistCol[(*indexBlacklistCol)] = i;
(*indexBlacklistRow)++;
(*indexBlacklistCol)++;
}
}
if(fieldForOutput[i][coordinatesCol] != ' ' && fieldForOutput[i][coordinatesCol] != 'X') {
if(!FindKilledFoxes(fieldForOutput, i, coordinatesCol)) {
blacklistRow[(*indexBlacklistRow)] = i;
blacklistCol[(*indexBlacklistCol)] = coordinatesCol;
(*indexBlacklistRow)++;
(*indexBlacklistCol)++;
}
}
}
}
else {
for(i=0; i<EIGHT; i++) {
foxesOnTheLine+=field[coordinatesRow][i]; //подчет лис в одной строке
foxesOnTheLine+=field[i][coordinatesCol]; // и одном столбце
fieldForOutput[coordinatesRow][coordinatesCol] = (char)48+foxesOnTheLine; //количество лис как символ
}
if(!ShootOrNotShoot(fieldForOutput, foxesOnTheLine, coordinatesRow, coordinatesCol)) {
blacklistRow[(*indexBlacklistRow)] = coordinatesRow;
blacklistCol[(*indexBlacklistCol)] = coordinatesCol;
(*indexBlacklistRow)++;
(*indexBlacklistCol)++;
}
}
(*steps)++;
}
Как уже говорилось ранее, функция набора ходов компьютера и его действий против игрока мало чем отличается от аналогичных функций для двух игроков. Их можно наблюдать на листингах 10-11.
Листинг 11 - Действия компьютера до победы
void AI_Game(int* foxes, int* steps) {
int field[EIGHT][EIGHT]; //поле, значение каждого элемента которого показывает количество лис в данной клетке
char fieldForOutput[EIGHT][EIGHT]; //поле для вывода
int blacklistRow[64], blacklistCol[64];
int indexBlacklistRow = 0, indexBlacklistCol = 0;
int i,j;
FillFalse(blacklistRow);
FillFalse(blacklistCol);
AutomaticInputField(field);
system("cls");
for(i = 0; i<EIGHT; i++)
for(j = 0; j<EIGHT; j++)
fieldForOutput[i][j] = ' ';
while(!Win(foxes)) {
system("cls");
AutomaticInputSteps(field, fieldForOutput, foxes, steps, blacklistRow, blacklistCol, &indexBlacklistRow, &indexBlacklistCol);
//_getch();
}
#ifdef DEBUG
for(i=0;i<72;i++) {
printf("\nblacklistRow[%d] = %d, ", i, blacklistRow[i]);
printf("blacklistCol[%d] = %d\n", i, blacklistCol[i]);
}
#endif
system("cls");
OutputField(fieldForOutput);
printf("\nВсе лисы подстрелены!");
printf("\nНажмите любую клавишу для продолжения...");
_getch();
}
Листинг 12 - Функция противостояния игрока и компьютера
void OnePlayer() {
int foxes = EIGHT, steps = 0;
char player[30];
int stepsOfPlayer;
printf("Введите ваше имя: ");
gets(player);
PlayerGame(player, &foxes, &steps);
system("cls");
system("cls");
stepsOfPlayer = steps;
steps = 0;
foxes = EIGHT;
AI_Game(&foxes, &steps);
system("cls");
printf("Игрок %s: %d ходов\n", player, stepsOfPlayer);
printf("Компьютер: %d ходов\n", steps);
if(steps > stepsOfPlayer)
printf("Победил игрок %s!", player);
if(stepsOfPlayer > steps)
printf("Победил компьютер!");
if(stepsOfPlayer == steps)
printf("Ничья!");
_getch();
}
4. Главная функция
Основная ее задача - определить режим игры и вызвать необходимую функцию. Также перед началом выводится текст с краткой инструкцией.
Листинг 13 - Главная функция
int main() {
Instruction();
system("cls");
printf("1. Игра против компьютера\n");
printf("2. Игра против человека");
char key = getch();
system("cls");
if(key == '2')
TwoPlayers();
else
if(key == '1')
OnePlayer();
return 0;
}
Заключение
Разработка игр - одна из многочисленных областей применения языка C. В ходе реализации программы "Охота на лис" я закрепил полученные ранее знания языка, а так же научился применять различные логические находки в тех или иных ситуациях, что является одним из самых необходимых навыков специалиста в сфере информационных технологий. Главным образом, это пригодилось для придания искусственному интеллекту умения анализировать и выбирать наиболее оптимальные действия.
Несмотря на отсутствие графического интерфейса, процесс разработки оказался довольно сложным, но дал очень полезную практику для решения более сложных задач в программировании.
Библиографический список
1. Керниган Б., Ритчи Д. Язык программирования Си / Б. Керниган, Д. Ритчи М.: Вильямс, 2015. 253 с.
2. Керниган Б, Пайк Р. Практика программирования / Б. Керниган, Р. Пайк М.: Вильямс, 2004. 288 с.
3. Шень А.: Игры и стратегии с точки зрения математики / А. Шень, М: МЦНМО, 2008. 40 с.
Приложение А. Листинг
game.h
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <math.h>
#include <string.h>
#include <time.h>
void OutputField (char fieldForOutput[][8]);
void AutomaticInputField(int field[][8]);
int InputSteps(char *player, int field[][8], char fieldForPutput[][8], int* foxes, int* steps);
int Win(int* foxes);
void PlayerGame(char *player, int* foxes, int* steps);
void TwoPlayers();
void FillFalse(int array[64]);
int CheckCoordinates(int index, int blacklist[64]);
int ShootOrNotShoot(char fieldForOutput[][8], int foxesOnTheLine, int coordinatesRow, int coordinatesCol);
void AutomaticInputSteps(int field[][8], char fieldForOutput[][8], int* foxes, int* steps, int blacklistRow[64], int blacklistCol[64], int* indexBlacklistRow, int* indexBlacklistCol);
void AI_Game(int* foxes, int* steps);
void OnePlayer();
player.c
#include "game.h"
#define EIGHT 8
void OutputField(char fieldForOutput[][EIGHT]) { //вывод поля в консоль
printf ("\n | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |\n"); //нумерация столбцов
printf ("------------------------------------");
int i,j;
for(i = 0; i<EIGHT; i++) {
printf("\n%3d|",i+1); //нумерация строк
for(j = 0; j<EIGHT; j++)
printf("%2c |", fieldForOutput[i][j]);
printf("\n------------------------------------");
}
}
int InputSteps(char *player, int field[][8], char fieldForOutput[][8], int* foxes, int* steps) { //функция самой игры
int coordinatesRow, coordinatesCol, //координаты
i, j, foxesOnTheLine = 0; //foxesOnTheLine - количество лис в одной строке и столбце
printf("\t\tХодит %s\n\n", player);
OutputField(fieldForOutput); //функция вывода поля вызывается после каждого хода игрока
printf("\nШагов сделано: %d\n", *steps);
printf("Осталось лис: %d",*foxes);
#ifdef DEBUG
printf("\nstep = %d", *steps);
#endif
printf("\nВведите координаты клетки, в которую хотите выстрелить: ");
//если введены координаты, выходящие за рамки поля или символы, функция возвращает ноль
if((scanf("%d%d", &coordinatesRow, &coordinatesCol) != 2) || (coordinatesRow <= 0) || (coordinatesRow > 8) || (coordinatesCol <= 0) || (coordinatesCol > 8))
return 0;
else {
//нельзя бить в обстрелянную ячейку
if(fieldForOutput[coordinatesRow-1][coordinatesCol-1] != ' ')
return 0;
else {
if(field[coordinatesRow-1][coordinatesCol-1] != 0) { //если в поле есть лисы, на экран выводится символ X
fieldForOutput[coordinatesRow-1][coordinatesCol-1] = 'X';
--(*foxes);
}
else
for(i=0; i<8; i++) {
foxesOnTheLine+=field[coordinatesRow-1][i]; //подчет лис в одной строке
foxesOnTheLine+=field[i][coordinatesCol-1]; // и одном столбце
fieldForOutput[coordinatesRow-1][coordinatesCol-1] = (char)48+foxesOnTheLine; //количество лис как символ
}
(*steps)++;
return 1;
}
}
}
int Win(int* foxes) {
if((*foxes) == 0)
return 1;
else return 0;
}
void PlayerGame(char *player, int* foxes, int* steps) {
int field[EIGHT][EIGHT]; //поле, значение каждого элемента которого показывает количество лис в данной клетке
char fieldForOutput[EIGHT][EIGHT]; //поле для вывода
int i,j;
AutomaticInputField(field); //поле заполняется лисами
system("cls");
for(i = 0; i<EIGHT; i++)
for(j = 0; j<EIGHT; j++)
fieldForOutput[i][j] = ' '; //видимое поле заполняется пустыми клетками
while(Win(foxes) != 1) {
system("cls");
if(InputSteps(player, field, fieldForOutput, foxes, steps) == 0) { //вызывается функция выполнения шагов одного игрока
printf("Вы ввели некорректные данные!");
_getch();
char buf[256]; //в случае ввода неверных данных поток очищается, а пользователь получает соответствующее уведомление
fgets(buf,256,stdin);
}
}
system("cls");
OutputField(fieldForOutput);
printf("\nВы подстрелили всех лис!"); //если все лисы убиты, игрок видит обстрелянное поле и уведомление об окончании действия
_getch();
}
void TwoPlayers() {
int foxes = EIGHT, steps = 0; //число лис и ходов на начальном этапе
char player1[30], player2[30]; //строки для хранения имен игроков
int stepsOfFirstPlayer;
printf("Введите имя первого игрока: "); //ввод
gets(player1); // имен игроков
printf("Введите имя второго игрока: ");
gets(player2);
PlayerGame(player1, &foxes, &steps); //вызов функции набора ходов первого игрока
system("cls"); //очистка экрана
stepsOfFirstPlayer = steps; //количество ходов, сделанных первым игроком записываются в отдельную переменную
steps = 0; //количество шагов обнуляется
foxes = EIGHT; //а лис снова восемь
PlayerGame(player2, &foxes, &steps); //повторный вызов функции для второго игрока
system("cls");
printf("Игрок %s: %d ходов. \n", player1, stepsOfFirstPlayer); //подведение итогов
printf("Игрок %s: %d ходов. \n", player2, steps);
//сравнение результатов и вывод победителя
if(steps > stepsOfFirstPlayer)
printf("Победил игрок %s!", player1);
if(stepsOfFirstPlayer > steps)
printf("Победил игрок %s!", player2);
if(stepsOfFirstPlayer == steps)
printf("Ничья!");
_getch();
}
AI.c
#include "game.h"
#define EIGHT 8
void OutputField(char fieldForOutput[][EIGHT]) { //вывод поля в консоль
printf ("\n | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |\n"); //нумерация столбцов
printf ("------------------------------------");
int i,j;
for(i = 0; i<EIGHT; i++) {
printf("\n%3d|",i+1); //нумерация строк
for(j = 0; j<EIGHT; j++)
printf("%2c |", fieldForOutput[i][j]);
printf("\n------------------------------------");
}
}
int InputSteps(char *player, int field[][8], char fieldForOutput[][8], int* foxes, int* steps) { //функция самой игры
int coordinatesRow, coordinatesCol, //координаты
i, j, foxesOnTheLine = 0; //foxesOnTheLine - количество лис в одной строке и столбце
printf("\t\tХодит %s\n\n", player);
OutputField(fieldForOutput); //функция вывода поля вызывается после каждого хода игрока
printf("\nШагов сделано: %d\n", *steps);
printf("Осталось лис: %d",*foxes);
#ifdef DEBUG
printf("\nstep = %d", *steps);
#endif
printf("\nВведите координаты клетки, в которую хотите выстрелить: ");
//если введены координаты, выходящие за рамки поля или символы, функция возвращает ноль
if((scanf("%d%d", &coordinatesRow, &coordinatesCol) != 2) || (coordinatesRow <= 0) || (coordinatesRow > 8) || (coordinatesCol <= 0) || (coordinatesCol > 8))
return 0;
else {
//нельзя бить в обстрелянную ячейку
if(fieldForOutput[coordinatesRow-1][coordinatesCol-1] != ' ')
return 0;
else {
if(field[coordinatesRow-1][coordinatesCol-1] != 0) { //если в поле есть лисы, на экран выводится символ X
fieldForOutput[coordinatesRow-1][coordinatesCol-1] = 'X';
--(*foxes);
}
else
for(i=0; i<8; i++) {
foxesOnTheLine+=field[coordinatesRow-1][i]; //подчет лис в одной строке
foxesOnTheLine+=field[i][coordinatesCol-1]; // и одном столбце
fieldForOutput[coordinatesRow-1][coordinatesCol-1] = (char)48+foxesOnTheLine; //количество лис как символ
}
(*steps)++;
return 1;
}
}
}
int Win(int* foxes) {
if((*foxes) == 0)
return 1;
else return 0;
}
void PlayerGame(char *player, int* foxes, int* steps) {
int field[EIGHT][EIGHT]; //поле, значение каждого элемента которого показывает количество лис в данной клетке
char fieldForOutput[EIGHT][EIGHT]; //поле для вывода
int i,j;
AutomaticInputField(field); //поле заполняется лисами
system("cls");
for(i = 0; i<EIGHT; i++)
for(j = 0; j<EIGHT; j++)
fieldForOutput[i][j] = ' '; //видимое поле заполняется пустыми клетками
while(Win(foxes) != 1) {
system("cls");
if(InputSteps(player, field, fieldForOutput, foxes, steps) == 0) { //вызывается функция выполнения шагов одного игрока
printf("Вы ввели некорректные данные!");
_getch();
char buf[256]; //в случае ввода неверных данных поток очищается, а пользователь получает соответствующее уведомление
fgets(buf,256,stdin);
}
}
system("cls");
OutputField(fieldForOutput);
printf("\nВы подстрелили всех лис!"); //если все лисы убиты, игрок видит обстрелянное поле и уведомление об окончании действия
_getch();
}
void TwoPlayers() {
int foxes = EIGHT, steps = 0; //число лис и ходов на начальном этапе
char player1[30], player2[30]; //строки для хранения имен игроков
int stepsOfFirstPlayer;
printf("Введите имя первого игрока: "); //ввод
gets(player1); // имен игроков
printf("Введите имя второго игрока: ");
gets(player2);
PlayerGame(player1, &foxes, &steps); //вызов функции набора ходов первого игрока
system("cls"); //очистка экрана
stepsOfFirstPlayer = steps; //количество ходов, сделанных первым игроком записываются в отдельную переменную
steps = 0; //количество шагов обнуляется
foxes = EIGHT; //а лис снова восемь
PlayerGame(player2, &foxes, &steps); //повторный вызов функции для второго игрока
system("cls");
printf("Игрок %s: %d ходов. \n", player1, stepsOfFirstPlayer); //подведение итогов
printf("Игрок %s: %d ходов. \n", player2, steps);
//сравнение результатов и вывод победителя
if(steps > stepsOfFirstPlayer)
printf("Победил игрок %s!", player1);
if(stepsOfFirstPlayer > steps)
printf("Победил игрок %s!", player2);
if(stepsOfFirstPlayer == steps)
printf("Ничья!");
_getch();
}
Размещено на Allbest.ru
...Подобные документы
Анализ правил выбора хода на шахматной доске К. Шеннона. Характеристика программного модуля искусственного интеллекта для игры в шахматы. Контроль времени, поиск лучшего хода в шахматных алгоритмах. Разработка программы для игры с компьютерным оппонентом.
дипломная работа [3,7 M], добавлен 07.07.2012Алгоритмическое представление и описание правил игры "Эволюция". Построение диаграммы прецедентов. Разработка графического интерфейса пользователя. Реализация интерфейса в среде Unity. Структура файла сохранения игры. Проектирование поведения компьютера.
дипломная работа [3,3 M], добавлен 18.02.2017Разработка на основе игры "Точки" подхода к программированию "искусственного интеллекта" в позиционных играх и возможность применения данного подхода для решения задач в области экономики, управления и других областях науки. Модель игровой ситуации.
дипломная работа [1,5 M], добавлен 21.07.2013Обоснование необходимости разработки программы для игры "Тетрис". Математическая и графическая части алгоритма. Выбор языка и среды программирования. Отладка текста программы, разработка интерфейса пользователя. Тестирование, руководство пользователя.
курсовая работа [1,5 M], добавлен 17.01.2011Разработка игры, реализующей алгоритмы искусственного интеллекта, позволяющие играть в одиночку. Анализ обрабатываемой информации и структур данных для ее хранения. Разработка интерфейса пользователя, форм вывода данных. Выбор стратегии тестирования.
курсовая работа [896,5 K], добавлен 19.06.2013Проектирование игры "Жизнь" и ее реализация в среде разработки Visual Studio 2010, версия .Net Framework 4.0. Особенности языка программирования C#, основных принципов ООП на языке C#. Проектирование пользовательского интерфейса. Описание алгоритмов.
курсовая работа [990,0 K], добавлен 18.04.2013Описание правил игры "Морской бой". Особенности современных компьютеров и искусственного интеллекта. Создание общей блок-схемы программы, ее внешний вид. Необходимые переменные, процедуры и функции. Характеристика объектов, используемых в приложении.
курсовая работа [950,1 K], добавлен 05.11.2012Общая характеристика сетевой игры с несколькими клиентами в программной среде MS Visual Studio 2010 на языке программирования C++ с использованием функций работы с сокетами. Реализация системного сервиса, разработки интерфейса, алгоритм его тестирования.
курсовая работа [495,3 K], добавлен 06.01.2013Разработка и создание игры "Змейка". Использование динамически-активных принципов языка Java. Графические объекты программы. Описание игры, правила, теоретические сведения. Классы приложения. Типы данных. Реализация. Метод. Объект. Блок-схема игры.
курсовая работа [12,4 K], добавлен 18.06.2008Игровая программа "шашки" для игры между человеком и компьютером. Разработка алгоритмов, историческая линия развития задач. Различные подходы к построению систем. Сокращенный листинг программы и описание алгоритма. Компоненты искусственного интеллекта.
курсовая работа [196,2 K], добавлен 26.03.2009Исследование базовых концепций программирования приложений под операционную систему Windows. Изучение истории создания универсального языка программирования Си. Разработка графического пользовательского интерфейса. Обзор правил игры и алгоритма работы.
курсовая работа [58,2 K], добавлен 09.11.2012Понятие и суть нечеткой логики и генетических алгоритмов. Характеристика программных пакетов для работы с системами искусственного интеллекта в среде Matlab R2009b. Реализация аппроксимации функции с применением аппарата нечеткого логического вывода.
курсовая работа [2,3 M], добавлен 23.06.2012Приемы программирования в Delphi. Алгоритм поиска альфа-бета отсечения, преимущества. Описание программного средства. Разработка программы, реализующая алгоритм игры "реверси". Руководство пользователя. Листинг программы. Навыки реализации алгоритмов.
курсовая работа [357,1 K], добавлен 28.02.2011Классификация экспертных систем и программного обеспечения для их разработки. Практическое применение искусственного интеллекта на машиностроительных предприятиях и в экономике. Составление дерева решения. Язык функционального программирования LISP.
курсовая работа [542,6 K], добавлен 12.12.2013Разработка компьютерной игры "Эволюция" с помощью игрового движка Unit. Сравнение критериев игры-аналога и разрабатываемой игры. Разработка графического интерфейса пользователя. Настройки камеры в редакторе Unity. Структура файла сохранения игры.
дипломная работа [3,6 M], добавлен 11.02.2017Технические и пользовательские характеристики игры, требования к программному обеспечению и среде разработки C#. Составление блок-схемы алгоритма, uml-диаграммы и текста программы, тестирование корректности компьютерного кода и результатов его работы.
курсовая работа [1,8 M], добавлен 05.03.2013Требования к техническим, программным средствам разработки и функционированию программы. Обоснование выбранного языка программирования. Описание алгоритма решения задачи, тестирование ее основных функций. Понятие дружелюбного пользовательского интерфейса.
курсовая работа [85,9 K], добавлен 31.10.2014Методика и основные этапы разработки стратегической игры, ее элементы и принцип работы программы. Порядок построения информационной модели. Диаграмма потоков данных и действий. Выбор языка программирования и его обоснование. Критерии качества среды.
курсовая работа [3,5 M], добавлен 11.12.2012Сущность и проблемы определения искусственного интеллекта, его основных задач и функций. Философские проблемы создания искусственного интеллекта и обеспечения безопасности человека при работе с роботом. Выбор пути создания искусственного интеллекта.
контрольная работа [27,9 K], добавлен 07.12.2009Особенности программирования аркадных игр в среде Python. Краткая характеристика языка программирования Python, его особенности и синтаксис. Описание компьютерной игры "Танчики" - правила игры, пояснение ключевых строк кода. Демонстрация работы программы.
курсовая работа [160,3 K], добавлен 03.12.2014