Exemplo n.º 1
0
/* static inline */
double SLICE(VAR)(double x0)
{
  double y0;

  y0 = LL_FUN(VAR)(x0);

  // x1 is the proposal for the next value
  double x1    = -x0 * log(genrand_real3());
  double y1    = LL_FUN(VAR)(x1);

  double rat = x0 / x1;
  // logP is the log of the probability of transitioning to x1
  double logP = y1 - y0 + log(rat) + 1/rat - rat;

  if(logP > 0) {
    return x1;
  }
  else {
    if(log(genrand_real3()) < logP) {
      return x1;
    }
    else {
      return x0;
    }
  }
Exemplo n.º 2
0
/* Return the number of links to use for a new node. Result's range is
   1..maxcount */
static int
pick_link_count(int maxcount)
{
  int lev = (int) floor(log(genrand_real3()) / log(P));
  lev = -lev;
  if (lev > maxcount)
    return maxcount;
  else
    return lev;
}
Exemplo n.º 3
0
int main(int argc, char** argv) {
  int seed = 12345;
  int n = 100;
  int i;

  /* set seed of Mersenne-Twister pseudo random number generator */
  init_genrand(seed);

  /* generate (0,1) random numbers */
  for (i = 0; i < n; ++i)
    printf("%d %15.10f\n", i, genrand_real3());
}
Exemplo n.º 4
0
int EddSPM_cycle(struct SimData *SD, double n) {
  if (SD->flags & S12_FLAG_INCOMPAT & ~S12_FLAG_FROZEN ) {
    printf("Incompatible features seen: %d (bxcon)\n", SD->flags);
    exit(205);
  }
  if (SD->MLLlen == 0 && SD->MLLlen_down == 0) {
    // If no moves are possible, then time passes by instantly.
    SD->MLLextraTime = 0;
    return(0);
  }
  int frozenEnabled = SD->flags & S12_FLAG_FROZEN;

  int naccept = 0;
  //struct LList llist; llist.n = 0;

  double maxTime = (double) n;
  double time = SD->MLLextraTime;
  //printf("eddCycle: time:%f maxTime%f\n", time, maxTime);

  double c = 1./(1. + exp(SD->beta));
  //printf("beta:%f c:%f\n", SD->beta, c);
  double wUp = 1-(c);
  double wDown = c;
  double eta = 0;
  if (SD->hardness != 1./0.)
    eta = exp(-SD->beta*SD->hardness);

  double pdf_wDown        = wDown * (SD->MLLlen_down);
  double pdf_wUp          = wUp   * (SD->MLLlen     );
  double pdf_wDown_frozen = eta*wDown*(SD->lattSize - SD->N - SD->MLLlen_down);
  double pdf_wUp_frozen   = eta*wUp  *(SD->lattSize);
  double cdf_wDown        =                    pdf_wDown;
  double cdf_wUp          = cdf_wDown        + pdf_wUp;
  double cdf_wDown_frozen = cdf_wUp          + pdf_wDown_frozen;
  double cdf_wUp_frozen   = cdf_wDown_frozen + pdf_wUp_frozen;

  double wTot = cdf_wUp_frozen ;

  if (time == -1.) {
    // pre-move, advance time until the first event.  Otherwise we
    // always end up moving right at time == 0
    double timestep = 1./wTot;
    timestep *= -log(genrand_real3());
    time = timestep;
  }

  while (time < maxTime) {
    int pos;
    double rand = genrand_real2() * wTot;

    if (rand < cdf_wDown) {
      // pick some down spin to flip up
      int i = (int) (rand / wDown);
      pos = SD->MLL_down[i];
      if (debugedd)
	printf("move: flipping down->up at pos:%d\n", pos);
      FAremoveFromMLL(SD, 'd', pos);
      addParticle(SD, pos, SD->inserttype);
      FAaddToMLL(SD, 'u', pos);
      SD->persist[pos] = 1;
    } else if (rand < cdf_wUp) {
      // pick some up spin to flip down
      int i = (int) ((rand - cdf_wDown)  / wUp);
      pos = SD->MLL[i];
      if (debugedd) {
	printf("move: flipping up->down at pos:%d\n", pos);
	if (i > SD->MLLlen )
	  exit(158);
      }
      FAremoveFromMLL(SD, 'u', pos);
      delParticle(SD, pos);
      FAaddToMLL(SD, 'd', pos);
      SD->persist[pos] = 1;
    } else if (rand < cdf_wDown_frozen) {
      // Pick a immobile down spin to flip.
      exit(56); // This is not working yet!
      while (1) {
	// Find a down spin that isn't active
	pos = SD->lattSize * genrand_real2();
	if (SD->lattsite[pos] == S12_EMPTYSITE && /* site is down */ 
	    SD->MLLr[pos] == -1 )                 /* site is not mobile */
	  break;
      }
      if (debugedd) {
	// Some error checking
	printf("move: (immoblie) flipping down->up at pos:%d\n", pos);
      }
      if ( frozenEnabled && SD->frozen[pos]) {
	// If we are frozen, do nothing.
      } else {
	addParticle(SD, pos, SD->inserttype);
	SD->persist[pos] = 1;
      }
    } else { // (rand < cdf_wUp_frozen)
      // Pick a immobile up spin to flip.
      exit(56); // This is not working yet!
      while (1) {
	// Find a down spin that isn't active
	int i = SD->N * genrand_real2();
	pos = SD->atompos[i];
	if (SD->MLLr[pos] == -1 )                 /* site is not mobile */
	  break;
      }
      if (debugedd) {
	// Some error checking
	printf("move: (immobile) flipping up->down at pos:%d\n", pos);
	if (SD->lattsite[pos] == S12_EMPTYSITE) exit(165);
      }
      if ( frozenEnabled && SD->frozen[pos]) {
	// If we are frozen, do nothing.
      } else {
	delParticle(SD, pos);
	SD->persist[pos] = 1;
      }
    }

    //llist.n = 0;

    EddSPM_updateLatNeighbors(SD, pos);

    naccept += 1;

    pdf_wDown        = wDown * (SD->MLLlen_down);
    pdf_wUp          = wUp   * (SD->MLLlen     );
    pdf_wDown_frozen = eta*wDown*(SD->lattSize - SD->N - SD->MLLlen_down);
    pdf_wUp_frozen   = eta*wUp  *(SD->lattSize);
    cdf_wDown        =                    pdf_wDown;
    cdf_wUp          = cdf_wDown        + pdf_wUp;
    cdf_wDown_frozen = cdf_wUp          + pdf_wDown_frozen;
    cdf_wUp_frozen   = cdf_wDown_frozen + pdf_wUp_frozen;

    wTot = cdf_wUp_frozen ;

    // Advance time
    double timestep = 1./wTot;
    timestep *= -log(genrand_real3());  // exponential distribution of times.
                                        // genrand_real3()  -> (0, 1)
    time += timestep;
    //printf("interval: %f\n", (SD->N * SD->connMax) / (double)SD->MLLlen);
    //if (naccept == 1)
    //return(naccept);
  }
  // MLLextraTime is a positive, the amount to increment before our next stop.
  SD->MLLextraTime = time - maxTime;
  //printf("eddCycle: final time:%f maxTime:%f extraTime:%f\n", 
  // time, maxTime, SD->MLLextraTime);

  return(naccept);
}
Exemplo n.º 5
0
int main()
{
	// Initialisations
	tabMT = new double[nbReplic];

	Hasard::init();
	for (int k = 0; k < nbReplic; ++k)
		tabMT[k] = genrand_real3();

	// Creation d'un probleme au hasard
	{
		Probleme<> * pb = new Probleme<>(nbUsines, nbClients, 20, 50, 50, 100, getNextValue);

		// Exportation du probleme
		try
		{
			pb->exporter("resources\\test.txt");
		}
		catch (exception & e)
		{
			cout << "what : " << e.what() << endl;
		}

		delete pb;
	}

	double index_cpy = index;

	// Test int
	{
		// Initialisation pour tirer toujours les mêmes nombres
		//index = index_cpy;
		index = 0;

		// Importation de fichier non finie...
		//Probleme<int> pb("resources\\test.txt");
		Probleme<int> pb(nbUsines, nbClients, 20, 50, 50, 100, getNextValue);

		// Test
		cout << "int : " << test(pb) << " ms." << endl;
	}

	// Test long
	{
		// Initialisation pour tirer toujours les mêmes nombres
		//index = index_cpy;
		index = 0;

		// Importation de fichier non finie...
		//Probleme<long> pb("resources\\test.txt");
		Probleme<long> pb(nbUsines, nbClients, 20, 50, 50, 100, getNextValue);

		// Test
		cout << "long : " << test(pb) << " ms." << endl;
	}

	// Test double
	{
		// Initialisation pour tirer toujours les mêmes nombres
		//index = index_cpy;
		index = 0;

		// Importation de fichier non finie...
		//Probleme<double> pb("resources\\test.txt");
		Probleme<double> pb(nbUsines, nbClients, 20, 50, 50, 100, getNextValue);

		// Test
		cout << "double : " << test(pb) << " ms." << endl;
	}

	// Test float
	{
		// Initialisation pour tirer toujours les mêmes nombres
		//index = index_cpy;
		index = 0;

		// Importation de fichier non finie...
		//Probleme<float> pb("resources\\test.txt");
		Probleme<float> pb(nbUsines, nbClients, 20, 50, 50, 100, getNextValue);

		// Test
		cout << "float : " << test(pb) << " ms." << endl;
	}

	/*// Test char *
	{
		// Initialisation pour tirer toujours les mêmes nombres
		//index = index_cpy;
		index = 0;

		// Importation de fichier non finie...
		//Probleme<char *> pb("resources\\test.txt");
		Probleme<char *> pb(nbUsines, nbClients, 20, 50, 50, 100, getNextValue);

		// Test
		cout << "char * : " << test(pb) << endl;
	}*/

	return 0;
}
Exemplo n.º 6
0
// x=rand(n,1)*a+b
void zvec_rand(int n, dcomplex *x, double a, double b){
  int i;
  for(i=0; i<n; i++){
    Z_SET(x[i],genrand_real3()*a+b,genrand_real3()*a+b);
  }
}
Exemplo n.º 7
0
int EddBM_cycle(struct SimData *SD, double n) {
  if (SD->flags & S12_FLAG_INCOMPAT & ~S12_FLAG_FROZEN ) {
    printf("Incompatible features seen: %d (bxcon)\n", SD->flags);
    exit(205);
  }
  if (SD->MLLlen == 0) {
    // If no moves are possible, then time passes by instantly.
    SD->MLLextraTime = 0;
    return(0);
  }
  int frozenEnabled = SD->flags & S12_FLAG_FROZEN;

  int connMax = SD->connMax;
  int naccept = 0;
  struct LList llist; llist.n = 0;

  double maxTime = (double) n;
  double time = SD->MLLextraTime;
  if (time == -1.) {
    // pre-move, advance time until the first event.  Otherwise we
    // always end up moving right at time == 0
    double timestep = (SD->N * SD->connMax) / ((double)SD->MLLlen);
    timestep *= -log(genrand_real3());
    time = timestep;
  }

  //printf("eddCycle: time:%f maxTime%f\n", time, maxTime);
  while (time < maxTime) {

    int movei = SD->MLL[(int)(SD->MLLlen*genrand_real2())];
    int oldpos = movei / connMax;
    int newpos = SD->conn[movei]; // movei = connMax*oldpos + moveConni
    if (debugedd)
      printf("move: moving from oldpos:%d to newpos:%d\n", oldpos, newpos);
    if (debugedd && frozenEnabled &&(SD->frozen[oldpos] || SD->frozen[newpos]))
      printf("error: lrmnwqrkao\n");
    moveParticle(SD, oldpos, newpos);  // should always be valid, else
				       // prev prob.
    if (SD->persist != NULL) {  // Update persistence function array if there
      SD->persist[oldpos] = 1;
      SD->persist[newpos] = 1;
    }
    llist.n = 0;
    LlistAdd(&llist, oldpos);  // these are removed below, in the first loop.
    //EddBM_updateLatPos(SD, newpos);
    EddBM_updateLatPos2(SD, newpos, &llist);


    // Now, to update all data structures.
    int conni;
    // OLDpos neighbors
    for(conni=0 ; conni < SD->connN[oldpos] ; conni++) {
      // this test sees if we used to be able to move somewhere.  If we
      // used to be able to move, we have to remove it now.
      if (SD->MLLr[oldpos*connMax + conni] != -1) {
        removeFromMLL(SD, oldpos, conni);
      }
      // Now handle adjecent particles, which can now move to the center
      // spot.
      int adjpos = SD->conn[oldpos*connMax + conni];
      if (SD->lattsite[adjpos] != S12_EMPTYSITE) {
        // our adjecent position is occupied, so it could move to oldpos
        // now (maybe).  Update it.
        //EddBM_updateLatPos(SD, adjpos);
        EddBM_updateLatPos2(SD, adjpos, &llist);
	//printf(" . updating neighbor: adjpos:%d\n", adjpos);
	// So neighbor is occpied, so it can be relayed through a
	// empty 2nd neighbor to a 3rd neighbor that has a particle in
	// it.
	int connii;
	for(connii=0 ; connii < SD->connN[adjpos] ; connii++) {
	  int adj2pos = SD->conn[adjpos*connMax + connii];
	  if (SD->lattsite[adj2pos] == S12_EMPTYSITE) {
	    //printf(" . examining empty 2nd neighbor: adj2pos:%d\n", adj2pos);
	    int conniii;
	    for(conniii=0 ; conniii < SD->connN[adj2pos] ; conniii++) {
	      int adj3pos = SD->conn[adj2pos*connMax + conniii];
	      if (SD->lattsite[adj3pos] != S12_EMPTYSITE) {
		//printf(" . updating 3rd neighbor: adj3pos:%d\n", adj3pos);
		//EddBM_updateLatPos(SD, adj3pos);
		EddBM_updateLatPos2(SD, adj3pos, &llist);
	      }
	    }
	  }
	}
      }
      //if (0) 1;
      else {
        // The adjecent position was not occupied, so there is no
        // particle there to move.  But the second-neighbors from here
        // *could* move to the adjpos...
        int connii;
        for(connii=0 ; connii < SD->connN[adjpos] ; connii++) {
	  int adj2pos = SD->conn[adjpos*connMax + connii];
	  if (SD->lattsite[adj2pos] != S12_EMPTYSITE) {
	    //EddBM_updateLatPos(SD, adj2pos);
	    EddBM_updateLatPos2(SD, adj2pos, &llist);
	    //printf(" . updating 2nd neighbor: adj2pos:%d\n", adj2pos);
	  }
        }
      }
    }
  
    // NEWpos stuff
    //printf(" .=new neighbors:\n");
    // we already updated the new position of the moved particle above.
    // go over all neighbors...
    for(conni=0 ; conni < SD->connN[newpos] ; conni++) {
      // Handle adjecent particles, which can now move to the center
      // spot.
      int adjpos = SD->conn[newpos*connMax + conni];
      if (SD->lattsite[adjpos] != S12_EMPTYSITE) {
        // our adjecent position is occupied, so our move here might
        // restrict it some... like remove the move to where we are.
        //EddBM_updateLatPos(SD, adjpos);
        EddBM_updateLatPos2(SD, adjpos, &llist);
	//printf(" . updating neighbor: adjpos:%d\n", adjpos);

	// So neighbor is occpied, so it can be relayed through a
	// empty 2nd neighbor to a 3rd neighbor that has a particle in
	// it.
	int connii;
	for(connii=0 ; connii < SD->connN[adjpos] ; connii++) {
	  int adj2pos = SD->conn[adjpos*connMax + connii];
	  if (SD->lattsite[adj2pos] == S12_EMPTYSITE) {
	    //printf(" . examining empty 2nd neighbor: adj2pos:%d\n", adj2pos);
	    int conniii;
	    for(conniii=0 ; conniii < SD->connN[adj2pos] ; conniii++) {
	      int adj3pos = SD->conn[adj2pos*connMax + conniii];
	      if (SD->lattsite[adj3pos] != S12_EMPTYSITE) {
		//printf(" . updating 3rd neighbor: adj3pos:%d\n", adj3pos);
		//EddBM_updateLatPos(SD, adj3pos);
		EddBM_updateLatPos2(SD, adj3pos, &llist);
	      }
	    }
	  }
	}

      }
      //if (0) 1;
      else {
        // The adjecent position was not occupied, so there is no
        // particle there to move.  But the second-neighbors from here
        // *could* move to the adjpos...
        int connii;
        for(connii=0 ; connii < SD->connN[adjpos] ; connii++) {
  	int adj2pos = SD->conn[adjpos*connMax + connii];
  	if (SD->lattsite[adj2pos] != S12_EMPTYSITE) {
	  //printf(" . updating 2nd neighbor: adj2pos:%d\n", adj2pos);
  	  //EddBM_updateLatPos(SD, adj2pos);
  	  EddBM_updateLatPos2(SD, adj2pos, &llist);
	  }
        }
      }
    }
    naccept += 1;
    
    // Advance time
    double timestep = (SD->N * SD->connMax) / ((double)SD->MLLlen);
    timestep *= -log(genrand_real3());  // exponential distribution of times.
                                        // genrand_real3()  -> (0, 1)
    time += timestep;
    //printf("interval: %f\n", (SD->N * SD->connMax) / (double)SD->MLLlen);
  }
  // MLLextraTime is a positive, the amount to increment before our next stop.
  SD->MLLextraTime = time - maxTime;
  //printf("eddCycle: final time:%f maxTime:%f extraTime:%f\n", 
  // time, maxTime, SD->MLLextraTime);

  return(naccept);
}
Exemplo n.º 8
0
void calculator::run()
{
abort = false;
if( (mprec == 0) | (mpar == 0) )
    return;
qDebug() << "Parameter" << mpar << "Precision" << mprec << "Mode" << mmode;

mp::mp_init(mprec+2);
mp::mpsetprec(mprec);
mp::mpsetoutputprec(mprec);

time.start();

switch( mmode ) {
    case montecarlo : {
                      mpar = pow(10, mpar);
                      quint64 walk = mpar/1000;
                      quint64 hits = 0;
                      double x,y;
                      if( walk == 0 ) walk = 1;
                      for(quint64 current=1;current<=mpar;current++) {
                          x=genrand_real3();
                          y=genrand_real3();
                          if( x*x+y*y <= 1 )
                              hits++;
                          if( current % walk == 0 )
                              emit update(1000*current/mpar);
                          if( abort )
                              break;
                      }
                      mp_real pi = mp_real(hits)/mp_real(mpar)*4;
                      mresult = QString::fromStdString(pi.to_string());
                      break;
                      }
    case montemin1 : {
                      mpar = pow(10, mpar)-1;
                      quint64 walk = mpar/1000;
                      quint64 hits = 0;
                      double x,y;
                      if( walk == 0 ) walk = 1;
                      for(quint64 current=1;current<=mpar;current++) {
                          x=genrand_real3();
                          y=genrand_real3();
                          if( x*x+y*y <= 1 )
                              hits++;
                          if( current % walk == 0 )
                              emit update(1000*current/mpar);
                          if( abort )
                              break;
                      }
                      mp_real pi = mp_real(hits)/mp_real(mpar)*4;
                      mresult = QString::fromStdString(pi.to_string());
                      break;
                      }
    case subdivide : {
                     mp_real x, a;
                     mpar = pow(10, mpar);
                     quint64 walk = mpar/1000;
                     quint64 current = 0;
                     a=0;
                     mp_real real_par(mpar);
                     x=1/(real_par*0.5);
                     while( x < 1 ) {
                         current++;
                         a+=1*sqrt(1-(x*x))/real_par;
                         x+=(1/real_par);
                         if( current % walk == 0)
                             emit update(current/walk);
                         if( abort )
                             break;
                         }
                     mp_real pi = a*4;
                     mresult = QString::fromStdString(pi.to_string());
                     break;
                     }
    case grid : {
                quint64 res = pow(10, mpar);
                quint32 walk = res/1000+1;
                quint64 hits = 0;
                quint64 x = 0, y = res;
                while( y > 0 )
                {
                    while( x*x+y*y <= res )
                        x++;
                    hits += x;
                    if( y % walk == 0 ) emit update((res-y)/(walk+1));
                    y--;
                    if( abort )
                        break;
                }
                mp_real pi = mp_real(hits)/mp_real(res)*4;
                mresult = QString::fromStdString(pi.to_string());
                break;
                }
    case bbp : {
                mp_real pi;
                for(quint32 step=0;step<=mpar;step++) {
                    pi += ((mp_real(4)/mp_real(8*step+1))-(mp_real(2)/mp_real(8*step+4))-(mp_real(1)/mp_real(8*step+5))-(mp_real(1)/mp_real(8*step+6)))/(pow(mp_real(16),(int)step));
                    emit update(1000*step/mpar);
                    if( abort )
                        break;
                    }
                mresult = QString::fromStdString(pi.to_string());
                break;
                }
    case chudnovsky : {
                mp_real temp;
                for(quint32 step=0;step<=mpar;step++) {
                    mp_real upper = fak(6*step)*(13591409+545140134*mp_real(step))*pow(-1,step);
                    mp_real lower = pow(640320,mp_real(3*step)+1.5)*(fak(3*step)*pow(fak(step),3)+0.0);
                    temp += upper/lower;
                    emit update(1000*step/mpar);
                    if( abort )
                        break;
                    }
                mp_real pi = mp_real(1)/(temp*12);
                mresult = QString::fromStdString(pi.to_string());
                break;
                }
    case polygon : {
                mp_real pi_min = mp_real(mpar)/2*sin(2*mp_real::_pi/mp_real(mpar));
                mp_real pi_max = mp_real(mpar)*tan(mp_real::_pi/mp_real(mpar));
                mp_real pi_mid = (pi_min+pi_max)/2;
                mresult = QString::fromStdString(pi_min.to_string())+" < Pi < "+QString::fromStdString(pi_max.to_string()) +"\nPi = "+QString::fromStdString(pi_mid.to_string());
                break;
                }
}

duration = time.elapsed();



mp::mp_finalize();
}
Exemplo n.º 9
0
// x=rand(n,1)*a+b
void dvec_rand(int n, double *x, double a, double b){
  int i;
  for(i=0; i<n; i++){
    x[i]=genrand_real3()*a+b;
  }
}
Exemplo n.º 10
0
/* static inline */
double SLICE(VAR)(double x) {
  double y;
  double n = RIGHT;
  y = floor(getRandomRangeOpenRight(0,n+1));
  return (log(genrand_real3()) < LL_FUN(VAR)(y) - LL_FUN(VAR)(x)) ? y : x;
}
Exemplo n.º 11
0
void MoveEnemyAIDumb(Enemy* currentEnemy, int currentIndex, const int frameTicks, double& xMove, double& yMove)
{
	//Decide on an action
	//1: Approach or retreat from player
	//2: Attack player
	//3: Do nothing
	if(frameTicks - currentEnemy->lastActionTicks > ENEMY_ACTION_TIME)
	{
		double angle = currentEnemy->getAngleTo(player);

		double Random = genrand_real3();
		if(Random < .3333)
		{
			//Consider the angle between the enemy and the player.
			//If the player is more left than up, we want to move left.
			if(!currentEnemy->isAdjacent(player))
			{
				if(0.0 <= angle && angle < 45.0)
				{
					//Player is to the right
					xMove = ENEMY_ACCEL;
				}
				else if(45.0 <= angle && angle < 135.0)
				{									
					if(currentEnemy->getYCenter() > player.getYCenter())
					{
						//Player is above
						yMove = -ENEMY_ACCEL;
					}
					else
					{
						//Player is below
						yMove = ENEMY_ACCEL;
					}
				}
				else
				{
					//Player is to the left
					xMove = -ENEMY_ACCEL;
				}

				//There is a half-chance of the enemy going the opposite direction
				//to spice things up.
				if(Random < .1666)
				{
					xMove = -xMove;
					yMove = -yMove;
				}
			}
		}
		else if(Random < .6667)
		{
			Bullet* newBullet = NULL;
			double newBulletX = 0.0;
			double newBulletY = 0.0;
			sprite::SpriteType newBulletSprite;

			if(0.0 <= angle && angle < 45.0)
			{
				//Player is to the right
				newBulletX = currentEnemy->bulletSpeed;
				newBulletSprite = sprite::GreenBoltHorizontal;
			}
			else if(45.0 <= angle && angle < 135.0)
			{									
				if(currentEnemy->getYCenter() > player.getYCenter())
				{
					//Player is above
					newBulletY = -currentEnemy->bulletSpeed;
					newBulletSprite = sprite::GreenBoltVert;
				}
				else
				{
					//Player is below
					newBulletY = currentEnemy->bulletSpeed;
					newBulletSprite = sprite::GreenBoltVert;
				}
			}
			else
			{
				//Player is to the left
				newBulletX = -currentEnemy->bulletSpeed;
				newBulletSprite = sprite::GreenBoltHorizontal;
			}

			newBullet = GetNextAvailableEnemyBullet(currentEnemy->enemyID, currentEnemy->maxBullets);
			if(newBullet && (newBulletX != 0.0 || newBulletY != 0.0))
			{
				currentEnemy->lastShotTicks = frameTicks;

				SetupNewBullet(newBullet, 
					currentEnemy->enemyID, 
					currentEnemy->xWorld, currentEnemy->yWorld, newBulletX, newBulletY, 
					frameTicks, newBulletSprite);
				Mix_PlayChannel(-1, lightningSound, 0);
			}
		}

		currentEnemy->lastActionTicks = frameTicks;
	}
}
Exemplo n.º 12
0
void MoveEnemyAIDiagonalShot(Enemy* currentEnemy, int currentIndex, const int frameTicks, double& xMove, double& yMove)
{
	//This AI will fire diagonally for extra challenge!
	if(frameTicks - currentEnemy->lastActionTicks > ENEMY_ACTION_TIME)
	{
		double angle = currentEnemy->getAngleTo(player);

		double Random = genrand_real3();
		if(Random < .3333)
		{
			//Consider the angle between the enemy and the player.
			//If the player is more left than up, we want to move left.
			if(!currentEnemy->isAdjacent(player))
			{
				if(0.0 <= angle && angle < 45.0)
				{
					//Player is to the right
					xMove = ENEMY_ACCEL;
				}
				else if(45.0 <= angle && angle < 135.0)
				{									
					if(currentEnemy->getYCenter() > player.getYCenter())
					{
						//Player is above
						yMove = -ENEMY_ACCEL;
					}
					else
					{
						//Player is below
						yMove = ENEMY_ACCEL;
					}
				}
				else
				{
					//Player is to the left
					xMove = -ENEMY_ACCEL;
				}
			}
		}
		else if(Random < .8667)
		{
			Bullet* newBullet = NULL;
			double newBulletX = 0.0;
			double newBulletY = 0.0;
			sprite::SpriteType newBulletSprite;

			if(0.0 <= angle && angle < 30.0)
			{
				//Player is to the right
				newBulletX = currentEnemy->bulletSpeed;
				newBulletSprite = sprite::GoldBoltHorizontal;
			}
			else if(30.0 <= angle && angle < 60.0)
			{		
				//Player is to the right
				newBulletX = currentEnemy->bulletSpeed / sqrt(2.0);

				if(currentEnemy->getYCenter() > player.getYCenter())
				{
					//Player is above
					newBulletY = -currentEnemy->bulletSpeed / sqrt(2.0);
					newBulletSprite = sprite::GoldBoltUpRight;
				}
				else
				{
					//Player is below
					newBulletY = currentEnemy->bulletSpeed / sqrt(2.0);
					newBulletSprite = sprite::GoldBoltDownRight;
				}
			}
			else if(60.0 <= angle && angle < 120.0)
			{									
				if(currentEnemy->getYCenter() > player.getYCenter())
				{
					//Player is above
					newBulletY = -currentEnemy->bulletSpeed;
					newBulletSprite = sprite::GoldBoltVert;
				}
				else
				{
					//Player is below
					newBulletY = currentEnemy->bulletSpeed;
					newBulletSprite = sprite::GoldBoltVert;
				}
			}
			else if(120.0 <= angle && angle < 150.0)
			{		
				//Player is to the left
				newBulletX = -currentEnemy->bulletSpeed / sqrt(2.0);

				if(currentEnemy->getYCenter() > player.getYCenter())
				{
					//Player is above
					newBulletY = -currentEnemy->bulletSpeed / sqrt(2.0);
					newBulletSprite = sprite::GoldBoltDownRight;
				}
				else
				{
					//Player is below
					newBulletY = currentEnemy->bulletSpeed / sqrt(2.0);
					newBulletSprite = sprite::GoldBoltUpRight;
				}
			}
			else
			{
				//Player is to the left
				newBulletX = -currentEnemy->bulletSpeed;
				newBulletSprite = sprite::GoldBoltHorizontal;
			}

			newBullet = GetNextAvailableEnemyBullet(currentEnemy->enemyID, currentEnemy->maxBullets);
			if(newBullet && (newBulletX != 0.0 || newBulletY != 0.0))
			{
				currentEnemy->lastShotTicks = frameTicks;

				SetupNewBullet(newBullet, 
					currentEnemy->enemyID, 
					currentEnemy->xWorld, currentEnemy->yWorld, newBulletX, newBulletY, 
					frameTicks, newBulletSprite);
				Mix_PlayChannel(-1, lightningSound, 0);
			}
		}

		currentEnemy->lastActionTicks = frameTicks;
	}
}
Exemplo n.º 13
0
void MoveEnemyAITriggerHappy(Enemy* currentEnemy, int currentIndex, const int frameTicks, double& xMove, double& yMove)
{
	//This AI is MUCH more likely to shoot than move or do nothing
	if(frameTicks - currentEnemy->lastActionTicks > ENEMY_ACTION_TIME)
	{
		double angle = currentEnemy->getAngleTo(player);

		double Random = genrand_real3();
		if(Random < .12)
		{
			//Consider the angle between the enemy and the player.
			//If the player is more left than up, we want to move left.
			if(!currentEnemy->isAdjacent(player))
			{
				if(0.0 <= angle && angle < 45.0)
				{
					//Player is to the right
					xMove = ENEMY_ACCEL;
				}
				else if(45.0 <= angle && angle < 135.0)
				{									
					if(currentEnemy->getYCenter() > player.getYCenter())
					{
						//Player is above
						yMove = -ENEMY_ACCEL;
					}
					else
					{
						//Player is below
						yMove = ENEMY_ACCEL;
					}
				}
				else
				{
					//Player is to the left
					xMove = -ENEMY_ACCEL;
				}
			}
		}
		else if(Random < .85)
		{
			Bullet* newBullet = NULL;
			double newBulletX = 0.0;
			double newBulletY = 0.0;
			sprite::SpriteType newBulletSprite;

			if(0.0 <= angle && angle < 45.0)
			{
				//Player is to the right
				newBulletX = currentEnemy->bulletSpeed;
				newBulletSprite = sprite::BlueBoltHorizontal;
			}
			else if(45.0 <= angle && angle < 135.0)
			{									
				if(currentEnemy->getYCenter() > player.getYCenter())
				{
					//Player is above
					newBulletY = -currentEnemy->bulletSpeed;
					newBulletSprite = sprite::BlueBoltVert;
				}
				else
				{
					//Player is below
					newBulletY = currentEnemy->bulletSpeed;
					newBulletSprite = sprite::BlueBoltVert;
				}
			}
			else
			{
				//Player is to the left
				newBulletX = -currentEnemy->bulletSpeed;
				newBulletSprite = sprite::BlueBoltHorizontal;
			}

			newBullet = GetNextAvailableEnemyBullet(currentEnemy->enemyID, currentEnemy->maxBullets);
			if(newBullet && (newBulletX != 0.0 || newBulletY != 0.0))
			{
				currentEnemy->lastShotTicks = frameTicks;

				SetupNewBullet(newBullet, 
					currentEnemy->enemyID, 
					currentEnemy->xWorld, currentEnemy->yWorld, newBulletX, newBulletY, 
					frameTicks, newBulletSprite);
				Mix_PlayChannel(-1, lightningSound, 0);
			}
		}

		currentEnemy->lastActionTicks = frameTicks;
	}
}
Exemplo n.º 14
0
double bmx_genrand_real3() {
	return genrand_real3();
}
Exemplo n.º 15
0
/*****************
乱数生成
*****************/
double Uniform( void )
{
    return genrand_real3();
}