помогите если не очень трудно
|
|
devil-hunter | Дата: Пятница, 05 Ноября 2010, 20:07 | Сообщение # 1 |
был не раз
Сейчас нет на сайте
| я ещё только изучаю С++ и столкнулся с одной трудностью, мне очень нужна ваша помощь!!! Quote #include <iostream> // cin, cout #include <clocale> // поддержка русского языка #include <conio.h> // _getch() #include <stdlib.h> // поддержка функции очистки экрана system("cls") using namespace std; int main() { setlocale(LC_CTYPE,"Russian"); // установка русского языка 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"); // вызов функции очистки экрана for (int i = 0; i < 15; i++) { for (int j = 0; j < 20; j++) { cout << map[i][j]; // в циклах поэлементно выводится массив } cout << "\n"; // переход на новую строку после каждого "ряда" } 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--; // изменяем координаты map[x][y] = 'Т'; // "рисуем" объект на новом месте break; case 77: map[x][y] = ' '; y++; map[x][y] = 'Т'; break; case 80: map[x][y] = ' '; x++; map[x][y] = 'Т'; break; case 72: map[x][y] = ' '; x--; map[x][y] = 'Т'; break; } } // конец цикла while _getch(); return 0; } помогите мне с решением заданий по этому коду пожалуйста и если можно с объяснением (хотя бы кратким) вот задания: 1)Сделайте проверку на выход за пределы карты. 2)создайте программу рисующую на экране два поля для морского боя. Первое - игрока, второе - противника. Второе поле должно располагаться справа от первого. Внутренние клетки заполняйте пробелом. Для рисования границы используйте минус и прямую разделительную черту: -, |, а для углов - решётку #. Слева от каждого поля - стобик цифр; сверху - буквы.
|
|
| |
zadrot_666 | Дата: Пятница, 05 Ноября 2010, 20:10 | Сообщение # 2 |
почетный гость
Сейчас нет на сайте
| Слушай а трудно было отформатировать текст то? Мог бы просто .cpp файл скинуть. Да и вообще щас разбираться с этими рутинами в 8 часов вечера как то не охота.
Look at you, hacker. A pathetic creature of meat and bone, panting and sweating as you run through my corridors. How can you challenge a perfect, immortal machine? © SHODAN.
|
|
| |
Matou | Дата: Пятница, 05 Ноября 2010, 20:29 | Сообщение # 3 |
Исходный коТ
Сейчас нет на сайте
| devil-hunter, Что этот код вообще должен делать? Самхивает на консольный морской бой, только не понятно почему размер массива 15 на 20. 1) Во первых не к чему делать присваивание новых координат после каждоко кейса (case) достаточно сделать это посде свитча(switch), более того если делать так как ты делаешь, то и проверку придется после каждого кейса делать. Правильнее было бы так: Code 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'; // Выносим присваивание
Сообщение отредактировал Matou - Пятница, 05 Ноября 2010, 20:48 |
|
| |
devil-hunter | Дата: Пятница, 05 Ноября 2010, 20:46 | Сообщение # 4 |
был не раз
Сейчас нет на сайте
| ну этот код вобще из заданий по массивам...должен выводить поле заполненное пробелом(тобишь пустое) размером 15 на 20 потом рисуется "персонаж"(Т) на координате (0;0) затем уже приведён код для движения персонажа вправо влево вверх вниз а надо сделать к нему проверку на выход за пределы массива и нарисовать 2 поля как в морском бое (ну задания написаны вначале темы)я просто не понял как это сделать и пришлось пропустить эти задания...а вот теперь стало интересно как это вобще сделать. мне нужен совет того кто знает С++
|
|
| |
Matou | Дата: Пятница, 05 Ноября 2010, 21:19 | Сообщение # 5 |
Исходный коТ
Сейчас нет на сайте
| 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; }
Сообщение отредактировал Matou - Пятница, 05 Ноября 2010, 21:39 |
|
| |
devil-hunter | Дата: Пятница, 05 Ноября 2010, 22:54 | Сообщение # 6 |
был не раз
Сейчас нет на сайте
| Matou спасибо)) а можешь ещё объяснить как комп понимает что ему нужно выводить сверху и снизу рамки в этом коде: Code 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'; } ещё можешь объяснить для чего нужна функция void это вобще что делает??? и вот ещё... зачем нужна вот эта строчка: map[x][y] = 'T'; // Выносим присваивание ну и если я тебя не сильно достал тупыми нубскими вопросами.... можешь сказать почему ты сделал массивы под верхнии и нижнии рамки по 22 элемента
|
|
| |
Matou | Дата: Пятница, 05 Ноября 2010, 23:14 | Сообщение # 7 |
Исходный коТ
Сейчас нет на сайте
| Quote (devil-hunter) ещё можешь объяснить для чего нужна функция void void - это не функция, а спецификатор показывающий что функция ничего не принимает в качестве аргумента либо не возвращяет никаких значений. Quote (devil-hunter) и вот ещё... зачем нужна вот эта строчка: map[x][y] = 'T'; // Выносим присваивание Как это зачем? 'T' же ставит куда надо У тебя же изначально она была, просто я ее вынес из свитча. Quote (devil-hunter) почему ты сделал массивы под верхнии и нижнии рамки по 22 элемента Касяк сделал, надо было по 23 20 на знаки '-', 2 на левую и правую решетку '#' и один на '\0' в конце, показывающий что наступил конец строки, это нужно для корректного вывода данных массивов через "cout <<". Quote (devil-hunter) как комп понимает что ему нужно выводить сверху и снизу рамки в этом коде: В этом коде никак, это просто функция инициализируящяя массивы, вывод рамок происходит внутри главного цикла "while(1)"
Сообщение отредактировал Matou - Пятница, 05 Ноября 2010, 23:17 |
|
| |
evilCode | Дата: Суббота, 06 Ноября 2010, 09:16 | Сообщение # 8 |
The Metal
Сейчас нет на сайте
| devil-hunter, Это задание от Романа? На сайте shatalov.su? ))
evilCode aka sanyok31
|
|
| |
devil-hunter | Дата: Суббота, 06 Ноября 2010, 17:13 | Сообщение # 9 |
был не раз
Сейчас нет на сайте
| evilCode, ну типо того а что?
|
|
| |
evilCode | Дата: Суббота, 06 Ноября 2010, 20:08 | Сообщение # 10 |
The Metal
Сейчас нет на сайте
| Я там тоже начинал учить DX)) Давно...
evilCode aka sanyok31
Сообщение отредактировал evilCode - Суббота, 06 Ноября 2010, 20:10 |
|
| |
|