Выполнение нескольких функций одновременно в переполнении стека

В настоящее время я работаю в C ++. Мне нужно сделать игру «Ловец чисел», поэтому я должен делать две вещи одновременно

  1. Движущийся персонаж
  2. Числа непрерывно падают сверху.

Кроме того, мне нужно бросить более одного числа одновременно.
Как я могу сделать все это одновременно?

0

Решение

Вы основаны на очень ошибочное помещение. Это не требует одновременного выполнения каких-либо действий. Все, что вам нужно сделать, это сделать каждую вещь, а затем обновить. Вам нужно получить книгу об очень простой игровой архитектуре.

5

Другие решения

Я считаю, что вам нужно начать с вашего проекта и учиться у других одновременно. По сути, вам не нужно делать все это одновременно, никто не наблюдает, если вы делаете это одновременно под капотом, вам нужно всего лишь сделать все это до того, как вы представите результаты пользователю.

1

Есть случаи, когда нам нужно вызывать несколько функций. И это то место, где многопоточность вступает в действие. Например, на окнах вы можете использовать CreateThreadEx функции для вызова нескольких функций одновременно. Однако вам придется иметь дело со сложностями многопоточности.

Читайте статьи о потоке, и вы получите его основные понятия.

0

Я немного уточню другие ответы, посвященные изучению программирования игр, и предоставлю некоторые базовые сведения.

Основная задача вашей программы — выполнить цикл (до тех пор, пока игра не закончится или игрок не устанет) и на каждой итерации:

  • рассчитать текущее состояние игры,
  • сделать вид,
  • читать ввод игрока.

Вам не нужно делать это в таком порядке, игра должна работать достаточно быстро, чтобы казалось, что все происходит одновременно.

Состояние игры — это состояние всех элементов, которые являются частью игры:

  • фон,
  • неподвижные объекты,
  • движущиеся объекты,
  • объекты, генерирующие другие объекты,
  • объекты, разрушающие другие объекты,
  • игрок,
  • и т.п.

Там могут быть правила, регулирующие, как все эти объекты, разные правила для разных объектов, взаимодействия между объектами и многое другое. Вам решать кодировать эти правила в движке и следить за тем, чтобы все объекты обновлялись. Самый простой способ — перебрать весь список ваших объектов и обновить их один за другим.

Рендеринг, в основном, проходит через все ваши объекты и рисует их на экране (если они видны) в соответствии с их состоянием (цвет, положение и т. Д.).

Опрос ввода — это просто: проверка, сделал ли игрок какой-либо ввод, используя клавиатуру, мышь, сенсорный экран или любое другое устройство ввода, с которым вы хотите работать.

В случае вашего проекта ваш список объектов будет просто списком падающих символов, основным правилом является гравитация (или постоянная скорость, спускающаяся вниз по экрану), а ввод — клавиатура.

Если вы хотите, чтобы игра работала в текстовом режиме, основными препятствиями будут перемещение курсора, получение неблокирующего ввода, очистка экрана. В UNIX ищите проклятий библиотека, которая обеспечивает все необходимые функции.

Учитывая простоту игры, ваша программа будет работать очень быстро, поэтому вы захотите включить в цикл небольшой период сна. Однако лучше иметь постоянную частоту кадров (не менее 30 Гц), чтобы вы могли измерить время, затрачиваемое на выполнение работы, и оставить процесс в спящем режиме в течение оставшегося времени, чтобы достичь правильного времени для одного цикла.

И последнее: не смотрите на потоки или параллельное программирование для этого проекта, это не поможет. Рендеринг должен выполняться одним потоком в большинстве графических установок, и в итоге вам придется выполнять большую синхронизацию, если вы не используете обмен сообщениями между потоками (это было бы интересным упражнением, но оставьте его для версии 2).

0

Матрица падающих чисел

Код для, если вы находитесь в Windows:

/* The Matrix  falling numbers */

#include <iostream>
#include <windows.h>

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <conio.h>
using namespace std;#define KB_UP 72
#define KB_DOWN 80
#define KB_LEFT 75
#define KB_RIGHT 77
#define KB_ESCAPE 27
#define KB_F8 66/* Variables*/

char screen_buffer[2000]={' '};
int y_coord[2000]={0};
int x=0, y=0,dy=0;
int XMAX=77;
int YMAX=23;
int KB_code=0;
bool QuitGame=false;
int platformX=35, platformY=23;

/* function prototypes*/

void gotoxy(int x, int y);
void clrscr(void);
void setcolor(WORD color);
void simple_keyboard_input();
void draw_falling_numbers();
void draw_platform();

/*  main  */

int main(void)
{
/* generate random seed */
srand ( time(NULL) );

/* generate random number*/
for(int i=0;i<XMAX;i++) y_coord[i]=   rand() % YMAX;

while(!QuitGame)
{
/* simple keyboard input */
simple_keyboard_input();

/* draw falling numbers */
draw_falling_numbers();

}

/* restore text color */
setcolor(7);
clrscr( );
cout<<" \n";

cout<<" \nPress any key to continue\n";
cin.ignore();
cin.get();

return 0;
}

/* functions  */

void draw_falling_numbers()
{

for(x=0;x<=XMAX;x++)
{
/* generate random number */
int MatixNumber=rand() % 2 ;

/* update falling number */
y_coord[x]=y_coord[x]+1;

if (y_coord[x]>YMAX) y_coord[x]=0;

/* draw dark color */
setcolor(2);
gotoxy(x ,y_coord[x]-1); cout<<"  "<<MatixNumber<<"   ";

/* draw light color */
setcolor(10);
gotoxy(x ,y_coord[x]); cout<<"  "<<MatixNumber<<"   ";
}
/* wait some milliseconds */
Sleep(50);
//clrscr( );
}void draw_platform()
{
setcolor(7);
gotoxy(platformX ,platformY);cout<<"       ";

gotoxy(platformX ,platformY);cout<<"ÜÜÜÜÜÜ";
setcolor(7);
Sleep(5);
}void simple_keyboard_input()
{
if (kbhit())
{
KB_code = getch();
//cout<<"KB_code = "<<KB_code<<"\n";

switch (KB_code)
{

case KB_ESCAPE:

QuitGame=true;

break;

case KB_LEFT:
//Do something
platformX=platformX-4;if(platformX<3) platformX=3;
break;

case KB_RIGHT:
//Do something
platformX=platformX+4;if(platformX>74) platformX=74;
break;

case KB_UP:
//Do something
break;

case KB_DOWN:
//Do something
break;

}

}

}void setcolor(WORD color)
{
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),color);
return;
}void gotoxy(int x, int y)
{
static HANDLE hStdout = NULL;
COORD coord;

coord.X = x;
coord.Y = y;

if(!hStdout)
{
hStdout = GetStdHandle(STD_OUTPUT_HANDLE);
}

SetConsoleCursorPosition(hStdout,coord);
}void clrscr(void)
{
static HANDLE hStdout = NULL;
static CONSOLE_SCREEN_BUFFER_INFO csbi;
const COORD startCoords = {0,0};
DWORD dummy;

if(!hStdout)
{
hStdout = GetStdHandle(STD_OUTPUT_HANDLE);
GetConsoleScreenBufferInfo(hStdout,&csbi);
}

FillConsoleOutputCharacter(hStdout,
' ',
csbi.dwSize.X * csbi.dwSize.Y,
startCoords,
&dummy);
gotoxy(0,0);
}
0

Посмотрите на параллельные методы программирования, которые будут включать использование openmp или pthreads. Единственная причина, по которой я предлагаю openmp, заключается в том, что это довольно легко узнать, если у вас есть ограниченное количество времени, и в некоторой степени pthreads довольно легко обернуть вашу голову. Также было бы полезно узнать, какую платформу вы используете, чтобы каждый ответил на вопрос более определенным образом.

-1
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector