我创造了一个简单的网球比赛,其中球员是线,球是一个点。我在使用兰德移动球时遇到了麻烦。我希望球在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
}
}
对不起这个令人困惑的解释我很抱歉!
答案 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)
我希望这会起作用