如何在c ++中随机移动球?

时间:2014-04-19 20:51:38

标签: c++ random

我创造了一个简单的网球比赛,其中球员是线,球是一个点。我在使用兰德移动球时遇到了麻烦。我希望球在y轴上随机移动,因为它在x轴上增加1。 这是程序。

我使用的图书馆:

 #include <stdio.h>     
 #include <stdlib.h>    
 #include <time.h>   

void punto::viajar (char dir,int largo,int anch)// direction, length and width
{
    if (dir=='d') // if direction is to the right
    {
        x++; // moves to the right by 1
        srand(time(NULL)); // here is my problem
        if (rand()%2==0 && y<largo) // if ball is within the court's borders
        {
            y++;
        }
    }
    else
    {
        y--;
    }
    if (dir=='i') // to the left
    {
        x--;
        srand(time(NULL));
        if (rand()%2==0 && y<largo)
        {
            y--;
        }
    }
    else
    {
        y++;
    }
}

我怎么能移动球?

编辑:这是我打电话给viajar的地方:

void juego:: funcionar()
 {
dibujar(); // draws ball, court, and players
char diraux='d'; // auxiliary direction
char tecla; // char key
while (1==1)
{
  while (pel.GetX()>0 && pel.GetX()<ancho) // while the ball is within court's range
  {
    pel.viajar(diraux,30,60); // ball travels to right, and court's length=30, width=60
    if (kbhit()) // if any of the two players presses a key
    {
       tecla=getch();
       moverraquetas(tecla); // if s/b is pressed, player 1 moves. if 2/8 is pressed, player 2 moves.
    }
    if (r1.toca(pel)=='S') //if player 1 touches the ball,
        diraux='d'; // ball moves to the right
    if (r2.toca(pel)=='S') // if player 2 touches the ball,
      diraux='i'; // ball moves to the left
  }
}

对不起这个令人困惑的解释我很抱歉!

4 个答案:

答案 0 :(得分:2)

srand初始化整个随机流 - 每次调用rand时都不应该调用它,否则你将总是获得相同的值(流中的第一个,给定srands的参数)。启动程序时只调用一次。

此外,rand() % small_int不是一种非常可靠的随机方法,因为它不能保证均匀分布。看这里例如 - Why does rand() % 7 always return 0?

答案 1 :(得分:2)

在程序启动时只调用一次srand()。每次调用rand()时设置随机数种子是不必要的,并且不允许rand()按预期生成其序列。此外,如果您使用相同的值调用srand()rand()将生成相同的值,因此如果您在同一秒内调用它两次,则使用当前时间作为种子会产生不良影响。

在许多情况下,根本没有必要调用srand() - 如果你的球在每次你的程序运行时使用相同的随机序列真的很重要 - 玩家的“随机”行为会让每场比赛在任何情况下都不同。

答案 2 :(得分:1)

虽然已经注意到使用srand()存在问题,但我认为这不是您最大的问题。

例如,如果dir=='d',y可能会递增,但它将始终在dir=='i'的else子句中递增。同样,当dir=='i'时,y将减少两次。

控制流程应该是:

if (dir=='d') // if direction is to the right
{
    x++ ;
    if( ... )
    {
        y++;
    }
    else
    {
        y--;
    }
}
else if (dir=='i') // MUTUALLY EXCLUSIVE TO 'd'
{
    x--;
    if( ... )
    {
        y--;
    }
    else
    {
        y++;
    }
}

答案 3 :(得分:-1)

使用此代码获取随机值

srand (time(NULL)); cout << (rand() % 100 + 1)

我希望这会起作用