Quote (devil-hunter)
2)создайте программу рисующую на экране два поля для морского боя. Первое - игрока, второе - противника. Второе поле должно располагаться справа от первого. Внутренние клетки заполняйте пробелом. Для рисования границы используйте минус и прямую разделительную черту: -, |, а для углов - решётку #. Слева от каждого поля - стобик цифр; сверху - буквы.
Рамки нарисовал, цифры и буквы ставить влом, может сам поймешь как их поставить? Ведь это очень просто. Все коментарии есть в коде.
Code
#include <iostream> // cin, cout
#include <clocale> // поддержка русского языка
#include <conio.h> // _getch()
#include <stdlib.h> // поддержка функции очистки экрана system("cls")
using namespace std;
char UpperBraket[22]; // Верхняя рамка боевого поля
char BotomBraket[22]; // Нижняя рамка боевого поля
// <<<<< Ф-я формирующяя нижнюю и верхнюю рамки, нужна для оформления не более >>>>>
void InitBrakets(void)
{
UpperBraket[0] = '#';
for(int i = 1; i <= 20; ++i)
UpperBraket[i] = '-';
UpperBraket[21] = '#';
BotomBraket[22] = '\0';
BotomBraket[0] = '#';
for(int i = 1; i <= 20; ++i)
BotomBraket[i] = '-';
BotomBraket[21] = '#';
BotomBraket[22] = '\0';
}
int main()
{
setlocale(LC_CTYPE,"Russian"); // установка русского языка
InitBrakets(); // Незабудь скобки проинициализировать
char act; // переменная для хранения ввода пользователя
int ch; // ввод пользователя приведённый к типу int
int x = 0; // две переменные для хранения координат пользователя
int y = 0;
char map[15][20]; // двумерный массив для хранения игровой карты
// блок инициализации массива
// внешний цикл отвечает за строки
for (int i = 0; i< 15; i++)
{
// внутренний цикл отвечает за столбцы
for (int j = 0; j< 20; j++)
{
map[i][j] = ' ';
}
}
map[0][0] = 'Т'; // помещаем игровой персонаж в начало координат
while (1)
{
system("cls"); // вызов функции очистки экрана
cout << UpperBraket << '\t' << UpperBraket << endl; // Рисуем верхнюю скобку
for (int i = 0; i < 15; i++)
{
cout << '|'; // рисуем левую боковую рамку
for (int j = 0; j < 20; j++)
{
cout << map[i][j]; // в циклах поэлементно выводится массив
}
cout << '|' << '\t' << '|' // рисуем остальные
<< " " << '|' << endl; // боковые рамки
}
cout << BotomBraket << '\t' << BotomBraket << endl; // Рисуем нижнюю скобку
act = _getch();
ch = static_cast<int>(act);
switch (static_cast<int>(act))
{
case -32:
break;
case 27:
exit(0);
break;
case 75:
map[x][y] = ' '; // "Убираем" объект со старой координаты
y--; // изменяем координаты
// "рисуем" объект на новом месте
break;
case 77:
map[x][y] = ' ';
y++;
break;
case 80:
map[x][y] = ' ';
x++;
break;
case 72:
map[x][y] = ' ';
x--;
break;
}
if(x < 0) x = 0; // проверка
if(y < 0) y = 0; // если выходит
if(x > 14) x = 14; // за пределы карты
if(y > 19) y = 19; // возвращяем на место
map[x][y] = 'T'; // Выносим присваивание
} // конец цикла while
_getch();
return 0;
}
Еще один вариант, очень жопоруко и без всяких коментариев но зато можно управлять букавками на обоих полях на правом стрелками, на левом WASD.
Code
#include <iostream> // cin, cout
#include <clocale> // поддержка русского языка
#include <conio.h> // _getch()
#include <stdlib.h> // поддержка функции очистки экрана system("cls")
using namespace std;
char UpperBraket[22]; // Верхняя рамка боевого поля
char BotomBraket[22]; // Нижняя рамка боевого поля
// <<<<< Ф-я формирующяя нижнюю и верхнюю рамки, нужна для оформления не более >>>>>
void InitBrakets(void)
{
UpperBraket[0] = '#';
for(int i = 1; i <= 20; ++i)
UpperBraket[i] = '-';
UpperBraket[21] = '#';
BotomBraket[22] = '\0';
BotomBraket[0] = '#';
for(int i = 1; i <= 20; ++i)
BotomBraket[i] = '-';
BotomBraket[21] = '#';
BotomBraket[22] = '\0';
}
int main()
{
setlocale(LC_CTYPE,"Russian"); // установка русского языка
InitBrakets(); // Незабудь скобки проинициализировать
char act; // переменная для хранения ввода пользователя
int ch; // ввод пользователя приведённый к типу int
int x1 = 0; // две переменные для хранения координат пользователя
int y1 = 0;
int x2 = 0;
int y2 = 0;
char map1[15][20]; // двумерный массив для хранения игровой карты
char map2[15][20];
// блок инициализации массива
// внешний цикл отвечает за строки
for (int i = 0; i< 15; i++)
{
// внутренний цикл отвечает за столбцы
for (int j = 0; j< 20; j++)
{
map1[i][j] = ' ';
map2[i][j] = ' ';
}
}
map1[0][0] = 'Т'; // помещаем игровой персонаж в начало координат
map2[0][0] = 'X';
while (1)
{
system("cls"); // вызов функции очистки экрана
cout << UpperBraket << '\t' << UpperBraket << endl; // Рисуем верхнюю скобку
for (int i = 0; i < 15; i++)
{
cout << '|'; // рисуем левую боковую рамку
for (int j = 0; j < 20; j++)
{
cout << map1[i][j]; // в циклах поэлементно выводится массив
}
cout << '|' << '\t' << '|';
for (int j = 0; j < 20; j++)
{
cout << map2[i][j]; // в циклах поэлементно выводится массив
}
cout << '|' << endl;
}
cout << BotomBraket << '\t' << BotomBraket << endl; // Рисуем нижнюю скобку
act = _getch();
ch = static_cast<int>(act);
switch (static_cast<int>(act))
{
case -32:
break;
case 27:
exit(0);
break;
case 75:
map2[x2][y2] = ' '; // "Убираем" объект со старой координаты
y2--; // изменяем координаты
// "рисуем" объект на новом месте
break;
case 77:
map2[x2][y2] = ' ';
y2++;
break;
case 80:
map2[x2][y2] = ' ';
x2++;
break;
case 72:
map2[x2][y2] = ' ';
x2--;
break;
case 'w':
map1[x1][y1] = ' ';
x1--;
break;
case 's':
map1[x1][y1] = ' ';
x1++;
break;
case 'a':
map1[x1][y1] = ' ';
y1--;
break;
case 'd':
map1[x1][y1] = ' ';
y1++;
break;
}
if(x1 < 0) x1 = 0; // проверка
if(y1 < 0) y1 = 0; // если выходит
if(x1 > 14) x1 = 14; // за пределы карты
if(y1 > 19) y1 = 19; // возвращяем на место
map1[x1][y1] = 'T'; // Выносим присваивание
if(x2 < 0) x2 = 0; // проверка
if(y2 < 0) y2 = 0; // если выходит
if(x2 > 14) x2 = 14; // за пределы карты
if(y2 > 19) y2 = 19; // возвращяем на место
map2[x2][y2] = 'X';
} // конец цикла while
_getch();
return 0;
}