首页 > 解决方案 > Srand() 和 rand() 仍然生成相同的随机数

问题描述

抱歉,我是 c++ 新手,但我尝试按照 youtube 上的游戏教程进行操作,但我认为逻辑有点错误,因为即使使用了 srand 和 rand 函数,敌人的位置在运行时似乎也会创建一个模式,我认为正在使用相同的随机数。

#include <iostream>
#include <curses.h>
#include <time.h>
using namespace std;

void gotoxy (int x, int y){
  move (y, x);
}

bool exitGame;
bool isMoving;
int mycatX;
int mycatY;
int enemyX[4];
int enemyY[4] = {-9, -19, -29,-39};
int enemyPositionX[3] = {3, 18 ,32};

void startUp () {
  mycatX = 18;
  mycatY = 15;
  srand(time(NULL));
  for(int i = 0; i < 4; i++){
    enemyX[i] = enemyPositionX[rand() % 3];
  }
}

void layout () {
  if (isMoving){
      gotoxy (0, 0); printw ("##                                       ##");
      gotoxy (0, 1); printw ("##            ||            ||           ##");
      gotoxy (0, 2); printw ("##                                       ##");
      gotoxy (0, 3); printw ("##            ||            ||           ##");
      gotoxy (0, 4); printw ("##                                       ##");                     
      gotoxy (0, 5); printw ("##            ||            ||           ##");
      gotoxy (0, 6); printw ("##                                       ##");
      gotoxy (0, 7); printw ("##            ||            ||           ##");
      gotoxy (0, 8); printw ("##                                       ##");
      gotoxy (0, 9); printw ("##            ||            ||           ##");
      gotoxy (0, 10);printw ("##                                       ##");
      gotoxy (0, 11);printw ("##            ||            ||           ##");
      gotoxy (0, 12);printw ("##                                       ##");
      gotoxy (0, 13);printw ("##            ||            ||           ##");
      gotoxy (0, 14);printw ("##                                       ##");
      gotoxy (0, 15);printw ("##            ||            ||           ##");
      gotoxy (0, 16);printw ("##                                       ##");
      gotoxy (0, 17);printw ("##            ||            ||           ##");
      gotoxy (0, 18);printw ("##                                       ##");
      gotoxy (0, 19);printw ("##            ||            ||           ##");
      gotoxy (0, 20);printw ("##                                       ##");
      isMoving = false;
    }else{
      gotoxy (0, 0); printw ("##            ||            ||           ##");
      gotoxy (0, 1); printw ("##                                       ##");
      gotoxy (0, 2); printw ("##            ||            ||           ##");
      gotoxy (0, 3); printw ("##                                       ##");
      gotoxy (0, 4); printw ("##            ||            ||           ##");
      gotoxy (0, 5); printw ("##                                       ##");
      gotoxy (0, 6); printw ("##            ||            ||           ##");
      gotoxy (0, 7); printw ("##                                       ##");
      gotoxy (0, 8); printw ("##            ||            ||           ##");
      gotoxy (0, 9); printw ("##                                       ##");
      gotoxy (0, 10);printw ("##            ||            ||           ##");
      gotoxy (0, 11);printw ("##                                       ##");
      gotoxy (0, 12);printw ("##            ||            ||           ##");
      gotoxy (0, 13);printw ("##                                       ##");
      gotoxy (0, 14);printw ("##            ||            ||           ##");
      gotoxy (0, 15);printw ("##                                       ##");
      gotoxy (0, 16);printw ("##            ||            ||           ##");
      gotoxy (0, 17);printw ("##                                       ##");
      gotoxy (0, 18);printw ("##            ||            ||           ##");
      gotoxy (0, 19);printw ("##                                       ##");
      gotoxy (0, 20);printw ("##            ||            ||           ##");
      isMoving= true;
        
    }
}

void mycat ()
{
  gotoxy (mycatX, mycatY);     printw ("   ^^   ");
  gotoxy (mycatX, mycatY +1);  printw ("=( ^ ^)=");
  gotoxy (mycatX, mycatY + 2); printw ("  o  o ");
  gotoxy (mycatX, mycatY + 3); printw ("  (  )  ");
  gotoxy (mycatX, mycatY + 4); printw ("    \\   ");

}

void enemymouse ()
{
  for(int i = 0; i < 4; i++){
      if(enemyY[i] >= 0){
        gotoxy (enemyX[i], enemyY[i]);       printw ("  \\/ ");
        }
      if(enemyY[i]+1 >= 0){gotoxy (enemyX[i], enemyY[i] + 1); printw ("  ()  ");}
      if(enemyY[i]+2 >= 0){gotoxy (enemyX[i], enemyY[i] + 2); printw (" /  \\");}
      if(enemyY[i]+3 >= 0){gotoxy (enemyX[i], enemyY[i] + 3); printw ("((__))");}
      if(enemyY[i]+4 >= 0){gotoxy (enemyX[i], enemyY[i] + 4); printw ("   |  ");}    
         
         
          
      if(enemyY[i] > 20){gotoxy (enemyX[i], enemyY[i]);       printw ("         ");}
      if(enemyY[i]+1 > 20){gotoxy (enemyX[i], enemyY[i] + 1); printw ("         ");}
      if(enemyY[i]+2 > 20){gotoxy (enemyX[i], enemyY[i] + 2); printw ("         ");}
      if(enemyY[i]+3 > 20){gotoxy (enemyX[i], enemyY[i] + 3); printw ("         ");}
      if(enemyY[i]+4 > 20){gotoxy (enemyX[i], enemyY[i] + 4); printw ("         ");}
      if(enemyY[i] > 20) enemyY[i] = -10;
      enemyY[i]++;  
    }    
}
 

void controller (){
  nodelay (stdscr, TRUE);
  switch (getch ()) {
    case 'a':
      mycatX = mycatX - 13;
      break;
    case 'd':
      mycatX = mycatX + 13;
      break;
    case 'w':
      mycatY = mycatY - 2;
      break;
    case 's':
      mycatY = mycatY + 2;
      break;


    }

}

int main (){
  initscr ();
  startUp ();
  noecho ();
  scrollok (stdscr, TRUE);
  nodelay (stdscr, TRUE);
  while (!exitGame){
      layout ();
      mycat ();
      enemymouse ();
      controller ();
      napms(200);
      curs_set(0);
    }

  return 0;
}

标签: c++randomnumbers

解决方案


rand()实际上并不生成真正的随机数,而是伪随机数。因此,如果您最终开始注意到一种模式,那还可以,因为实际上有一个规则可以选择“随机”数字。

有关更多信息,请参阅其他帖子,例如:

srand(time(NULL)) 产生相似的结果

c++ random 不起作用(总是返回相同的值)


推荐阅读