Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何同时使用多个while循环?_C_While Loop - Fatal编程技术网

C 如何同时使用多个while循环?

C 如何同时使用多个while循环?,c,while-loop,C,While Loop,比如说,在电子游戏中,我需要两个while循环同时监听,一个到: while (up == true) movePlayerX(2) 另一项是: while (right == true) movePlayerY(2) 如果出现以下情况,我如何让玩家同时向上和向右移动: int main() { while(1) printf("hello"); while(1) printf("world"); return(0); } 只会回你好吗?有可能

比如说,在电子游戏中,我需要两个while循环同时监听,一个到:

while (up == true)
    movePlayerX(2)
另一项是:

while (right == true)
    movePlayerY(2)
如果出现以下情况,我如何让玩家同时向上和向右移动:

int main()
{

while(1)
    printf("hello");

while(1)
    printf("world");

    return(0);
}
只会回你好吗?有可能让两个while循环同时工作还是必须轮流工作?我知道在汇编级,他们必须轮流进行,但对于高级编程:

while(1)
{
    while( up == true)
            movePlayerX(2)
            break;
    while( right == true)
            movePlayerY(2)
            break;
}
这种情况如何:

while(1)
    answer = promptUserForData();                     //user enters data at their own pace
    chart = addAnswerToChart(answer);                 //char is updated when user updates it

while(1)
    chart = someOtherDataThatEffectsChart(randData);  //something else effects the chart

while(1)
    printOutChart(chart);                             //chart is constantly being printed out

对于您提出的关于同时运行多个while的问题,我认为它可以工作的唯一方式是在多个并行线程上,在您的情况下,这是没有理由的,因为您应该重新构造代码以更智能地工作

我不知道你是如何设置你的游戏的,但是最好的方法是在一个无限循环中分步执行游戏逻辑。 你的循环应该是这样的,而不是向上询问:

void mainGameLoop () {
   while (!gameQuit) {
      handleInput();
      handleLogic(); 
      handleDrawing();
}
这样,游戏的每个循环首先处理输入事件,如键盘按下或鼠标单击/移动,然后处理游戏逻辑并将其绘制到屏幕上

对于球员的移动有很多方法,但我建议的是X/Y加速模型。它的工作方式是,player对象有一个xSpeed和ySpeed变量,它告诉他在该方向上移动的速度。对于移动,您要做的是,如果按下移动键,如果移动是在轴速度的负方向,您可以增加或减少,或者直到它达到您想要的最大速度

然后,在逻辑中,你只需添加一个摩擦力,它会减慢玩家的速度,因此,如果没有按下移动键,玩家会在几圈后停止

最后,要移动玩家,只需将xSpeed和ySpeed添加到他的位置

非常简单的实现如下所示。我将使用一些表示输入处理的伪函数

void handleInput() {
   if (keyPressed)
      switch(key) {
         case upArrow: 
            ySpeed -= 0.1;
            break;
         case downArrow: 
            ySpeed += 0.1;
            break;
         case leftArrow: 
            ySpeed -= 0.1;
            break;
         case rightArrow: 
            ySpeed += 0.1;
            break;
      }
}

void handleLogic() {
   // Clamp speed values to maximum of |1| speed
   if (ySpeed > 1)
       ySpeed = 1;
   if (ySpeed < -1)
       ySpeed = -1;
   if (xSpeed > 1)
       xSpeed = 1;
   if (xSpeed < -1)
       xSpeed = -1;

   // Friction slowing down the movement if no movement keys are pressed
   if (ySpeed > 0)
      ySpeed -= 0.05;
   else if (ySpeed < 0)
      ySpeed += 0.05;

   if (xSpeed > 0)
      xSpeed -= 0.05;
   else if (xSpeed > 0)
      xSpeed -= 0.05;

   xPosition += xSpeed;
   yPosition += ySpeed;
}

值仅用于此处的示例。你可以试着用它们来处理你想要的角色。

也许你想要while 1{if up movePlayerX2;if right moveplayer2;}我想你在我第一次编辑之前就已经发布了,但无论如何,我认为你的答案比我的第四段代码更优雅,但仍然是等效的。我更想弄清楚如何更新输入到另一个程序中的数据,同时从另一个源收集数据并提示用户输入。哦,现在我看到了你的新编辑。是的,现在我认为它是等效的,虽然从while循环中断而不是仅仅使用if有点奇怪。是的,我同意while-break的错误用法。无论如何,我想我需要两个独立的可执行文件和一个文件来完成最后一部分,因为不管我怎么想,我都会用用户输入来暂停我的程序。视频游戏如何说更新AIs&environment,同时仍在收听while 1{if up movePlayerX2;if right MovePlayer2;}感谢您的回复。我想说的是一般性的,但游戏只是一个例子,我正在构建银行家算法的图形表示。一个窗口将有一个系统资源的实时图形,另一个窗口将提示用户输入。从你的回答中我得到了一个想法:我可以让用户输入成为一个单独的程序,写入一个文件或线程,我还没有真正学习线程,所以我想那是我的夜晚,然后你说的handleInput函数可以只听文件或处理线程。再次感谢。