halfdelay() не подходит из-за того что ожидание прерывается после нажатия клавиши. И можно ли как нибудь запустить одновременно выполнение sleep() и getch()?
Система - OS X Mountain Lion 10.8.4
Другие языки программирования и технологии
Создаю консольную змейку на C++ и ncurses. Как зделать фиксированное время ожидания нажатия клавишы?
Всякие sleep() в играх не нужны, нужно смотреть на время и определять, что определенное событие должно наступить, к примеру, каждые 0.1 секунды происходит передвижение протагониста, каждые три секунды возникает новая помеха и т. д. В цикл можно вставить короткий sleep() (1 - 10 миллисекунд) , чтобы процесс не грузил процессор на 100%.
Как это можно сделать на примере той же змейки, показано ниже (о чем написано выше, выделено жирным) :
#include <time.h>
#include <string.h>
#include <stdlib.h>
#include <curses.h>
#define putxy(c, x, y) do { move(y, x); addch(c); } while (0);
#define CPS CLOCKS_PER_SEC
int main() {
struct { int x; int y; } sc[2001];
int l = 5, dx = 1, dy = 0, bx = -1, by = -1, b = 1, score = 0, c, run = 1, g = 0;
clock_t mt, bt;
initscr(); noecho(); curs_set(0); keypad(stdscr, 1); nodelay(stdscr, 1);
for (c = 0; c < l; ++c) {
putxy('#', c, 0);
sc[l - c - 1].x = c; sc[l - c - 1].y = 0;
}
mt = bt = clock();
while (run) {
switch (getch()) {
case KEY_UP: dx = 0; dy = -1; break;
case KEY_DOWN: dx = 0; dy = 1; break;
case KEY_LEFT: dx = -1; dy = 0; break;
case KEY_RIGHT: dx = 1; dy = 0; break;
case 27: run = 0; break;
}
if (clock() - mt >= CPS * 0.1) { // пришло время передвижения
int x = sc[0].x + dx, y = sc[0].y + dy;
if (x == bx && y == by) {
score += b * 10;
bx = -1; by = -1;
g = 10;
}
putxy('#', x, y);
putxy(' ', sc[l - 1].x, sc[l - 1].y);
memmove(sc + 1, sc, l * sizeof(sc[0]));
sc[0].x = x; sc[0].y = y;
if (g) --g, ++l;
if (x > 79 || x < 0 || y > 24 || y < 0) run = 0;
for (c = 1; c < l; ++c) if (x == sc[c].x && y == sc[c].y) run = 0;
mt += CPS * 0.1;
}
if (clock() - bt >= CPS) { // пришло время глянуть, шо там с бонусом
if (!(--b)) {
int cf = 1;
putxy(' ', bx, by);
while (cf) {
bx = rand() % 80; by = rand() % 25;
cf = 0;
for (c = 0; c < l; ++c) if (bx == sc[c].x && by == sc[c].y) cf = 1;
}
putxy('*', bx, by);
b = 10;
}
bt += CPS;
}
// сюда можно вставить sleep
}
clear(); nodelay(stdscr, 0);
printw("game over!\nyou score: %d\npress any key...", score);
getch(); endwin();
}
Как это можно сделать на примере той же змейки, показано ниже (о чем написано выше, выделено жирным) :
#include <time.h>
#include <string.h>
#include <stdlib.h>
#include <curses.h>
#define putxy(c, x, y) do { move(y, x); addch(c); } while (0);
#define CPS CLOCKS_PER_SEC
int main() {
struct { int x; int y; } sc[2001];
int l = 5, dx = 1, dy = 0, bx = -1, by = -1, b = 1, score = 0, c, run = 1, g = 0;
clock_t mt, bt;
initscr(); noecho(); curs_set(0); keypad(stdscr, 1); nodelay(stdscr, 1);
for (c = 0; c < l; ++c) {
putxy('#', c, 0);
sc[l - c - 1].x = c; sc[l - c - 1].y = 0;
}
mt = bt = clock();
while (run) {
switch (getch()) {
case KEY_UP: dx = 0; dy = -1; break;
case KEY_DOWN: dx = 0; dy = 1; break;
case KEY_LEFT: dx = -1; dy = 0; break;
case KEY_RIGHT: dx = 1; dy = 0; break;
case 27: run = 0; break;
}
if (clock() - mt >= CPS * 0.1) { // пришло время передвижения
int x = sc[0].x + dx, y = sc[0].y + dy;
if (x == bx && y == by) {
score += b * 10;
bx = -1; by = -1;
g = 10;
}
putxy('#', x, y);
putxy(' ', sc[l - 1].x, sc[l - 1].y);
memmove(sc + 1, sc, l * sizeof(sc[0]));
sc[0].x = x; sc[0].y = y;
if (g) --g, ++l;
if (x > 79 || x < 0 || y > 24 || y < 0) run = 0;
for (c = 1; c < l; ++c) if (x == sc[c].x && y == sc[c].y) run = 0;
mt += CPS * 0.1;
}
if (clock() - bt >= CPS) { // пришло время глянуть, шо там с бонусом
if (!(--b)) {
int cf = 1;
putxy(' ', bx, by);
while (cf) {
bx = rand() % 80; by = rand() % 25;
cf = 0;
for (c = 0; c < l; ++c) if (bx == sc[c].x && by == sc[c].y) cf = 1;
}
putxy('*', bx, by);
b = 10;
}
bt += CPS;
}
// сюда можно вставить sleep
}
clear(); nodelay(stdscr, 0);
printw("game over!\nyou score: %d\npress any key...", score);
getch(); endwin();
}
Похожие вопросы
- Я написал прстой консольный калькулятр на c++ .Правдо еще не научился делать сразу несколько действий. Оцените.
- консольный ввод в C++ ?
- Как сделать чтобы змейка продолжала путь без нажатия клавиш? C++
- c#. Сортировка массива в отдельном методе. Консольное приложение.
- Для чего нужны консольные программы, и что означает system("pause") в C++ ?
- Работаю в Visua C++ 2008. консольное приложение Win32/
- Консольная программа (элементарная) на C++.
- C++ Win32 API - Как создать окно фиксированного размера?
- Delph под какие задачи хуже чем C++? Что на нём нельзя зделать?
- Консольная графика Visual Studio 2008 C++