Другие языки программирования и технологии

Создаю консольную змейку на C++ и ncurses. Как зделать фиксированное время ожидания нажатия клавишы?

halfdelay() не подходит из-за того что ожидание прерывается после нажатия клавиши. И можно ли как нибудь запустить одновременно выполнение sleep() и getch()?

Система - OS X Mountain Lion 10.8.4
Всякие 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();
}
Эрик Темирбаев
Эрик Темирбаев
70 454
Лучший ответ