Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <locale.h>
- #include <Windows.h>
- #include <time.h>
- #define MAX_MESSAGES 10
- #define MAX_SYMBOLS_IN_MESSAGE 128
- #define MAX_SYMBOLS_IN_EXT_STRING 70
- #define SIZE_OF_MAP_Y 6
- #define SIZE_OF_MAP_X 10
- #define COUNT_OF_PLAYERS_SHIPS 10
- #define COUNT_OF_ENEMY_SHIPS 10
- #define FREE_SYMBOL ' '
- #define USED_BOX_SYMBOL '#'
- #define USER_SHIP_SYMBOL '*'
- #define ENEMY_SHIP_SYMBOL '@'
- #define DESTROYED_ENEMY_SHIP_SYMBOL '!'
- #define DESTROYED_USER_SHIP_SYMBOL '&'
- void print_table(char const table[SIZE_OF_MAP_Y][SIZE_OF_MAP_X]);
- void add_message(char msg[MAX_SYMBOLS_IN_MESSAGE]);
- void print_message();
- void user_step(char table[SIZE_OF_MAP_Y][SIZE_OF_MAP_X], char enemy_ships[SIZE_OF_MAP_Y][SIZE_OF_MAP_X], int *es_counter, int *the_end);
- void enemy_step(char table[SIZE_OF_MAP_Y][SIZE_OF_MAP_X], char enemy_ships[SIZE_OF_MAP_Y][SIZE_OF_MAP_X], int *us_counter, int *the_end);
- char messages[MAX_MESSAGES][MAX_SYMBOLS_IN_MESSAGE];
- int messages_counter = 0;
- int copy_of_counter_messages;
- int include_end_of_string = 1;
- int pos_of_uk = 0;
- int es_counter = COUNT_OF_ENEMY_SHIPS;
- int us_counter = COUNT_OF_PLAYERS_SHIPS;
- int main() {
- setlocale(LC_ALL, "Russian");
- SetConsoleCP(1251);
- SetConsoleOutputCP(1251);
- srand(time(NULL));
- char table[SIZE_OF_MAP_Y][SIZE_OF_MAP_X]; //игровое поле
- char enemy_ships[SIZE_OF_MAP_Y][SIZE_OF_MAP_X]; //позиции кораблей компьютера
- int the_end = 0;
- for (int i = 0; i < SIZE_OF_MAP_Y; ++i) { //очищаем игровое поле, заполняем определенным символом
- for (int k = 0; k < SIZE_OF_MAP_X; ++k)
- table[i][k] = FREE_SYMBOL;
- }
- for (int i = 0; i < SIZE_OF_MAP_Y; ++i) { //очищаем позиции кораблей компьютера
- for (int k = 0; k < SIZE_OF_MAP_X; ++k)
- enemy_ships[i][k] = FREE_SYMBOL;
- }
- int t1, t2;
- for (int i = 0; i < COUNT_OF_PLAYERS_SHIPS; ++i) { //задаем позиции кораблей юзера
- t1 = (rand() % SIZE_OF_MAP_Y);
- t2 = (rand() % SIZE_OF_MAP_X);
- if (table[t1][t2] == FREE_SYMBOL)
- table[t1][t2] = USER_SHIP_SYMBOL;
- else
- --i;
- }
- for (int i = 0; i < COUNT_OF_ENEMY_SHIPS; ++i) { //задаем позиции кораблей компьютера
- t1 = (rand() % SIZE_OF_MAP_Y);
- t2 = (rand() % SIZE_OF_MAP_X);
- if (enemy_ships[t1][t2] == FREE_SYMBOL && table[t1][t2] == FREE_SYMBOL) {
- enemy_ships[t1][t2] = ENEMY_SHIP_SYMBOL;
- //table[t1][t2] = ENEMY_SHIP_SYMBOL;
- }
- else
- --i;
- }
- for (int i = 0; i < MAX_MESSAGES; ++i) { //очищаем массив сообщений
- for (int k = 0; k < MAX_SYMBOLS_IN_MESSAGE; ++k) {
- messages[i][k] = ' ';
- }
- }
- print_table(table); //первоначально отрисовываем поле
- //HANDLE hStdHnd = GetStdHandle(STD_OUTPUT_HANDLE);
- //CONSOLE_SCREEN_BUFFER_INFO buff;
- //GetConsoleScreenBufferInfo(hStdHnd,&buff);
- //printf("x: %d y: %d\n",buff.srWindow.Right,buff.srWindow.Bottom);
- //printf("%s\n", "lol"+"lol");
- while (!the_end) { //главный игровой цикл
- user_step(table, enemy_ships, &es_counter, &the_end);
- if(!the_end)
- enemy_step(table, enemy_ships, &us_counter, &the_end);
- }
- printf("Игра закончена!\n");
- //запилить авто расчет ширины доп строки!
- system("pause");
- return 0;
- }
- void print_message() {
- //for (int i = (messages_counter - 1); i >= 0; --i)
- //printf("%s\n", messages[i]);
- int kostyl;
- putchar(' ');
- putchar(' ');
- putchar(' ');
- if ((copy_of_counter_messages - 1) >= 0) {
- if (strlen(messages[copy_of_counter_messages - 1]) < (MAX_SYMBOLS_IN_EXT_STRING)) {
- printf("%s", messages[copy_of_counter_messages - 1], (copy_of_counter_messages - 1));
- --copy_of_counter_messages;
- }
- else {
- kostyl = pos_of_uk + (MAX_SYMBOLS_IN_EXT_STRING - 1);
- for (int i = pos_of_uk; i <= kostyl && i <= strlen(messages[copy_of_counter_messages - 1]); ++i) {
- pos_of_uk = i;
- putchar(messages[copy_of_counter_messages - 1][pos_of_uk]);
- if (messages[copy_of_counter_messages - 1][pos_of_uk] == '\0' || messages[copy_of_counter_messages - 1][pos_of_uk + 1] == '\0') {
- pos_of_uk = 0;
- --copy_of_counter_messages;
- //printf("> (POK)");
- break;
- }
- }
- if (pos_of_uk != 0)
- ++pos_of_uk;
- if (messages[copy_of_counter_messages - 1][pos_of_uk] == ' ')
- ++pos_of_uk;
- }
- }
- }
- void static add_message(char msg[MAX_SYMBOLS_IN_MESSAGE]) {
- if (messages_counter < MAX_MESSAGES) {
- for (int i = 0; i <= strlen(msg); ++i) {//записываем новое сообщение
- messages[messages_counter][i] = msg[i];
- }
- ++messages_counter;
- }
- else {
- for (int i = 0; i < (MAX_MESSAGES - 1); ++i) { //переносим значения на единицу раньше
- for (int k = 0; k <= strlen(messages[i + 1]); ++k)
- messages[i][k] = messages[i + 1][k];
- }
- for (int k = 0; k < MAX_SYMBOLS_IN_MESSAGE; ++k) //очищаем последний (самый новый элемент)
- messages[MAX_MESSAGES - 1][k] = ' ';
- for (int i = 0; i <= strlen(msg); ++i) { //записываем новое сообщение
- messages[messages_counter - 1][i] = msg[i];
- }
- }
- }
- void user_step(char table[SIZE_OF_MAP_Y][SIZE_OF_MAP_X], char enemy_ships[SIZE_OF_MAP_Y][SIZE_OF_MAP_X], int *enemy_ships_counter, int *the_end) {
- char y, x; //временные координаты
- int end = 0; //координаты введены, действия выполнены, все отлично
- while (!end) { //пока не будет корректный выбор квадрата для атаки
- printf("\n\nВведите координаты буквами в формате (xy) -> ");
- scanf_s("%c%c", &x, 1, &y, 1);
- fseek(stdin, 0, SEEK_SET);
- if ((x >= 'a' && x <= 'z') && (y >= 'a' && y <= 'z')) { //проверяем вводимые символы на то, что они - символы
- y -= 'a'; //переводим буквенные координаты в цифры
- x -= 'a';
- if ((x >= 0 && x < SIZE_OF_MAP_X) && (y >= 0 && y < SIZE_OF_MAP_Y)) { //проверяем допустимость вводимых координат, что они не вне поля
- if (table[y][x] != USED_BOX_SYMBOL && table[y][x] != USER_SHIP_SYMBOL && table[y][x] != DESTROYED_ENEMY_SHIP_SYMBOL && table[y][x] != DESTROYED_USER_SHIP_SYMBOL) { //проверяем корректность выбранного для атаки квадрата
- end = 1;
- if (enemy_ships[y][x] == ENEMY_SHIP_SYMBOL) { //если попадаем во вражеский корабль
- *enemy_ships_counter -= 1;
- enemy_ships[y][x] = FREE_SYMBOL;
- table[y][x] = DESTROYED_ENEMY_SHIP_SYMBOL;
- add_message("Вы подбили корабль компьютера!");
- if (*enemy_ships_counter == 0) {
- //printf("Вы победили!\n");
- add_message("Вы победили!");
- *the_end = 1;
- }
- print_table(table);
- }
- else { //если мимо вражеского корабля
- table[y][x] = USED_BOX_SYMBOL;
- //printf("Мимо!\n");
- add_message("Мимо!");
- print_table(table);
- }
- }
- else {
- switch(table[y][x]) { //обрабатываем битье по некорректным квадратам
- case USED_BOX_SYMBOL :
- add_message("Ошибка! В этот квадрат уже били, там нет ничего интересного!");
- break;
- case USER_SHIP_SYMBOL :
- add_message("Ошибка! Бить по своим кораблям неэтично!");
- break;
- case DESTROYED_ENEMY_SHIP_SYMBOL :
- add_message("Ошибка! Оно уже сдохло!");
- break;
- case DESTROYED_USER_SHIP_SYMBOL :
- add_message("Ошибка! Этим лучше своему подбитому кораблю Вы не сделаете!");
- break;
- default :
- break;
- }
- print_table(table);
- }
- }
- else {
- add_message("Ошибка! Введенные Вами координаты выходят за пределы поля!");
- print_table(table);
- }
- }
- else {
- add_message("Ошибка! Введенные Вами координаты не являются символами разметки!");
- print_table(table);
- }
- }
- }
- void enemy_step(char table[SIZE_OF_MAP_Y][SIZE_OF_MAP_X], char enemy_ships[SIZE_OF_MAP_Y][SIZE_OF_MAP_X], int *user_ships_counter, int *the_end) {
- int y, x; //временные координаты
- int end = 0; //координаты введены, действия выполнены, все отлично
- while (!end) { //пока не будет корректный выбор квадрата для атаки
- y = (rand() % SIZE_OF_MAP_Y); //генерируем наугад квадрат для атаки
- x = (rand() % SIZE_OF_MAP_X);
- if (enemy_ships[y][x] == FREE_SYMBOL && table[y][x] != USED_BOX_SYMBOL && table[y][x] != DESTROYED_USER_SHIP_SYMBOL && table[y][x] != DESTROYED_ENEMY_SHIP_SYMBOL) { //проверяем допустимость атаки по квадрату
- end = 1;
- //print_table(table);
- if (table[y][x] == USER_SHIP_SYMBOL) { //если попадаем в корабль игрока
- *user_ships_counter -= 1;
- table[y][x] = DESTROYED_USER_SHIP_SYMBOL;
- add_message("Компьютер подбил ваш корабль!");
- if (*user_ships_counter == 0) {
- //printf("Компьютер победил!\n");
- add_message("Компьютер победил!");
- *the_end = 1;
- }
- print_table(table);
- }
- else {
- table[y][x] = USED_BOX_SYMBOL;
- //printf("Компьютер бьет мимо Ваших кораблей!\n");
- add_message("Компьютер бьет мимо Ваших кораблей!");
- print_table(table);
- }
- }
- }
- }
- void print_table(char const table[SIZE_OF_MAP_Y][SIZE_OF_MAP_X]) { //печатает игровое поле
- copy_of_counter_messages = messages_counter;
- pos_of_uk = 0; //костыль
- system("cls");
- printf("У Вас - %d кораблей, у Вашего противника - %d\n\n", us_counter, es_counter);
- putchar(' ');
- putchar(' ');
- for (int i = 0; i < SIZE_OF_MAP_X; ++i) //выводим горизонтальный ряд разметки с обозначениями
- printf("%2c", i + 'a');
- putchar('\n');
- for (int i = 0; i < SIZE_OF_MAP_Y; ++i) { //выводим все-все-все по строкам
- putchar(' ');
- putchar(' ');
- for (int k = 0; k < SIZE_OF_MAP_X * 2 + 1; ++k) //выводим горизонтальный ряд разметки
- putchar('-');
- print_message();
- putchar('\n');
- printf("%-2c", i + 'a'); //выводим вертикальный (ряд) разметки с обозначениями по символу ввиду особенности печати
- for (int h = 0; h < SIZE_OF_MAP_X; ++h) { //выводим клетки поля по горизонтали указанного ряда вместе с разделителями
- putchar('|');
- putchar(table[i][h]);
- }
- putchar('|');
- putchar('\n');
- }
- putchar(' ');
- putchar(' ');
- for (int k = 0; k < SIZE_OF_MAP_X * 2 + 1; ++k) //выводим последний горизонтальный ряд разметки
- putchar('-');
- putchar('\n');
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement