|
Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » C/C++ - Помогите с кодом с++ |
|
C/C++ - Помогите с кодом с++
|
Новый участник Сообщения: 4 |
Профиль | Отправить PM | Цитировать Итак, пытаюсь написать консольную змейку на c++. Однако возникли некоторые проблемы... С осуществлением движения змейки. Вот мой код. Я знаю, что проблема в функциях clear() и move(), но никак не доходит до меня, как эту проблему решить... Пожалуйста, помогите разобраться новичку... И просьба не кидать ссылок на готовые коды змейки. Я их видел, но хочу написать свою змейку сам Нужна лишь помощь в этом проблеме.
#include <iostream.h> #include <stdio.h> #include <time> #include <conio> using namespace std; char pole[20][20]; int symbol; int coordinatesX[1000], coordinatesY[1000]; int size; int choiseX, choiseY; void field() { for (int i = 0; i<20; i++) { for (int j = 0; j<20; j++) { if (i==0 || i == 19 || j == 0 || j == 19) {pole[i][j]='#';} else {pole[i][j]=' ';} } } cin.get(); } void standart() { field(); coordinatesY[1]=2; coordinatesX[1]=3; coordinatesY[2]=2; coordinatesX[2]=2; choiseX = 1; choiseY=0; size = 2; } void display() { system ("cls"); for (int i = 0; i<20; i++) { for (int j = 0; j<20; j++) { cout << pole[i][j]; if (j == 19) cout << endl; } } } void snake() { switch (choiseX) { case 1: pole[coordinatesY[1]][coordinatesX[1]] = '>'; break; case -1: pole[coordinatesY[1]][coordinatesX[1]] = '<'; break;} switch (choiseY){ case 1: pole[coordinatesY[1]][coordinatesX[1]] = 'v'; break; case -1: pole[coordinatesY[1]][coordinatesX[1]] = '^'; break; } for (int i = 2; i <= size; i++) { pole[coordinatesY[i]][coordinatesX[i]]='@' ; } } void chlearing() { pole[coordinatesY[1]-choiseY][coordinatesX[1]-choiseX]=' '; pole[coordinatesY[2]-choiseY][coordinatesX[2]-choiseX]=' '; } void clear() { for (int i = 1; i<=size; i++) {pole[coordinatesY[i]][coordinatesX[i]]=' ';} } void move() { clear(); for (int i = size;i>=2;i--) { coordinatesX[i]=coordinatesX[i-1]; coordinatesY[i]=coordinatesY[i-1]; } coordinatesX[1]=coordinatesX[1]+choiseX; coordinatesY[1]=coordinatesY[1]+choiseY; display(); } void changing() { symbol = getch(); switch (symbol) { case 'd': if (choiseX!=-1) choiseX = 1; choiseY=0; break; case 'a': if (choiseX!=1) choiseX = -1; choiseY=0; break; case 's': if (choiseY!=-1) choiseY = 1; choiseX=0; break; case 'w': if (choiseY!=1) choiseY = -1; choiseX=0; break; case 'f': size++; break; } } int main() { standart(); display(); while(1) { snake(); if (kbhit()==true){changing();} move(); display(); Sleep(200); } cin.get(); } |
|
Отправлено: 20:41, 24-07-2014 |
Ветеран Сообщения: 1180
|
Профиль | Отправить PM | Цитировать Nerest, советы:
1. обрамляй код тегом "code", иначе нечитаемо 2. твой код не собирается т.к. перепутано местами, где надо .h и где не надо 3. В с/c++ индекс массивов начинается с 0 (но твой код работоспособен). Это чаще бывает удобно, чем когда начинается с 1 4. if(x==true) сработает только тогда, когда int(x)=1, if (x) тогда, когда int(x)!=0. x лучше писать в виде is_XXX или have_XXX, например if (is_kbhit()) 5. Проследи места, когда ты делаешь вывод на экран. Выводить нужно 1 раз за цикл, тогда, когда у тебя поле построено полностью Вот так работает: #include <iostream> #include <stdio.h> #include <time.h> #include <conio.h> #include <windows.h> using namespace std; char pole[20][20]; int symbol; int coordinatesX[1000], coordinatesY[1000]; int size; int choiseX, choiseY; void field() { for (int i = 0; i<20; i++) { for (int j = 0; j<20; j++) { if (i==0 || i == 19 || j == 0 || j == 19) {pole[i][j]='#';} else {pole[i][j]=' ';} } } cin.get(); } void standart() { field(); coordinatesY[1]=2; coordinatesX[1]=3; coordinatesY[2]=2; coordinatesX[2]=2; choiseX = 1; choiseY=0; size = 2; } void display() { system ("cls"); for (int i = 0; i<20; i++) { for (int j = 0; j<20; j++) { cout << pole[i][j]; if (j == 19) cout << endl; } } } void snake() { switch (choiseX) { case 1: pole[coordinatesY[1]][coordinatesX[1]] = '>'; break; case -1: pole[coordinatesY[1]][coordinatesX[1]] = '<'; break;} switch (choiseY){ case 1: pole[coordinatesY[1]][coordinatesX[1]] = 'v'; break; case -1: pole[coordinatesY[1]][coordinatesX[1]] = '^'; break; } for (int i = 2; i <= size; i++) { pole[coordinatesY[i]][coordinatesX[i]]='@' ; } } void chlearing() { pole[coordinatesY[1]-choiseY][coordinatesX[1]-choiseX]=' '; pole[coordinatesY[2]-choiseY][coordinatesX[2]-choiseX]=' '; } void clear() { for (int i = 1; i<=size; i++) {pole[coordinatesY[i]][coordinatesX[i]]=' ';} } void move() { clear(); for (int i = size;i>=2;i--) { coordinatesX[i]=coordinatesX[i-1]; coordinatesY[i]=coordinatesY[i-1]; } coordinatesX[1]=coordinatesX[1]+choiseX; coordinatesY[1]=coordinatesY[1]+choiseY; //display(); } void changing() { symbol = getch(); switch (symbol) { case 'd': if (choiseX!=-1) choiseX = 1; choiseY=0; break; case 'a': if (choiseX!=1) choiseX = -1; choiseY=0; break; case 's': if (choiseY!=-1) choiseY = 1; choiseX=0; break; case 'w': if (choiseY!=1) choiseY = -1; choiseX=0; break; case 'f': size++; break; } } int main() { standart(); while(1) { if (kbhit()==true){changing();} move(); snake(); display(); Sleep(200); } cin.get(); } |
Отправлено: 09:16, 27-07-2014 | #2 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
Новый участник Сообщения: 4
|
Профиль | Отправить PM | Цитировать Спасибо огромное, добрый человек! ) И впрямь заработало, как надо. Теперь два вопроса остались :D
1) Какое влияние оказывает порядок подключения .h файлов? 2) Если все-таки нажать f, исходя из моего кода, то не только увеличится размер, но и удалится верхний уголок карты... Не можешь подсказать, почему?.. |
Отправлено: 01:42, 28-07-2014 | #3 |
Ветеран Сообщения: 1180
|
Профиль | Отправить PM | Цитировать Цитата Nerest:
Цитата pva:
Цитата Nerest:
|
|||
Отправлено: 21:28, 28-07-2014 | #4 |
Новый участник Сообщения: 4
|
Профиль | Отправить PM | Цитировать А разве iostream.h и iostream - не одно и то же?) Какая разница между ними?)
Компилятор - borland c++ builder 6 |
|
Отправлено: 02:24, 29-07-2014 | #5 |
Ветеран Сообщения: 2589
|
Профиль | Отправить PM | Цитировать Цитата Nerest:
При использовании iostream в начале файла указывается \ using namespace std; либо перед каждым упоминанием имени из iostream ставить std:: |
|
------- Отправлено: 02:43, 29-07-2014 | #6 |
Новый участник Сообщения: 4
|
Профиль | Отправить PM | Цитировать Цитата THEDOGG:
|
|
Отправлено: 14:10, 29-07-2014 | #7 |
Ветеран Сообщения: 2589
|
Профиль | Отправить PM | Цитировать Цитата Nerest:
Смысла нет включать пространство имен, ради двух функций |
|
------- Отправлено: 14:36, 29-07-2014 | #8 |
Участник сейчас на форуме | Участник вне форума | Автор темы | Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
Помогите с кодом div пожалуйста!! | Azeek | Вебмастеру | 3 | 07-03-2012 21:58 | |
Ошибка с кодом 39 | sweed | Непонятные проблемы с Железом | 3 | 27-02-2012 17:33 | |
помогите с простеньким кодом под php | WestBronx | Вебмастеру | 4 | 25-08-2006 11:27 | |
помогите с кодом | armag | Вебмастеру | 4 | 06-05-2006 22:51 | |
Помогите с кодом ссылки. | Prisoner | Вебмастеру | 12 | 24-04-2004 04:12 |
|