406.80K
Категория: ПрограммированиеПрограммирование

Движение в консольной графике

1.

Алгоритмы движения
доцент каф. информатики
Наталия Викторовна Голкова

2.

Алгоритм неуправляемого движения
1. Задать начальные координаты ГЕРОЯ и вывести его
на экран
2. Если нажата клавиша, то
1. Очистить экран
2. Выбрать какая клавиша нажата и вычислить
координату
3. Вывести на экран ГЕРОЯ
3. Проверить: нажата ли клавиша ESC? Если не
нажата, то перейти на пункт 2

3.

Управляемое движение
Необходимые библиотеки
#include <stdio.h>// printf();
#include<stdlib.h> // system("cls"); srand();rand();
#include<time.h>
// time()
#include <conio.h> // _getch();
#include<Windows.h> // SetConsoleCursorPosition();
Функция устанавливает курсор в заданную позицию
void gotoXY(int x, int y)
{
COORD p = {x, y};
// Получение дескриптора устройства стандартного вывода
HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
// Перемещение каретки по заданным координатам
SetConsoleCursorPosition(hConsole,p);
}

4.

Управляемое движение
Задаем начальные данные
int main() {
srand((unsigned)time(NULL));
int x, y, face = 1;
char key = 0;
x = rand()%80; // задаём координату x
y = rand()%25; // задаём координату y
gotoXY(x,y); // устанавливаем курсор в (x,y)
printf("%c", face); // выводим символ

5.

Цикл игры с управляемым движением
do {
if (kbhit()) {
key = _getch(); //чтобы работал getch, нужно создать
// проект без "проверок времени жизни SDL"
system("cls");
switch(key){
case 'W':
case 'w': y--; printf("UP"); break;
case 'S':
case 's': y++; printf("DOWN"); break;
case 'A':
case 'a': x--; printf("LEFT"); break;
case 'D':
case 'd': x++; printf("RIGHT"); break;
}
gotoXY(x,y);
printf("%c", face);
}
} while(key != 27);
return 0;
}

6.

Изменить цвет символа (текста) в консоли
В функцию system передаём строку следующего
вида: "color <A><B>", где <A> и <B> —
шестнадцатеричные цифры — первая задает цвет
фона, а вторая — цвет шрифта.
// Обязательное подключение файла
#include <Windows.h>
// Установка белого фона и черного текста
system("color F0");
printf("%c", face);
// Установка черного фона и желтого
текста
system("color 0E" );
printf("%c", face); // выводим символ

7.

Значения цифр
0 — черный
1 — синий
2 — зеленый
3 — голубой
4 — красный
5 — лиловый
6 — желтый
7 — белый
8 — серый
9 — свело-синий
A — светло-зеленый
B — светло-голубой
С — светло-красный
E — светло-желтый
F — ярко-белый

8.

Чтобы у персонажей был разный цвет
/*Обязательное подключение файла*/
#include <Windows.h>
/*Получаение дескриптора устройства стандартного
вывода*/
HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
/*Установка белого фона Цвет символа - черный*/
SetConsoleTextAttribute(hConsole, (WORD) ((15 << 4) | 0));
Цвет текста и фона изменяется вызовом функции
SetConsoleTextAttribute, которая принимает два
параметра: дескриптор консоли и выражение вида
(WORD)((Background << 4) | Text)),
где Background - цвет фона именно за теми символами,
которые выводятся, а Text — цвет текста.

9.

Примечание
В отличие от функции system(), параметры Bacground
и Text являются числовыми, поэтому необходимо цвета,
которые имеют буквенное обозначение, заменять их
эквивалентами. Например: A = 10, B = 11 и т.д.
Для удобства записи можно создать перечисление,
содержащие все цвета. Тогда в программе можно будет
просто использовать имя цвета вместо
соответствующего чисела.

10.

Перечисление
enum ConsoleColor {
Black = 0,
Blue = 1,
Green = 2,
Cyan = 3,
Red = 4,
Magenta = 5,
Brown = 6,
LightGray = 7,
DarkGray = 8,
LightBlue = 9,
LightGreen = 10,
LightCyan = 11,
LightRed = 12,
LightMagenta = 13,
Yellow = 14,
White = 15
};

11.

Пример
int main() {
/*Получение дескриптора*/
HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
/*Цвет всего фона - белый. Цвет всего текста - черный*/
system("color F0");
puts("Hello World!");
/*Цвет символов - желтый. Цвет фона - темно-серый*/
SetConsoleTextAttribute(hConsole, (WORD)
((DarkGray << 4) | Yellow));
printf("Hello");
/*Цвет символов - светло-зеленый. Цвет фона - желтый*/
SetConsoleTextAttribute(hConsole,(WORD)((Yellow
<< 4) | LightGreen));
puts("World!");// вывод только текста
return 0;
}

12.

Функция SetColor()
void SetColor(ConsoleColor text, ConsoleColor background)
{
HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleTextAttribute(hConsole,
(WORD)((background << 4) | text));
}

13.

Вузов функция SetColor() в цикле игры
x = rand()%80; y = rand()%25; // задаём координаты х и y
gotoXY(x,y); // устанавливаем курсор в (x,y)
SetColor(Yellow, Black); // устанавливаем цвет героя желтый
printf("%c", face); // выводим символ
do {
if (kbhit()) {
key = _getch(); //чтобы работал getch, нужно создать
//проект без "проверок времени жизни SDL"
system("cls");
switch(key){
case 'w': y--; SetColor(LightBlue, Black);
printf("UP");break;
case 's': y++; printf("DOWN"); break;
case 'a': x--; printf("LEFT"); break;
case 'd': x++; printf("RIGHT"); break;
}
SetColor(Yellow, Black);
gotoXY(x,y);
printf("%c", face);
}
} while(key != 27);

14.

Проверка на выход за границы экрана
do {
if (kbhit()) {
key = _getch();
system("cls");
switch(key){
case 'w': if (y>0) y--;
SetColor(LightBlue, Black);
printf("UP"); break;
case 's': y++; printf("DOWN"); break;
case 'a': x--; printf("LEFT"); break;
case 'd': x++; printf("RIGHT"); break;
}
SetColor(Yellow, Black);
gotoXY(x,y);
printf("%c", face);
}
} while(key != 27);

15.

Неуправляемое движение
Зададим переменную dir (direction). Она будет
отвечать за выбор направления и инициализироваться
случайным чилом от 0 до 3.
dir = rand()%4;
0 – вверх
1 – вниз
2 – влево
3 - вправо
Функция: Sleep(1000);// ждать 1 секунду
Функция задерживает движение на экране

16.

Алгоритм неуправляемого движения
1. Задать начальные координаты БОТА и вывести его
на экран
2. Очистить экран
3. Задать направление случайным числом
4. Выбрать направление и вычислить координату
5. Вывести на экран БОТА
6. Проверить: нажата ли клавиша? Если не нажата, то
перейти на пункт 2

17.

Цикл неуправляемого движения
do {
system("cls");
dir = rand()%4;
switch(dir){
case 0: if (y>0) y--;
SetColor(LightBlue, Black);
printf("UP"); break;
case 1: y++; printf("DOWN"); break;
case 2: x--; printf("LEFT"); break;
case 3: x++; printf("RIGHT"); break;
}
gotoXY(x,y);
SetColor(Yellow, Black);
printf("%c", face);
Sleep(200); // ждать 1/5 секунды
} while(!kbhit()); // пока не нажата клавиша
English     Русский Правила