Понедельник, 23 Мая 2022, 18:18

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
Форум игроделов » Программирование » C/C++ » помогите если не очень трудно (проблема с многомерными(двухмерными) массивами)
помогите если не очень трудно
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 элемента wacko
MatouДата: Пятница, 05 Ноября 2010, 23:14 | Сообщение # 7
Исходный коТ
Сейчас нет на сайте
Quote (devil-hunter)
ещё можешь объяснить для чего нужна функция void

void - это не функция, а спецификатор показывающий что функция ничего не принимает в качестве аргумента либо не возвращяет никаких значений.
Quote (devil-hunter)
и вот ещё... зачем нужна вот эта строчка: map[x][y] = 'T'; // Выносим присваивание

Как это зачем? 'T' же ставит куда надо biggrin У тебя же изначально она была, просто я ее вынес из свитча.
Quote (devil-hunter)
почему ты сделал массивы под верхнии и нижнии рамки по 22 элемента

Касяк сделал, надо было по 23 biggrin 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, ну типо того biggrin
а что?
evilCodeДата: Суббота, 06 Ноября 2010, 20:08 | Сообщение # 10
The Metal
Сейчас нет на сайте
Я там тоже начинал учить DX)) Давно...

evilCode aka sanyok31



Сообщение отредактировал evilCode - Суббота, 06 Ноября 2010, 20:10
MatouДата: Суббота, 06 Ноября 2010, 20:21 | Сообщение # 11
Исходный коТ
Сейчас нет на сайте
И я туда заглядывал весной biggrin


Форум игроделов » Программирование » C/C++ » помогите если не очень трудно (проблема с многомерными(двухмерными) массивами)
  • Страница 1 из 1
  • 1
Поиск:

Все права сохранены. GcUp.ru © 2008-2022 Рейтинг