示例#1
0
文件: primes.c 项目: FoXPeeD/OS-bwis
// Gets node p, deletes all of its multiples (stops if p^2 is missing), and returns the next p
Node handleCandidate(Node p, FILE* f, int i) {
	if (!p)
		return NULL;

	Node p2 = LL_next(p);
	int isFirstThread = 0;
	while (p2 && (isFirstThread || p2->num <= p->num * p->num)) {
		if (p2->num == p->num * p->num) {
			isFirstThread = 1;
			fprintf(f, "Prime %d (by %d).\n", p->num, i);
		}

		// Delete if needed, move on either way.
		if (p2->num % p->num == 0) {
			fprintf(f, "%d\n", p2->num);
			p2 = LL_remove(p2);
		} else
			p2 = LL_next(p2);
	}

	// Reached the end of the list
	int res;
	if (p2) {
		res = release(p2->prev);
		res = release(p2);
	}

	res = acquire(p->prev);

	res = acquire(p);

	p = LL_next(p);
	return p;
}
void Proj_projectile_drawAll()
{
	Iterator* it = LL_getIterator(projectiles);
	while (LL_hasNext(it)) 
		Proj_projectile_draw((Projectile*) LL_next(it));
	free(it);
}
void Proj_projectile_updateAll()
{
	Iterator* it = LL_getIterator(projectiles);
	bool bulletHit;
	while (LL_hasNext(it)) 
	{
		Projectile *proj = (Projectile*) LL_next(it);
		Proj_projectile_update(proj);
		bulletHit = false;

		Iterator* enemyIt = LL_getIterator(enemies);
		
		while (LL_hasNext(enemyIt)) {
			Enemy *enem = (Enemy*) LL_next(enemyIt);
			
			float x1 = proj->loc.x;
			float y1 = proj->loc.y;
			float x2 = enem->loc.x;
			float y2 = enem->loc.y;
			
			float distance = sqrt(pow(x1 - x2, 2) + pow(y1-y2, 2));
			
			if (distance < 0.025) {
				enem = (Enemy*) LL_removePrevious(enemyIt);
				free(enem);
				
				((Player*)(proj->owner))->score++;
				bulletHit = true;
			}
		}
		free(enemyIt);

		if (!Proj_projectile_inBounds(proj) || bulletHit)
		{
			LL_removePrevious(it);
			free(proj);
			//proj->direction.x *= -1;
			//proj->direction.y *= -1;
		}
	}
	free(it);
}