Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 18.05.2013, 22:12   #1
Котей
Новичок
Джуниор
 
Регистрация: 18.05.2013
Сообщений: 2
Вопрос Исправить ошибки в программе

Нужно исправить управление:
-Запретить движение в обратную сторону;
-Сделать управление стрелочками;
Если есть какие нибуть идеи, буду очень рад их увидеть.
Код:
#include <stdlib.h> //для рандомной расстановки
#include <windows.h>//для задержки
#include <stdio.h>
#include <conio.h>
//Прототипы
void draw_line(int x, int y);
void show_score();
void move();
void setup_level();
//Глобальные переменные
const int maxy=15, maxx=77;
const int snake_start_x=33,snake_start_y=7;
const char up_key='w', down_key='s', left_key='a', right_key='d';
int score, sl, speed, food, i, level, firstpress, high_score=0;
char food_field[maxy][maxx];
char direction = right_key;
struct snake_segment {
int y,x;
char h=1;
} snake[100];
//Начало программы
main()
{
int y1,x1;
char keypress;
//Круг рестарта игры
do
{
food=3; level=1; score=0; speed=150;
rand();
setup_level();
//Главный круг игры
do
{
Sleep(speed);
//Изменение направления
if (kbhit())
{
keypress=getch();
direction=keypress;
}
move();
//Пустой последний сегмент змеи
gotoxy(snake[0].x,snake[0].y);
cprintf(" ");
//удаляем его из масива
for (i=1;i<=sl;i++)
snake[i-1]=snake[i];
//Перекрашиваем змея в зелёный
textcolor(LIGHTGREEN);
for (i=0;i<=sl;i++)
{
gotoxy(snake[i].x,snake[i].y);
cprintf("0");
}
//Голова змеи
textcolor(DARKGRAY);
y1=wherey();
x1=wherex();
gotoxy(x1-1,y1); cprintf("%c",h);
for (i=0;i<=sl;i++)
if(keypress==up_key){gotoxy(x1-1,y1); cprintf("%c",h);}else
if(keypress==down_key){gotoxy(x1-1,y1); cprintf("%c",h);}else
if(keypress==left_key){gotoxy(x1-1,y1); cprintf("%c",h);}else
if(keypress==right_key){gotoxy(x1-1,y1); cprintf("%c",h);}
//Делаем курсор невидимым
_setcursortype(_NOCURSOR);
//Пауза перед каждым уровнем
if (firstpress) { while(!kbhit()); firstpress = 0; }
/*Определение врезания в стены*/
if ((snake[sl-1].y>maxy+2)||(snake[sl-1].y<=2)||
(snake[sl-1].x>maxx+1)||(snake[sl-1].x<=1)||
/*Врезания в камни */
 (food_field[snake[sl-1].y-3][snake[sl-1].x-2]=='X'))
keypress='x'; //конец игры
//врезания ззмеии самой в себя
for (i=0;i<sl-1;i++)
if ( (snake[sl-1].y)==(snake[i].y) &&
(snake[sl-1].x)==(snake[i].x))
{
keypress='x'; //Конец игры
}
//Обнаружение еды
if (food_field[snake[sl-1].y-3][snake[sl-1].x-2]=='*')
{
//увеличение очков и длины змеи
score+=sl+food; show_score(); sl++;
//Переход на следующий уровень
if (sl==(level+3)*2)
{
score+=level*1; food+=1; level++;// увеличения уровня и количества еды
if ((level%2==0)&&(speed>1)) speed-10;// увеличения скорости каждые два уровня
setup_level(); //Установки уровня
}
}
} while (keypress!='x'); //Конец игрового цикла
if (score > high_score) high_score = score;
show_score();
gotoxy(30,7); textcolor(LIGHTRED); cprintf("G A M E   O V E R");
gotoxy(30,10); textcolor(YELLOW); cprintf("Another Game (y/n)? ");
do keypress=getch(); while((keypress!='y')&&(keypress!='n'));
} while (keypress=='y'); //перезапуск игрвого цикла
return 0;
}
void setup_level() //Функция установки уровня
{
int y,x,i;
//Настройка глобальных переменных для нового уровня
sl=level+4; direction=right_key;
firstpress=1;
//Зполнение поля символами ' '
for(y=0;y<maxy;y++)
for(x=0;x<maxx;x++)
food_field[y][x]= ' ';
//Заполнение поля камнями и едой
for(i=0;i<food*2;i++)
{
y= rand()%maxy;
x= rand()%maxx;
if(i<food)
food_field[y][x]='X';
else
food_field[y][x]='*';
}
//Создание массива длины sl
for(i=0;i<sl;i++)
{
snake[i].y=snake_start_y;
snake[i].x=snake_start_x+i;
}
//Обрисовка поля
draw_line(1,2);
for(y=0;y<maxy;y++)
{
gotoxy(1,y+3);
textcolor(LIGHTBLUE); cprintf("|");
textcolor(BROWN);
for(x=0;x<maxx;x++)
cprintf("%c",food_field[y][x]);
textcolor(LIGHTBLUE);
cprintf("|");
}
draw_line(1,maxy+3);
show_score();
gotoxy(2,maxy+6);
textcolor(LIGHTRED);
cprintf("Left: %c,Right: %c, Up: %c, Down: %c, Exit: x. Any key to start.",
 left_key,right_key,up_key,down_key);
 textcolor(GREEN);
gotoxy(32,1);
cprintf("~~~SNAKE GAME~~~");
 return;
}
void draw_line(int x, int y) //Функция создания линии из =
{
 gotoxy(x,y); textcolor(LIGHTBLUE);
for (x=0;x<maxx+2;x++) cprintf("=");
return;
}
void show_score() //Функция вывода очков на экран
{
textcolor(LIGHTCYAN);
gotoxy(2,maxy+4);
cprintf("Level: %05d",level);
gotoxy(40,maxy+4);
textcolor(LIGHTGREEN);
cprintf("Score: %05d",score);
gotoxy(60,maxy+4);
textcolor(LIGHTMAGENTA);
cprintf("High Score: %05d",high_score);
return;
}
void move() //Функция передвижения
{
switch(direction)
{
case(right_key): snake[sl].y=snake[sl-1].y;
                 snake[sl].x=snake[sl-1].x+1;
                 break;
case(left_key) : snake[sl].y=snake[sl-1].y;
                 snake[sl].x=snake[sl-1].x-1;
                 break;
case(up_key)   : snake[sl].y=snake[sl-1].y-1;
					  snake[sl].x=snake[sl-1].x;
					  break;
case(down_key) : snake[sl].y=snake[sl-1].y+1;
					  snake[sl].x=snake[sl-1].x;
                 break;
  }
return ;
}

Последний раз редактировалось Котей; 19.05.2013 в 20:09.
Котей вне форума Ответить с цитированием
Старый 19.05.2013, 17:42   #2
Че Гевара
Форумчанин
 
Аватар для Че Гевара
 
Регистрация: 25.09.2012
Сообщений: 182
По умолчанию

Блин, чувак, это же вырвиглазно. Для начала отформатируй код и расставь коментарии где у тебя что находится и за что отвечает, а то в этом месиве из функций, операторов, скобок и цифр врятли кто захочет копаться.
Отладка кода вдвое сложнее, чем его написание. Так что если вы пишете код настолько умно, насколько можете, то вы по определению недостаточно сообразительны, чтобы его отлаживать.
Brian W. Kernighan.
Че Гевара вне форума Ответить с цитированием
Старый 19.05.2013, 20:11   #3
Котей
Новичок
Джуниор
 
Регистрация: 18.05.2013
Сообщений: 2
По умолчанию

Спасибо, поправил.
Котей вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Отладить и исправить ошибки в программе на С++ Bespalini Помощь студентам 1 18.08.2012 16:35
Исправить ошибки в программе и дописать Anton94.by Помощь студентам 0 08.12.2011 20:52
Ошибки в программе, как исправить? zoomok Помощь студентам 2 22.06.2011 12:12
исправить ошибки в программе на Delphi Андрюха из ПХТТ Помощь студентам 1 04.11.2009 14:13
Помогите исправить ошибки в программе Gambit90 Помощь студентам 1 20.12.2007 16:24