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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 17.07.2012, 14:49   #1
Slash4eveR
 
Регистрация: 16.07.2012
Сообщений: 4
По умолчанию Перемещение символа стрелками

Доброе время суток! Нужно реализовать перемещение символа (в данном случае смайлика) стрелками по экрану консоли горизонтально и вертикально.
Прошу привести код в порядок.
Я наверное сильно намудрил, голова уже не соображает. Не судите строго

Код:
#include <iostream>
#include <windows.h>
#include <conio.h>
using namespace std;
void main()
{
	HANDLE h = GetStdHandle (STD_OUTPUT_HANDLE);
	COORD c = {0, 0};
	c.X=0;
	c.Y=0;
	SetConsoleCursorPosition (h, c);
	while(1){
	int k = getch(), step = 1; //step - шаг перемещения символа
	if(k==0||k==224)  k = getch();
	switch(k){
	case 72: //72,75,77,80 - порядковый номер стрелок на клавиатуре, char(1) - смайлик
		c.Y-step;
		cout<<char(1);
		break;
	case 75:
		c.X-step;
		cout<<char(1);
		break;
	case 77:
		c.X+step;
		cout<<char(1);
		break;
	case 80:
		c.Y+step;
		cout<<char(1);
	}
}
}
Slash4eveR вне форума Ответить с цитированием
Старый 17.07.2012, 17:27   #2
Last
В прострации
Форумчанин
 
Регистрация: 13.01.2009
Сообщений: 239
По умолчанию

Код:
#include <iostream>
#include <windows.h>
#include <conio.h>
using namespace std;
int main()
{
	HANDLE h = GetStdHandle (STD_OUTPUT_HANDLE);
	COORD c = {10, 1};
	SetConsoleCursorPosition (h, c);
	while(1)
	{
		int k = getch(); 
		if (k==0||k==224)  k = getch();
		switch(k)
		{
		case 72: //72,75,77,80 - код для клавиш стрелок на клавиатуре, char(1) - смайлик
			c.Y--;
			cout<<char(1);
			break;
		case 75:
			c.X--;
			cout<<char(1);
			break;
		case 77:
			c.X++;
			cout<<char(1);
			break;
		case 80:
			c.Y++;			
			cout<<char(1);
			break;
		default: return 0;;
		}
               SetConsoleCursorPosition(h, c);
	}
}
Пол-жизни сидючи, в монитор глядючи...

Последний раз редактировалось Last; 17.07.2012 в 17:38.
Last вне форума Ответить с цитированием
Старый 17.07.2012, 17:33   #3
Slash4eveR
 
Регистрация: 16.07.2012
Сообщений: 4
По умолчанию

Спасибо, а как сделать, чтоб смайлики не размножались, а только один перемещался, т.е. чтоб предыдущие исчезали.

Последний раз редактировалось Slash4eveR; 17.07.2012 в 17:38.
Slash4eveR вне форума Ответить с цитированием
Старый 17.07.2012, 17:39   #4
Last
В прострации
Форумчанин
 
Регистрация: 13.01.2009
Сообщений: 239
По умолчанию

Нет, нужно очистить окно консоли.
Код:
system("cls");
Пол-жизни сидючи, в монитор глядючи...
Last вне форума Ответить с цитированием
Старый 17.07.2012, 17:43   #5
Slash4eveR
 
Регистрация: 16.07.2012
Сообщений: 4
По умолчанию

Цитата:
Сообщение от Last Посмотреть сообщение
Нет, нужно очистить окно консоли.
Код:
system("cls");
точно, забыл, спасибо еще раз!
Slash4eveR вне форума Ответить с цитированием
Старый 17.07.2012, 17:44   #6
Last
В прострации
Форумчанин
 
Регистрация: 13.01.2009
Сообщений: 239
По умолчанию

Буду благодарен, если мне расскажут почему первый getch() всегда ловит символ 224, а второй getch(), не спрашивая никакого ввода, правильно определяет код стрелки.
Пол-жизни сидючи, в монитор глядючи...

Последний раз редактировалось Last; 17.07.2012 в 17:48.
Last вне форума Ответить с цитированием
Старый 17.07.2012, 18:47   #7
Slash4eveR
 
Регистрация: 16.07.2012
Сообщений: 4
По умолчанию

сообщается, что следующие символы относятся к группе начиная с 224 символа в таблице ASCII, а например клавиши F1-F10 - относятся к группе символов 0.
т.е. сначала группа "224" а затем свой собственный код, напр.: space - 32, esc - 27 и т.д.
надеюсь, понятно написал. )
Slash4eveR вне форума Ответить с цитированием
Старый 17.07.2012, 20:45   #8
s-andriano
Старожил
 
Аватар для s-andriano
 
Регистрация: 08.04.2012
Сообщений: 3,229
По умолчанию

Цитата:
Сообщение от Last Посмотреть сообщение
Буду благодарен, если мне расскажут почему первый getch() всегда ловит символ 224, а второй getch(), не спрашивая никакого ввода, правильно определяет код стрелки.
Для совместимости с 83-клавишной клавиатурой оригинальной IBM PC.
Для Вас же важно лишь, что "код стрелки" - это всегда два байта, а не один. Иначе рано или поздно нарветесь на ложное срабатывание.
s-andriano вне форума Ответить с цитированием
Старый 18.07.2012, 10:11   #9
Last
В прострации
Форумчанин
 
Регистрация: 13.01.2009
Сообщений: 239
По умолчанию

Спасибо за объяснение, буду гуглить подробности.
Пол-жизни сидючи, в монитор глядючи...
Last вне форума Ответить с цитированием
Старый 18.11.2012, 21:20   #10
sancho.malyutin
 
Регистрация: 18.11.2012
Сообщений: 4
По умолчанию

Можно сделать так:
Но для этого нужно использовать старый добрый printf, а точнее cprintf
1) На старом месте смайлика рисуем его, но только чёрным цветом
textcolor(BLACK);
cprintf(%с,char(1));
2) смещаешь его и рисyещь белым ну или каким захочешь))
textcolor(WHITE);
cprintf(%с,char(1));

+ подключи библиотеку #include <stdio.h>

Можно оспользовать как второй вариант WinApi функцию TextOut(...)
Отпешись о результате)
sancho.malyutin вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
StringGrid - выделение мышкой и стрелками delphicoding Общие вопросы Delphi 5 21.03.2012 14:39
Управление стрелками N.i.k.o.l.a.y. Помощь студентам 4 13.03.2012 10:15
Управление стрелками Sektr63 Gamedev - cоздание игр: Unity, OpenGL, DirectX 0 07.02.2012 16:33
Перемещение символа: Skripnichenko Общие вопросы C/C++ 0 24.03.2011 22:06
Управление кнопками со стрелками eks-s Общие вопросы Delphi 6 19.01.2008 02:23