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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 27.01.2019, 08:15   #1
MexL
Новичок
Джуниор
 
Регистрация: 27.01.2019
Сообщений: 2
По умолчанию Управление объектом

Делаю простейшую змейку на c++. Но тут возникла проблема - управление. Я использую kbhit и getch но они плохо работают, так как пока пользователь не нажмет что-то на клавиатуре, змейка будет стоять. А мне нужно, чтобы змейка двигалась всегда и лишь поворачивала с нажатием клавиш. Как это сделать? Помогите пожалуйста. Вот код:
Код:
#include <iostream>
#include <Windows.h>
#include <conio.h>
#include <cstdlib>
#include <ctime>

using namespace std;

const int width = 21;
const int height = 11;
int x, y, fruit_x, fruit_y, tail_x[width * height], tail_y[width * height], n_tail, score;
bool game;
enum Direction {LEFT, DOWN, RIGHT, UP, EXIT};
Direction dir;

void Setup();
void Draw();
void Input();
void Logic();

int main()
{
	Setup();
	while(game) {
		Draw();
		Input();
		Logic();
	}
	system("pause");
}

void Setup()
{
	srand(time(NULL));

	game = true;

	score = 0;
	n_tail = 0;

	x = width / 2;
	y = height / 2;

	fruit_x = 1 + (rand() % (width - 3));
	fruit_y = 1 + (rand() % (height - 3));
}

void Draw()
{
	bool print = true;

	system("cls");

	for(int i = 0; i < width; i++) 
		cout << '#';
	cout << endl;

	for(int k = 1; k < height - 1; k++) {
		for(int i = 0; i < width; i++) {
			if(i == 0 || i == width - 1)
				cout << '#';
			else if(i == x && k == y)
				cout << '@';
			else if(i == fruit_x && k == fruit_y)
				cout << '$';
			else {
				for(int h = 0; h < n_tail; h++) {
					if(tail_x[h] == i && tail_y[h] == k) {
						cout << 'o';
						print = false;
					}
				}
				if(print) cout << ' ';
				else print = true;
			}
		}
		cout << endl;
	}

	for(int i = 0; i < width; i++) 
		cout << '#';
	cout << "\nSCORE: " << score << endl << endl;
}

void Input()
{
	if(_kbhit) {
		switch(_getch()) {
			case 'a':
				dir = LEFT;
				break;
			case 's':
				dir = DOWN;
				break;
			case 'd':
				dir = RIGHT;
				break;
			case 'w':
				dir = UP;
				break;
			case 'x':
				game = false;
				break;
		}
	}
}

void Logic()
{
	int prev_x, prev_y, prev_2x, prev_2y;
	prev_x = tail_x[0];
	prev_y = tail_y[0];
	tail_x[0] = x;
	tail_y[0] = y;

	for(int i = 1; i < n_tail; i++) {
		prev_2x = tail_x[i];
		prev_2y = tail_y[i];
		tail_x[i] = prev_x;
		tail_y[i] = prev_y;
		prev_x = prev_2x;
		prev_y = prev_2y;
	}

	switch(dir) {
		case LEFT:
			x--;
			break;
		case DOWN:
			y++;
			break;
		case RIGHT:
			x++;
			break;
		case UP:
			y--;
			break;
	}

	if(x == fruit_x && y == fruit_y) {
		score += 5;
		n_tail++;

		fruit_x = 1 + (rand() % (width - 3));
		fruit_y = 1 + (rand() % (height - 3));
	}

	if(x == 0 || y == 0 || x == width - 1 || y == height - 1)
		game = false;

	for(int i = 0; i < n_tail; i++) {
		if(x == tail_x[i] && y == tail_y[i])
			game = false;
	}

	if(!game) cout << "GAME OVER((\n";
}
P.S. ищу ответ уже несколько недель ничего не помогает. Компилятор есл что GCC
MexL вне форума Ответить с цитированием
Старый 28.01.2019, 22:42   #2
migmile
Новичок
Джуниор
 
Регистрация: 23.01.2019
Сообщений: 2
По умолчанию

Ну, для начала, kbhit - функция, так что должно быть в Input:
if(_kbhit()) {
migmile вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Управление объектом приложения из длл (Plugin) IvaniuS Общие вопросы Delphi 11 31.01.2016 22:42
Проблема с COM объектом. Son Общие вопросы Delphi 0 10.01.2013 23:01
слежение за объектом Giku Свободное общение 12 18.04.2012 15:20
Работа с объектом Image Lisёноk Помощь студентам 2 13.03.2010 12:41
Проблема с COM объектом resu654 Общие вопросы Delphi 2 25.05.2009 23:00