Программа "Охота на лис"
Охота на лис как логическая игра для двух игроков, целью каждого из которых является нахождение всех лис противника. Принципы и основные этапы разработки соответствующей программы с помощью языка программирования Си. Содержание инструкции пользователя.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | курсовая работа |
Язык | русский |
Дата добавления | 18.02.2019 |
Размер файла | 442,0 K |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
Размещено на http://www.allbest.ru/
Размещено на http://www.allbest.ru/
Программа «Охота на лис»
1. Правила игры
Охота на лис - это логическая игра для двух игроков, целью каждого из которых является нахождение всех лис противника.
На поле 8 на 8 располагается определенное количество лис. Игроки должны подстрелить всех лис противника. При каждом выстреле игрок называет клетку поля. При этом другой игрок сообщает, попал ли выстрел в лису, и сколько лис в сумме находится в одном столбце и строке с выстрелом. Выигрывает тот, кто быстрее найдет всех лис.
2. Реализация программного кода с комментариями
Код игры разбит на 4 файла, содержащих различные функции:
– Foxhunting.h - заголовочный файл;
– Main.c - файл с основным кодом;
– Mode.c - файл с функциями для настройки параметров игры;
– Shoting.c - файл с функциями хода для игрока и компьютера.
Файл Foxhunting.h
В данном файле подключаются библиотеки:
– #include <stdio.h> // библиотека ввода-вывода
– #include <time.h> // библиотека, содержащая типы и функции для работы с датой и временем
– #include <math.h> // библиотека, предназначенная для выполнения простых математических операций
– #include <stdlib.h> // библиотека функций общего назначения
– #include <conio.h> //
Объявляются глобальные переменные и функции:
#define foxlimax 32
#define foxlimin 8
extern int GameField_Player1 [8] [8]; // игровое поле 8х8 #1
extern int GameField_Player2 [8] [8]; // игровое поле 8х8 #2
extern char PrintGameField_Player1 [8] [8] [3];
extern char PrintGameField_Player2 [8] [8] [3];
extern int AIField[8] [8]; // спец поле для AI
int totalfox; // число лис
int gamemode; // игровой режим
// 1 - Игрок-Игрок;
// 2 - Игрок-Компьютер
int player; // ходящий игрок
int CountStroke; // Число ходов
int CountStrAi; // Число ходов для Ai
int CountFoxPlayer1; // счет игры для игрока 1
int CountFoxPlayer2; // счет игры для игрока 2
extern void PrintGameField (int stop);
extern int shoting(); // функция стрельбы игрока
extern int shotingAI(); // функция стрельбы AI easy
extern int shotingAIhard(); // функция стрельбы AI hard
extern int ControlInput (int leftlimit, int rightlimit, int r); // Функция безопасного ввода
extern void Gamemode(); // Выбор игрового режима
Листинг 1 - Объявление функций и переменных
Файл Mode.c
Функция для ввода, позволяет вводить 1 и 2-х разрядные числа в программу:
int ControlInput (int leftlimit, int rightlimit, int r)
{
int input;
if (r==1)
{
char Strinput; // получает значения верхнего и
scanf («%s»,&Strinput); // нижнего предела допустимых значений
input=(int) Strinput-48;
} else
{ // для 2-х разрядного числа
char Strinput[2]; // получает значения верхнего и
scanf («%s»,&Strinput); // нижнего предела допустимых значений
input=atoi(Strinput);
}
if (input>=leftlimit && input<=rightlimit)
{
return input;
}
else
{
printf («Некорректный ввод!\n»);
printf («Попробуйте еще раз:\n»);
return ControlInput (leftlimit, rightlimit, r); // В случае недопустимого значения повторный вызов функции
}
}
Листинг 2 - Функция ввода
Функция настройки параметров игры, запрашивает у игрока режим игры и количество лис:
void Gamemode() // Выбор игрового режима
{
printf («Foxhunting\n»);
printf (» - Меню-\n»);
printf («Выберите режим игры:\n»);
printf («1 - Игрок-Игрок\n»);
printf («2 - Игрок-Компьютер\n»);
gamemode=ControlInput (1,2,1); // Выбор режима
printf («Режим игры -»);
if (gamemode==1)
printf («Игрок-Игрок\n»);
else
printf («Игрок-Компьютер\n»);
printf («На 2-х полях 8х8 будут размещены лисы.\n»);
printf («Введите количество лис на поле от 8 до 32:\n»);
totalfox=ControlInput (foxlimin, foxlimax, 2) - 1; // Выбор количества лис
printf («Вы выбрали % i лис.\n», totalfox+1);
#ifdef DEBUG_MAX
printf («DEBUG Число лис для программы - totalfox=%i\n», totalfox);
#endif
Arrangementfox();
}
Листинг 3 - Настройки игры
Функция расстановки лис, которая случайно расставляет лис на поле для каждого игрока:
void Arrangementfox() // Расстановка N лис на игровом поле
{
int i, x, y, count1=totalfox, count2=totalfox;
#ifdef DEBUG_MAX
printf («DEBUG Инициализация координат % i лисы.\n», count);
#endif
while (count1>=0) // поле 1
{
x=rand()%8;
y=rand()%8;
if (GameField_Player1 [x] [y]==0) // проверка совпадения координат лис
{
GameField_Player1 [x] [y]=1; // если лиса жива, то ее ячейка активна
#ifdef DEBUG_MAX
printf («DEBUG поле-1 лис №%i x -%i y -%i\n», count, x, y);
#endif
count1 -;
}
}
while (count2>=0) // поле 2
{
x=rand()%8;
y=rand()%8;
if (GameField_Player2 [x] [y]==0) // проверка совпадения координат лис
{
GameField_Player2 [x] [y]=1; // если лиса жива, то ее ячейка активна
#ifdef DEBUG_MAX
printf («DEBUG поле-2 лис №%i x -%i y -%i\n», count, x, y);
#endif
count2 -;
}
}
}
Листинг 4 - Размещение лис
Функция печати хода, игровых полей для обоих игроков и текущего счета:
void PrintGameField (int stop)
{
if (stop==1) getch();
system («cls»);
HANDLE hConsole = GetStdHandle (STD_OUTPUT_HANDLE);
int i, j;
printf («Ход:%i\n», CountStroke);
printf (» Охотник 1 Охотник 2\n»);
printf («№| 1| 2| 3| 4| 5| 6| 7| 8| №| 1| 2| 3| 4| 5| 6| 7| 8|\n»);
for (i=0; i!=8; i++)
{
printf (» - -\n»);
printf («%i», i+1);
for (j=0; j!=8; j++) // Вывод поля для первого игрока
{
if (GameField_Player1 [i] [j]==2)
{
printf(«|»);
SetConsoleTextAttribute (hConsole, (WORD) ((4 << 4) | 15));
printf («%2s», PrintGameField_Player1 [i] [j]);
SetConsoleTextAttribute (hConsole, (WORD) ((1 << 4) | 10));
}
else if (GameField_Player1 [i] [j]==0 || GameField_Player1 [i] [j]==1)
printf («|%2s», PrintGameField_Player1 [i] [j]);
else
{
printf(«|»);
SetConsoleTextAttribute (hConsole, (WORD) ((14 << 4) | 0));
printf («%2s», PrintGameField_Player1 [i] [j]);
SetConsoleTextAttribute (hConsole, (WORD) ((1 << 4) | 10));
}
}
printf(«|»);
printf («%i», i+1);
for (j=0; j!=8; j++) // Вывод поля для второго игрока или ИИ
{
if (GameField_Player2 [i] [j]==2)
{
printf(«|»);
SetConsoleTextAttribute (hConsole, (WORD) ((4 << 4) | 15));
printf («%2s», PrintGameField_Player2 [i] [j]);
SetConsoleTextAttribute (hConsole, (WORD) ((1 << 4) | 10));
}
else if (GameField_Player2 [i] [j]==0 || GameField_Player2 [i] [j]==1)
printf («|%2s», PrintGameField_Player2 [i] [j]);
else
{
printf(«|»);
SetConsoleTextAttribute (hConsole, (WORD) ((14 << 4) | 0));
printf («%2s», PrintGameField_Player2 [i] [j]);
SetConsoleTextAttribute (hConsole, (WORD) ((1 << 4) | 10));
}
}
#ifdef DEBUG_MAX // вывод поля со значениями для ИИ
printf(«|»);
printf («%i», i+1);
for (j=0; j!=8; j++) printf («|%2i», AIField[j] [i]);
#endif
printf («|\n»);
}
printf (» - -\n»);
printf («Счет:%i:%i \n», CountFoxPlayer1, CountFoxPlayer2); // счет игры
}
Листинг 5 - Функция печати игрового поля
Файл Shoting.c
Функция для перевода целого числа в символ:
void INTTOCHAR (int f, int x, int y)
{
char Symbol[10]= «0123456789»;
int i=f % 10;
if (player==2)
{
if (f<10) PrintGameField_Player1 [x] [y] [0]=Symbol[f];
else
{
PrintGameField_Player1 [x] [y] [0]='1';
PrintGameField_Player1 [x] [y] [1]=Symbol[i];
}
}
else
{
if (f<10) PrintGameField_Player2 [x] [y] [0]=Symbol[f];
else
{
PrintGameField_Player2 [x] [y] [0]='1';
PrintGameField_Player2 [x] [y] [1]=Symbol[i];
}
}
}
Листинг 6 - Функция перевода чисел в символ
Функция, реализующая нахождение лис после выстрела:
void radar (int x, int y) // нахождение лис в перекрестье
{
int foxcount=0, i, j;
if (player==2)
{
for (i=0; i!=8; i++)
{
if (GameField_Player1 [x] [i]==1) foxcount++;
if (GameField_Player1 [i] [y]==1) foxcount++;
}
//PrintGameField_Player1 [x] [y] [0]=INTTOCHAR(foxcount);
INTTOCHAR (foxcount, x, y);
}
else
{
for (i=0; i!=8; i++)
{
if (GameField_Player2 [x] [i]==1) foxcount++;
if (GameField_Player2 [i] [y]==1) foxcount++;
}
//PrintGameField_Player2 [x] [y] [0]=INTTOCHAR (foxcount, player);
INTTOCHAR (foxcount, x, y);
}
printf («В этом столбце и строке»);
if (foxcount==32)
printf («прячутся еще 32 лисы\n»);
else if (foxcount==1)
printf («прячется еще одна лис\n», foxcount);
else if (foxcount==0)
printf («больше не осталось лис\n»);
else
printf («прячутся еще % i лис\n», foxcount);
}
Листинг 7 - Функция поиска лис после выстрела
Функция стрельбы для игрока, которая запрашивает координаты и производит ход:
int shoting() // функция стрельбы игрока
{
int k, x, y;
PrintGameField(1);
printf («Прицеливается охотник % i…\n», player);
printf («Введите две координаты\n»);
printf («Номер строки:»);
x=ControlInput (1,8,1) - 1; // Запрос координат
printf («Номер столбца:»);
y=ControlInput (1,8,1) - 1; // стрельбы
if (player==1)
{
if (GameField_Player2 [x] [y]==0)
{
GameField_Player2 [x] [y]=3;
PrintGameField(0);
printf («Промах!\n»);
radar (x, y);
k=0;
}
else if (GameField_Player2 [x] [y]==1)
{
GameField_Player2 [x] [y]=2;
PrintGameField(0);
printf («Хороший выстрел!\n»);
radar (x, y);
k=1;
}
else if (GameField_Player2 [x] [y]==2 || GameField_Player2 [x] [y]==3)
{
printf («Сюда вы уже стреляли!\n»);
k=shoting();
}
}
else
{
if (GameField_Player1 [x] [y]==0)
{
GameField_Player1 [x] [y]=3;
PrintGameField(0);
printf («Промах!\n»);
radar (x, y);
k=0;
}
else if (GameField_Player1 [x] [y]==1)
{
GameField_Player1 [x] [y]=2;
PrintGameField(0);
printf («Хороший выстрел!\n»);
radar (x, y);
k=1;
}
else if (GameField_Player1 [x] [y]==2 || GameField_Player1 [x] [y]==3)
{
printf («Сюда вы уже стреляли!\n»);
k=shoting();
}
}
return k;
}
Листинг 8 - Функция стрельбы для игрока
Функция проверки ячеек для ИИ:
void CheckField (int x, int y)
{
int i, foxcount=0, cellcount=0;
for (i=0; i!=8; i++)
{
if (GameField_Player1 [x] [i]==0 || GameField_Player1 [x] [i]==1)
cellcount++;
if (GameField_Player1 [i] [y]==0 || GameField_Player1 [x] [i]==1)
cellcount++;
if (GameField_Player1 [x] [i]==1) foxcount++;
if (GameField_Player1 [i] [y]==1) foxcount++;
INTTOCHAR (foxcount, x, y);
}
for (i=0; i!=8; i++)
{
if (foxcount==0)
{
AIField[x] [i]=-1;
AIField[i] [y]=-1;
}
else
{
if (AIField[x] [i]!=-1)
if (AIField[x] [i]==0)
AIField[x] [i]=(foxcount*100)/cellcount;
else
AIField[x] [i]=(AIField[x] [i]+(foxcount*100)/cellcount)/2;
if (AIField[i] [y]!=-1)
if (AIField[i] [y]==0)
AIField[i] [y]=(foxcount*100)/cellcount;
else
AIField[i] [y]=(AIField[i] [y]+(foxcount*100)/cellcount)/2;
}
}
}
Листинг 9 - Функция поиска лис для компьютера
Функция стрельбы для компьютера:
int shotingAIhard() // функция стрельбы AI
{
int k, i, j, x, y;
int MaxCell=0;
if (CountStrAi<8)
{
x=1*CountStrAi;
y=1*CountStrAi;
CountStrAi++;
}
else
{
for (i=0; i<8; i++)
for (j=0; j<8; j++)
{
if (MaxCell<AIField[i] [j])
{
x=i;
y=j;
MaxCell=AIField[i] [j];
}
}
}
if (GameField_Player1 [x] [y]==0 || GameField_Player1 [x] [y]==1) // проверка совпадения координат лис
{
if (GameField_Player1 [x] [y]==1)
{
GameField_Player1 [x] [y]=2;
AIField[x] [y]=-1;
PrintGameField(1);
printf («Охотник 2 стреляет и попадает в лису\n», x, y);
k=1;
}
else
{
GameField_Player1 [x] [y]=3;
AIField[x] [y]=-1;
PrintGameField(1);
printf («Охотник 2 стреляет и промахивается \n», x, y);
k=0;
}
}
else
printf («error»);
CheckField (x, y);
return k;
}
Листинг 10 - Функция стрельбы для компьютера
Файл Main.c
Функция, реализующая смену ходов для игроков, а также подсчитывающая их очки:
void Gameprocess()
{
while (CountFoxPlayer1!=totalfox+1 && CountFoxPlayer2!=totalfox+1)
{
if (player==1)
CountFoxPlayer1+=shoting();
else
{
if (gamemode==1)
CountFoxPlayer2+=shoting();
else
CountFoxPlayer2+=shotingAIhard();
}
if (player==2)
player=1;
else
player=2;
CountStroke++;
}
}
Листинг 11 - Функция игрового процесса
Функция для преобразования поля вывода при завершении игры (раскрывает спрятанных лис):
void END()
{
int i, j;
for (i=0; i<8; i++)
{
for (j=0; j<8; j++) // проявление результирующего поля
{
if (GameField_Player1 [i] [j]==1)
{
PrintGameField_Player1 [i] [j] [0]=' ';
PrintGameField_Player1 [i] [j] [1]='!';
}
else if (GameField_Player1 [i] [j]==2)
{
PrintGameField_Player1 [i] [j] [0]=' ';
PrintGameField_Player1 [i] [j] [1]='X';
}
if (GameField_Player2 [i] [j]==1)
{
PrintGameField_Player2 [i] [j] [0]=' ';
PrintGameField_Player2 [i] [j] [1]='!';
}
else if (GameField_Player2 [i] [j]==2)
{
PrintGameField_Player2 [i] [j] [0]=' ';
PrintGameField_Player2 [i] [j] [1]='X';
}
}
}
}
Листинг 12 - Функция преобразования поля
После описания всех функций приведена главная часть программы, в которой в соответствующих местах кода вызываются описанные ранее функции.
int main()
{
int i=1, j, k;
system («color 1A»);
system («cls»);
srand (time(NULL));
for (j=0; j<8; j++)
for (k=0; k<8; k++)
{
GameField_Player1 [j] [k]=0;
GameField_Player2 [j] [k]=0;
AIField[j] [k]=0;
PrintGameField_Player1 [j] [k] [0]='*';
PrintGameField_Player2 [j] [k] [0]='*';
PrintGameField_Player1 [j] [k] [1]=' ';
PrintGameField_Player2 [j] [k] [1]=' ';
}
Gamemode();
int CountStrAi=0; // Номер хода AI
CountFoxPlayer1=0;
CountFoxPlayer2=0;
CountStroke=0;
player=1;
PrintGameField(1);
printf («Охота началась!\n»);
printf («Жми \n»);
Gameprocess();
END();
PrintGameField(1);
printf («-\n»);
if (CountFoxPlayer1==totalfox+1)
printf («Охотник 1 победил!\n»);
else
printf («Охотник 2 победил!\n»);
printf («Отличная охота!\n»);
printf («-\n»);
printf («Для выхода нажмите любую клавишу… \n»);
getch();
system («cls»);
}
Листинг 13 - Главная часть программы
3. Инструкция пользователя
Игра начинается таким образом: игроку предлагают выбрать режим игры и ввести количество лис.
Рисунок 1. Выбор режима
После того как игрок ввел все параметры начинается процесс игры. Первый ход совершает игрок. На экране появляются игровые поля и предложение ввести координаты предполагаемого места нахождения лисы противника.
Рисунок 2. Ввод координат
Далее на экране ячейка с данными координатами закрашивается в красный (попадание) или желтый (промах) цвет, появляется сообщение о том, попал игрок в лису или промахнулся, следом за которым сообщается количество лис в одной строке и одном столбце с выстрелом.
Рисунок 3. Отображение выстрелов на поле
При последующем ходе число лис в столбце и строке сохраняется на поле в ячейке.
Рисунок 4. Отображение выстрелов на поле(2)
Игра продолжается до тех пор, пока кто-то из игроков не найдет всех лис противника. В этом случае на полях открываются ненайденные лисы, а на экране отображается соответствующее сообщение об окончании игры.
Рисунок 5. Конец игры
Заключение
игра программа пользователь
Во время выполнения курсовой работы были изучены принципы программирования на языке Си, были освоены основные концепции и стратегии по созданию консольного приложения «Охота на лис», которое является результатом выполнения курсовой работы.
Библиографический список
1. Керниган Б. Язык программирования Си 2-е издание / Б. Керниган Д. Ричи М.: Издательский дом «Вильямс», 2012. 272 с.
2. Википедия. Свободная энциклопедия [Электронный ресурс] / Режим доступа: https://ru.wikipedia.org/wiki/Охота_на_лис_(логическая_игра)
3. Википедия. Свободная энциклопедия [Электронный ресурс] / Режим доступа: https://ru.wikipedia.org/wiki/Си_(язык_программирования)
Приложение
Код программы
Файл Foxhunting.h
#include <stdio.h>
#include <math.h>
#include <conio.h>
#include <stdlib.h>
#include <time.h>
#include <Windows.h>
#define foxlimax 32
#define foxlimin 8
extern int GameField_Player1 [8] [8]; // игровое поле 8х8 #1
extern int GameField_Player2 [8] [8]; // игровое поле 8х8 #2
extern char PrintGameField_Player1 [8] [8] [3];
extern char PrintGameField_Player2 [8] [8] [3];
extern int AIField[8] [8]; // спец поле для AI
int totalfox; // число лис
int gamemode; // игровой режим
// 1 - Игрок-Игрок;
// 2 - Игрок-Компьютер
int player; // ходящий игрок
int CountStroke; // Число ходов
int CountStrAi; // Число ходов для Ai
int CountFoxPlayer1; // счет игры для игрока 1
int CountFoxPlayer2; // счет игры для игрока 2
extern void PrintGameField (int stop);
extern int shoting(); // функция стрельбы игрока
extern int shotingAI(); // функция стрельбы AI easy
extern int shotingAIhard(); // функция стрельбы AI hard
extern int ControlInput (int leftlimit, int rightlimit, int r); // Функция безопасного ввода
extern void Gamemode(); // Выбор игрового режима
Файл Main.c
#include «Foxhunting.h»
// r=1+rand()%8; - ГСЧ от 1 до 8
int GameField_Player1 [8] [8];
int GameField_Player2 [8] [8];
Листинг А.1, лист 1
int AIField[8] [8]; // спец поле для AI
char PrintGameField_Player1 [8] [8] [3];
char PrintGameField_Player2 [8] [8] [3];
void Gameprocess()
{
while (CountFoxPlayer1!=totalfox+1 && CountFoxPlayer2!=totalfox+1)
{
if (player==1)
CountFoxPlayer1+=shoting();
else
{
if (gamemode==1)
CountFoxPlayer2+=shoting();
else
CountFoxPlayer2+=shotingAIhard();
}
if (player==2)
player=1;
else
player=2;
CountStroke++;
}
}
void END()
{
int i, j;
for (i=0; i<8; i++)
{
for (j=0; j<8; j++) // проявление результирующего поля
{
if (GameField_Player1 [i] [j]==1)
{
PrintGameField_Player1 [i] [j] [0]=' ';
PrintGameField_Player1 [i] [j] [1]='!';
}
else if (GameField_Player1 [i] [j]==2)
{
Листинг А.1, лист 2
PrintGameField_Player1 [i] [j] [0]=' ';
PrintGameField_Player1 [i] [j] [1]='X';
}
if (GameField_Player2 [i] [j]==1)
{
PrintGameField_Player2 [i] [j] [0]=' ';
PrintGameField_Player2 [i] [j] [1]='!';
}
else if (GameField_Player2 [i] [j]==2)
{
PrintGameField_Player2 [i] [j] [0]=' ';
PrintGameField_Player2 [i] [j] [1]='X';
}
}
}
}
int main()
{
int i=1, j, k;
system («color 1A»);
system («cls»);
srand (time(NULL));
for (j=0; j<8; j++)
for (k=0; k<8; k++)
{
GameField_Player1 [j] [k]=0;
GameField_Player2 [j] [k]=0;
AIField[j] [k]=0;
PrintGameField_Player1 [j] [k] [0]='*';
PrintGameField_Player2 [j] [k] [0]='*';
PrintGameField_Player1 [j] [k] [1]=' ';
PrintGameField_Player2 [j] [k] [1]=' ';
}
Gamemode();
int CountStrAi=0; // Номер хода AI
CountFoxPlayer1=0;
CountFoxPlayer2=0;
CountStroke=0;
Листинг А.1, лист 3
player=1;
PrintGameField(1);
printf («Охота началась!\n»);
printf («Жми \n»);
Gameprocess();
END();
PrintGameField(1);
printf («-\n»);
if (CountFoxPlayer1==totalfox+1)
printf («Охотник 1 победил!\n»);
else
printf («Охотник 2 победил!\n»);
printf («Отличная охота!\n»);
printf («-\n»);
printf («Для выхода нажмите любую клавишу… \n»);
getch();
system («cls»);
}
Файл Shoting.c
#include «Foxhunting.h»
void INTTOCHAR (int f, int x, int y) // Победа-победа вместо обеда!
{
char Symbol[10]= «0123456789»;
int i=f % 10;
if (player==2)
{
if (f<10) PrintGameField_Player1 [x] [y] [0]=Symbol[f];
else
{
PrintGameField_Player1 [x] [y] [0]='1';
PrintGameField_Player1 [x] [y] [1]=Symbol[i];
}
}
else
{
if (f<10) PrintGameField_Player2 [x] [y] [0]=Symbol[f];
else
{
PrintGameField_Player2 [x] [y] [0]='1';
Листинг А.1, лист 5
PrintGameField_Player2 [x] [y] [1]=Symbol[i];
}
}
}
void radar (int x, int y) // нахождение лис в перекрестье
{
int foxcount=0, i, j;
if (player==2)
{
for (i=0; i!=8; i++)
{
if (GameField_Player1 [x] [i]==1) foxcount++;
if (GameField_Player1 [i] [y]==1) foxcount++;
}
//PrintGameField_Player1 [x] [y] [0]=INTTOCHAR(foxcount);
INTTOCHAR (foxcount, x, y);
}
else
{
for (i=0; i!=8; i++)
{
if (GameField_Player2 [x] [i]==1) foxcount++;
if (GameField_Player2 [i] [y]==1) foxcount++;
}
//PrintGameField_Player2 [x] [y] [0]=INTTOCHAR (foxcount, player);
INTTOCHAR (foxcount, x, y);
}
printf («В этом столбце и строке»);
if (foxcount==32)
printf («прячутся еще 32 лисы\n»);
else if (foxcount==1)
printf («прячется еще одна лис\n», foxcount);
else if (foxcount==0)
printf («больше не осталось лис\n»);
else
printf («прячутся еще % i лис\n», foxcount);
}
int shoting() // функция стрельбы игрока
Листинг А.1, лист 6
{
int k, x, y;
PrintGameField(1);
printf («Прицеливается охотник % i…\n», player);
printf («Введите две координаты\n»);
printf («Номер строки:»);
x=ControlInput (1,8,1) - 1; // Запрос координат
printf («Номер столбца:»);
y=ControlInput (1,8,1) - 1; // стрельбы
if (player==1)
{
if (GameField_Player2 [x] [y]==0)
{
GameField_Player2 [x] [y]=3;
PrintGameField(0);
printf («Промах!\n»);
radar (x, y);
k=0;
}
else if (GameField_Player2 [x] [y]==1)
{
GameField_Player2 [x] [y]=2;
PrintGameField(0);
printf («Хороший выстрел!\n»);
radar (x, y);
k=1;
}
else if (GameField_Player2 [x] [y]==2 || GameField_Player2 [x] [y]==3)
{
printf («Сюда вы уже стреляли!\n»);
k=shoting();
}
}
else
{
if (GameField_Player1 [x] [y]==0)
{
GameField_Player1 [x] [y]=3;
PrintGameField(0);
printf («Промах!\n»);
radar (x, y);
Листинг А.1, лист 7
k=0;
}
else if (GameField_Player1 [x] [y]==1)
{
GameField_Player1 [x] [y]=2;
PrintGameField(0);
printf («Хороший выстрел!\n»);
radar (x, y);
k=1;
}
else if (GameField_Player1 [x] [y]==2 || GameField_Player1 [x] [y]==3)
{
printf («Сюда вы уже стреляли!\n»);
k=shoting();
}
}
return k;
}
void CheckField (int x, int y)
{
int i, foxcount=0, cellcount=0;
for (i=0; i!=8; i++)
{
if (GameField_Player1 [x] [i]==0 || GameField_Player1 [x] [i]==1) cellcount++;
if (GameField_Player1 [i] [y]==0 || GameField_Player1 [x] [i]==1) cellcount++;
if (GameField_Player1 [x] [i]==1) foxcount++;
if (GameField_Player1 [i] [y]==1) foxcount++;
INTTOCHAR (foxcount, x, y);
}
for (i=0; i!=8; i++)
{
if (foxcount==0)
{
AIField[x] [i]=-1;
AIField[i] [y]=-1;
}
else
{
Листинг А.1, лист 8
if (AIField[x] [i]!=-1)
if (AIField[x] [i]==0)
AIField[x] [i]=(foxcount*100)/cellcount;
else
AIField[x] [i]=(AIField[x] [i]+(foxcount*100)/cellcount)/2;
if (AIField[i] [y]!=-1)
if (AIField[i] [y]==0)
AIField[i] [y]=(foxcount*100)/cellcount;
else
AIField[i] [y]=(AIField[i] [y]+(foxcount*100)/cellcount)/2;
}
}
}
int shotingAIhard() // функция стрельбы AI-Hard
{
int k, i, j, x, y;
int MaxCell=0;
if (CountStrAi<8)
{
x=1*CountStrAi;
y=1*CountStrAi;
CountStrAi++;
}
else
{
for (i=0; i<8; i++)
for (j=0; j<8; j++)
{
if (MaxCell<AIField[i] [j])
{
x=i;
y=j;
MaxCell=AIField[i] [j];
}
}
}
if (GameField_Player1 [x] [y]==0 || GameField_Player1 [x] [y]==1) // проверка совпадения координат лис
{
Листинг А.1, лист 9
if (GameField_Player1 [x] [y]==1)
{
GameField_Player1 [x] [y]=2;
AIField[x] [y]=-1;
PrintGameField(1);
printf («Охотник 2 стреляет и попадает в лису\n», x, y);
k=1;
}
else
{
GameField_Player1 [x] [y]=3;
AIField[x] [y]=-1;
PrintGameField(1);
printf («Охотник 2 стреляет и промахивается \n», x, y);
k=0;
}
}
else
printf («error»);
CheckField (x, y);
return k;
}
Файл Mode.c
#include «Foxhunting.h»
int ControlInput (int leftlimit, int rightlimit, int r) // Функция безопасного ввода r-разряд вводимого числа
{ // leftlimit-начальный предел rightlimit - конечный предел
int input;
if (r==1)
{
char Strinput; // получает значения верхнего и
scanf («%s»,&Strinput); // нижнего предела допустимых значений
input=(int) Strinput-48;
}
else
{ // для 2-х разрядного числа
Листинг А.1, лист 10
char Strinput[2]; // получает значения верхнего и
scanf («%s»,&Strinput); // нижнего предела допустимых значений
input=atoi(Strinput);
}
if (input>=leftlimit && input<=rightlimit)
{
return input;
}
else
{
printf («Некорректный ввод!\n»);
printf («Попробуйте еще раз:\n»);
return ControlInput (leftlimit, rightlimit, r); // В случае недопустимого значения повторный вызов функции
}
}
void Arrangementfox() // Расстановка N лис на игровом поле
{
int i, x, y, count1=totalfox, count2=totalfox;
#ifdef DEBUG_MAX
printf («DEBUG Инициализация координат % i лисы.\n», count);
#endif
while (count1>=0) // поле 1
{
x=rand()%8;
y=rand()%8;
if (GameField_Player1 [x] [y]==0) // проверка совпадения координат лис
{
GameField_Player1 [x] [y]=1; // если лиса жива, то ее ячейка активна
#ifdef DEBUG_MAX
printf («DEBUG поле-1 лис №%i x -%i y -%i\n», count, x, y);
#endif
count1 -;
}
}
while (count2>=0) // поле 2
{
Листинг А.1, лист 11
x=rand()%8;
y=rand()%8;
if (GameField_Player2 [x] [y]==0) // проверка совпадения координат лис
{
GameField_Player2 [x] [y]=1; // если лиса жива, то ее ячейка активна
#ifdef DEBUG_MAX
printf («DEBUG поле-2 лис №%i x -%i y -%i\n», count, x, y);
#endif
count2 -;
}
}
}
void Gamemode() // Выбор игрового режима
{
printf («Foxhunting \n»);
printf (» - Меню-\n»);
printf («Выберите режим игры:\n»);
printf («1 - Игрок-Игрок\n»);
printf («2 - Игрок-Компьютер\n»);
gamemode=ControlInput (1,2,1); // Выбор режима
printf («Режим игры -»);
if (gamemode==1)
printf («Игрок-Игрок\n»);
else
printf («Игрок-Компьютер\n»);
printf («На 2-х полях 8х8 будут размещены лисы.\n»);
printf («Введите количество лис на поле от 8 до 32:\n»);
totalfox=ControlInput (foxlimin, foxlimax, 2) - 1; // Выбор количества лис
printf («Вы выбрали % i лис.\n», totalfox+1);
#ifdef DEBUG_MAX
printf («DEBUG Число лис для программы - totalfox=%i\n», totalfox);
#endif
Arrangementfox();
}
void PrintGameField (int stop)
{
if (stop==1) getch();
Листинг А.1, лист 12
system («cls»);
HANDLE hConsole = GetStdHandle (STD_OUTPUT_HANDLE);
int i, j;
printf («Ход:%i\n», CountStroke);
printf (» Охотник 1 Охотник 2\n»);
printf («№| 1| 2| 3| 4| 5| 6| 7| 8| №| 1| 2| 3| 4| 5| 6| 7| 8|\n»);
for (i=0; i!=8; i++)
{
printf (» - -\n»);
printf («%i», i+1);
for (j=0; j!=8; j++) // Вывод поля для первого игрока
{
if (GameField_Player1 [i] [j]==2)
{
printf(«|»);
SetConsoleTextAttribute (hConsole, (WORD) ((4 << 4) | 15));
printf («%2s», PrintGameField_Player1 [i] [j]);
SetConsoleTextAttribute (hConsole, (WORD) ((1 << 4) | 10));
}
йelse if (GameField_Player1 [i] [j]==0 || GameField_Player1 [i] [j]==1)
printf («|%2s», PrintGameField_Player1 [i] [j]);
else
{
printf(«|»);
SetConsoleTextAttribute (hConsole, (WORD) ((14 << 4) | 0));
printf («%2s», PrintGameField_Player1 [i] [j]);
SetConsoleTextAttribute (hConsole, (WORD) ((1 << 4) | 10));
}
}
printf(«|»);
printf («%i», i+1);
for (j=0; j!=8; j++) // Вывод поля для второго игрока или ИИ
{
if (GameField_Player2 [i] [j]==2)
{
printf(«|»);
SetConsoleTextAttribute (hConsole, (WORD) ((4 << 4) | 15));
printf («%2s», PrintGameField_Player2 [i] [j]);
SetConsoleTextAttribute (hConsole, (WORD) ((1 << 4) | 10));
}
else if (GameField_Player2 [i] [j]==0 || GameField_Player2 [i] [j]==1)
printf («|%2s», PrintGameField_Player2 [i] [j]);
else
Листинг А.1, лист 13
{
printf(«|»);
SetConsoleTextAttribute (hConsole, (WORD) ((14 << 4) | 0));
printf («%2s», PrintGameField_Player2 [i] [j]);
SetConsoleTextAttribute (hConsole, (WORD) ((1 << 4) | 10));
}
}
#ifdef DEBUG_MAX // вывод поля со значениями для ИИ
printf(«|»);
printf («%i», i+1);
for (j=0; j!=8; j++) printf («|%2i», AIField[j] [i]);
#endif
printf («|\n»);
}
printf (» - -\n»);
printf («Счет:%i:%i \n», CountFoxPlayer1, CountFoxPlayer2); // счет игры
}
Листинг А.1, лист 14
Размещено на Allbest.ru
...Подобные документы
Порядок описание процесса разработки модели для разрешения задачи программирования с помощью средств языка программирования. Структуры данных и основные принципы их построения. Этапы компьютерного моделирования. Этапы и значение написания программы.
курсовая работа [19,5 K], добавлен 19.05.2011Методика и основные этапы нахождения интеграла функции sin (x+10)+x4=0 с помощью двух подходов: метод прямоугольников и метод трапеций. Составление соответствующей программы в среде Pascal. Оценка возможностей пользователя при решении данного задания.
лабораторная работа [134,0 K], добавлен 24.09.2010Обоснование необходимости разработки программы для игры "Тетрис". Математическая и графическая части алгоритма. Выбор языка и среды программирования. Отладка текста программы, разработка интерфейса пользователя. Тестирование, руководство пользователя.
курсовая работа [1,5 M], добавлен 17.01.2011Создание компьютерной игры посредством среды программирования Delphi. Инструменты разработки, компоненты и методы для разработки программы. Логическая и физическая структуры, основные функции и элементы управления программы, ее тестирование и отладка.
курсовая работа [27,9 K], добавлен 26.07.2014Разработка игры "Угадай персонажа", ее суть и содержание. Запоминание новых персонажей и вопросов, коррекция базы данных. Использование языка программирования С++ и среды разработки Microsoft Visual Studio 2010. Алгоритмы и методы, структура программы.
курсовая работа [571,9 K], добавлен 14.07.2012Создание программы, реализующей игру "Линии". Среда разработки программы, описание ее общего вида. Основные алгоритмы программы. Реализация программы в среде разработки Microsoft Visual Studio 2008 на языке объектно-ориентированного программирования С++.
курсовая работа [639,0 K], добавлен 16.03.2012Выбор языка программирования и его обоснование. Определение системных требований. Схема алгоритма и программа на языке Qbasic. Разработка руководства пользователя. Способы конструирования программ. Особенности и принципы динамического программирования.
курсовая работа [398,8 K], добавлен 21.01.2014Методика и основные этапы разработки стратегической игры, ее элементы и принцип работы программы. Порядок построения информационной модели. Диаграмма потоков данных и действий. Выбор языка программирования и его обоснование. Критерии качества среды.
курсовая работа [3,5 M], добавлен 11.12.2012Особенности разработки приложений для операционной системы с помощью императивного, структурированного, объектно-ориентированного языка программирования Delphi. Формальное начало программы. Выделение конца программного блока. Листинг и описание программы.
курсовая работа [1,2 M], добавлен 04.08.2014Порядок и основные этапы разработки логической игры, основанной на конкретной математической раскладке. Существенные проблемы выбора и пути их разрешения. Метод восходящего проектирования: сущность, принципы и особенности. Функциональный цикл программы.
курсовая работа [112,1 K], добавлен 04.12.2011Изучение текстового режима языка программирования Turbo Pascal. Написание игры "Змейка" с помощью средств, процедур и функций языка программирование Turbo Pascal. Структурное и функциональное описание разработки. Листинг и общие примеры работы программы.
контрольная работа [286,3 K], добавлен 10.04.2011Характеристика основных принципов объектно-ориентированного программирования. Этапы разработки программы на языке C++, реализующей игру "Морской бой". Выбор языка программирования. Характеристика необходимых классов, наследований, виртуальных методов.
курсовая работа [657,6 K], добавлен 17.06.2012Целесообразность выбора языка программирования. Основные структуры языка программирования. Кодирование по методу четности/нечетности, по методу Хэмминга. Машина Поста. Инструкция программиста и пользователя. Использование программы StudyProgram.
курсовая работа [294,7 K], добавлен 27.02.2009Разработка программы, решающей базовую задачу линейного программирования симплекс-методом с помощью симплекс-таблиц. Выбор языка программирования и среды разработки, программные модули и их взаимодействие между собой. Листинг разработанной программы.
курсовая работа [415,8 K], добавлен 08.09.2013Особенности объектно-ориентированного программирования. Основные возможности языка программирования Java, классификация платформ. Создание программы, обеспечивающей вычисление арифметических выражений. Руководство пользователя и характеристика функций.
курсовая работа [1,2 M], добавлен 07.07.2012Сущность и особенности языка программирования Си. Основные этапы алгоритма решения системы линейных алгебраических уравнений методом Гаусса, реализация программы для их расчета. Инструкции пользователя и программиста. Тестирование функции решения.
курсовая работа [153,9 K], добавлен 18.02.2013Обоснование языка программирования Object Pascal и среды разработки Delphi. Создание интерфейса пользователя. Проектирование структуры и описание компонентов, использованных при разработке программного продукта. Составление инструкции пользователя.
курсовая работа [888,7 K], добавлен 20.05.2015Общая характеристика языка программирования С++, его функции и возможности. Создание базы данных "Учет фототехники" для работников магазина. Этапы разработки алгоритма, спецификация, кодирование, отладка и тестирование программы. Руководство пользователя.
курсовая работа [3,2 M], добавлен 15.07.2012Программирование нестандартных функций, задач оптимизации, дифференциального уравнения и аппроксимации с помощью языка Паскаль. Алгоритм и программа операций над матрицами. Нахождение значения корней нелинейного уравнения по методу половинного деления.
курсовая работа [1,1 M], добавлен 12.08.2011Разработка программы проверки знаний для тестирования студентов по программированию с кодом на языке Delphi. Проектирование визуального интерфейса и словесный алгоритм работы программы. Алгоритмы разработанных процедур и функций, инструкция пользователя.
курсовая работа [506,5 K], добавлен 21.02.2011