int shark_rule1 (wator_t* pw, int x, int y, int *k, int* l){ cell_set cs /* per gestire return di array */; int i = x; int j = y; int *move = NULL; /* sarà occupato da un array di due elementi i e j */ int ret = STOP; /* valore di return */ if ( ! pw ) { errno = EFAULT; return -1; } /* ottine un array di celle che contengono pesci */ if ( ( cs = closeCells( i, j, pw->plan, pred_is_fish ) ).n != 0 ) { /* viene prediletto mangiare */ /* scelta random di quale mangiare */ move = cs.cells[ RAND( cs.n ) ]; /* rimuovo il pesce dal contatore */ #ifdef _ONLY_ONE_ pw->nf --; #endif ret = EAT; pw->plan->dtime[i][j] = 0; /* NON è scritto nel testo, ma dovrebbe ??? */ }else /* Non sono stati trovati pesci, si cercano celle libere */ if ( ( cs = closeCells ( i, j, pw->plan, pred_is_water ) ).n != 0 ){ move = cs.cells[ RAND (cs.n) ]; ret = MOVE; } /* assegnamento risultato ( se move == NULL ) allora la mossa è stop */ *k = move ? move[0] : i; *l = move ? move[1] : j; /* aggioramento distruttivo : */ if ( move ) moveFromTo( pw->plan , i, j, *k, *l ); return ret; }
void CFBMatch::teamPositionAck(int side, const vector<float>& p, int ballPlayerId, unsigned int timeStamp) { auto team = m_teams[side]; int size = team->getPlayerNumber(); if (timeStamp == 0) // timeStamp为0表示暂停时候的强制同步 { for (int i = 0; i < size; ++i) { Point pos(p[i * 4], p[i * 4 + 1]); Point vec(p[i * 4 + 2], p[i * 4 + 3]); auto player = team->getPlayer(i); player->loseBall(); player->setPosition(pos); player->setMovingVector(vec); } if (ballPlayerId != -1) { team->getPlayer(ballPlayerId)->gainBall(); } } else { float dt = m_proxy->getDeltaTime(timeStamp); for (int i = 0; i < size; ++i) { Point pos(p[i * 4], p[i * 4 + 1]); Point vec(p[i * 4 + 2], p[i * 4 + 3]); auto player = team->getPlayer(i); player->moveFromTo(pos, vec, dt, m_SYNC_TIME); } CC_ASSERT(team == m_teamsInMatch[(int)SIDE::OPP]); m_syncTime[(int)SIDE::OPP] = m_SYNC_TIME; } }
/* simile a rule 1*/ int fish_rule3 (wator_t* pw, int x, int y, int *k, int* l){ cell_set cs /* per gestire return di array */; int i = x; int j = y; int *move = NULL; /* sarà occupato da un array di due elementi i e j */ int ret = STOP; /* valore di return */ if ( ! pw ) { errno = EFAULT; return -1; } /* prelevo una casella libera a caso */ if ( ( cs = closeCells ( i, j, pw->plan, pred_is_water ) ).n != 0 ){ move = cs.cells[ RAND (cs.n) ]; ret = MOVE; } /* assegnamento risultato ( se move == NULL ) allora la mossa è stop */ *k = move ? move[0] : i; *l = move ? move[1] : j; /* aggioramento distruttivo (se è stata selezionata move): */ if ( move ) moveFromTo( pw->plan , i, j, *k, *l ); return ret; }
void ViewSphereRender::moveViewpoint() { moveFromTo(m_startPos, m_targetPos); }