Exemple #1
0
void Trie::Insert(const std::string& data)
{
	if (data.empty()) return;
	Node* root = m_root;
	uint8_t mk = 0;
	for (unsigned idx = 0; idx < data.size(); idx++) {
		if (mk == root->cnt) { //下探
			if (root->lv == 0) {
				if (root->brs == 0) {
					root->brs = 1;
					root->next = CreateTail(data, idx);
					return;
				}
				if (root->next->key[0] != data[idx]) {
					AddKid(root, CreateTail(data, idx));
					return;
				}
				root = root->next;
			} else {
				uint16_t spot = SearchKid(root, data[idx]);
				if (spot == root->brs
					|| root->kids[spot]->key[0] != data[idx]
				){	//扩展
					if (root->brs == SIZE_LIMIT[root->lv]) {
						Node::Pointer* old = root->kids;
						auto deallocate = DEALLOCATE[root->lv];
						root->kids = (this->*ALLOCATE[++root->lv])();
						for (uint16_t i = 0; i < spot; i++) {
							root->kids[i] = old[i];
						}
						for (uint16_t i = root->brs; i > spot; i--) {
							root->kids[i] = old[i - 1];
						}
						(this->*deallocate)(old);
					} else {
						for (uint16_t i = root->brs; i > spot; i--) {
							root->kids[i] = root->kids[i - 1];
						}
					}
					root->kids[spot] = CreateTail(data, idx);
					root->brs++;
					return;
				}
				root = root->kids[spot];
			}
			mk = 1;
		} else {
			if (data[idx] != root->key[mk]) {
				Split(root, mk);
				AddKid(root, CreateTail(data, idx));
				return;
			}
			mk++;
		}
	}
	if (mk != root->cnt) {
		Split(root, mk);
	}
	root->ref++;
}	
void main()
	{
	menu();
	while(true){
	sf::Clock clock, clockInvincible;
    score1 = 0;
	int  xBlock, yBlock, x, y, seconds = 0, red, green, blue;
	int direction = 0, directionOfBack = 0, size;
	bool checkGameOver = false, outOfBounds = false, restarter = false, breaker = false;
			size = Robjects.size();
			Robjects.erase(Robjects.begin()+0, Robjects.begin()+size);
			window.clear();
	//---------------------------------------------------------------------------
	//sf::RenderWindow window(sf::VideoMode(600, 500), "Testing");
	//---------------------------------------------------------------------------
	event.type = sf::Event::Count;
	sf::RectangleShape square(sf::Vector2f(sizex, sizey));
	square.setFillColor(sf::Color(200, 60, 0));
	square.setOutlineThickness(2);
    square.setOutlineColor(sf::Color(140, 30, 0));
	//---------------------------------------------------------------------------
	sf::RectangleShape egg(sf::Vector2f(sizex + 2, sizey + 2));
	egg.setFillColor(sf::Color(red, green, blue));
	egg.setOutlineThickness(2);
    egg.setOutlineColor(sf::Color(200, 200, 200));
	//---------------------------------------------------------------------------
	setAll(x, y, xBlock, yBlock);
	//---------------------------------------------------------------------------
  	egg.setPosition(xBlock, yBlock);
	//---------------------------------------------------------------------------
	setEgg(red, green, blue);
 while(window.isOpen())
	  {
		  if(invincible1 == true){
			  invincible2(x, y);
		for(int i = 0; i < Robjects.size(); i++){
	Robjects[i].setFillColor(sf::Color(200, 50, 50));
	Robjects[i].setOutlineThickness(2);
    Robjects[i].setOutlineColor(sf::Color(40, 40, 40));
		}
		  }
		  else 
              outOfBounds = checkOutOfBounds(x , y);

	sf::Time elapsed1 = clock.getElapsedTime();
	seconds = elapsed1.asMilliseconds();
	//---------------------------------------------------------------------------
    restarter = updateGame(x, y, xBlock, yBlock, direction, directionOfBack, checkGameOver, seconds, red, green, blue);

	egg.setFillColor(sf::Color(red, green, blue));
	if(restarter == true)
	clock.restart();
	directionOfBack = CreateTail(x, y, direction, checkGameOver, false);
   	//---------------------------------------------------------------------------
	if((x % 25 == 0)&&(y % 25 == 0)){
		//------------------------------------------------------------
		  while(window.pollEvent(event)) {
			  if(event.type == sf::Event::Closed){
			size = Robjects.size();
			Robjects.erase(Robjects.begin()+0, Robjects.begin()+size);
				  window.close();

			  }
			  //---------------------------------------------------------------------
			  if((event.key.code == sf::Keyboard::P)&&(event.type == sf::Event::KeyPressed)){
			  window.draw(square);
			  for(int i = 0; i < Robjects.size(); i++)
			  window.draw(Robjects[i]);

			  if(eggs == true){}
			  else
			  window.draw(egg);

			  window.draw(score);
		      window.display();
				  while(true){
			  while(window.pollEvent(event)) {
			  if((event.key.code == sf::Keyboard::P)&&(event.type == sf::Event::KeyPressed))
				  breaker = true;
			  			  }
			  if(breaker == true)
				  break;
			  }
			  }
				  breaker = false;
				  event.key.code == sf::Keyboard::Q;
			  if(event.type == sf::Event::KeyPressed){
			  direction = move(direction, x, y);
			  square.setPosition(x,y);
			  }
		    }
		  }
	//---------------------------------------------------------------------------
		if((checkGameOver == true)||(outOfBounds == true))
		{
			  window.clear();
		      window.draw(square);
			  for(int i = 0; i < Robjects.size(); i++)
			  window.draw(Robjects[i]);
			  window.draw(egg);
			  window.draw(score);
			  window.draw(gameOver);
              exit();
			  window.clear();
			  menu();
			  break;
		 }
	//---------------------------------------------------------------------------
		  square.setPosition(x,y);
		  egg.setPosition(xBlock, yBlock);

		  	  window.clear();
		      window.draw(square);
			  for(int i = 0; i < Robjects.size(); i++)
			  window.draw(Robjects[i]);

			  if(eggs == false){
				    window.draw(egg);
			  }
			  else{
		for(int i = 0; i < 120; i++)
		window.draw(egger[i]); 
			  }
			  			if(invincible == true)
	{
			invincible3.setString("I");
	        invincible3.setFont(font);
	        invincible3.setCharacterSize(10);
	        invincible3.setColor(sf::Color(255, 255, 255));
	        invincible3.setPosition(xBlock + 4, yBlock + 4);
			window.draw(invincible3);
	}
			  window.draw(score);
		      window.display();
			  if(eggs == true)
				  sf::sleep(sf::seconds(.0009));
			  else
			 sf::sleep(sf::seconds(.003));
	  }
}
    //return 0;
}
bool updateGame(int& x, int& y, int& xBlock, int& yBlock, int& direction, int& directionOfBack,
	            bool checkGameOver, float timer, int& red, int& green, int& blue)
{
	bool bump = false;
	int timing, xNew, yNew, size;

	keepMoving(direction, x, y);
	square.setPosition(x,y);
	elapsedInvincible = clockInvincible.getElapsedTime();

	if(invincible1 == true){

	if((invincible1 == true)&&(timeInv - elapsedInvincible.asSeconds() <= 0)){
		invincible1 = false;
		for(int i = 0; i < Robjects.size(); i++){
    Robjects[i].setFillColor(sf::Color(61, 245, 0));
	Robjects[i].setOutlineThickness(2);
    Robjects[i].setOutlineColor(sf::Color(42, 160, 0));
		}
	}

	else if((invincible1 == true)&&(timeInv - elapsedInvincible.asSeconds() < 5)){
		timing = (timeInv - elapsedInvincible.asSeconds());
		if(timing > 1){
	 setColor(counter, 1);
		}
		else if (timing > 2){
	 setColor(counter, 2);
		}
		else if(timing > 3){
     setColor(counter, 3);
		}
		else if(timing > 4){
     setColor(counter, 4);
		}
		counter++;
	}

	else if(invincible1 == true){
		for(int i = 0; i < Robjects.size(); i++){
	Robjects[i].setFillColor(sf::Color(200, 50, 50));
	Robjects[i].setOutlineThickness(2);
    Robjects[i].setOutlineColor(sf::Color(40, 40, 40));
		}
	}

	}
	else{
		for(int i = 0; i < Robjects.size(); i++){
    Robjects[i].setFillColor(sf::Color(61, 245, 0));
	Robjects[i].setOutlineThickness(2);
    Robjects[i].setOutlineColor(sf::Color(42, 160, 0));
		}
	}

	if(eggs == true){
	if(timeInv - elapsedInvincible.asSeconds() <= 0){
		size = egger.size();
		eggs = false;
		egger.erase(egger.begin()+0, egger.begin()+size);
		window.clear();
	}
	else{
	for(int i = 0; i < 120; i++){
	sf::Vector2f position = egger[i].getPosition();	
	xNew = position.x;
	yNew = position.y;
	bump = checkBlock(x, y, xNew, yNew);
	if(bump == true){
	    score1 = score1 + 10;
	    text = convertInt(score1);
	    score.setString(text);
		egger[i].setPosition(-50, -50);
		bump = false;
		break;
	}
	}
	}
}

else{
	bump = checkBlock(x, y, xBlock, yBlock);
	if ((bump == true)&&(timer > 200)){
		if(invincible == true){
			invincible1 = true;
			invincible = false;
			elapsedInvincible = clockInvincible.getElapsedTime();
			timeInv = 15 + elapsedInvincible.asSeconds();
		}

		if((eggs1 == true)){
			sf::RectangleShape square1(sf::Vector2f(sizex, sizey));
			    square1.setFillColor(sf::Color(175, 175, 175));
	            square1.setOutlineThickness(2);
                square1.setOutlineColor(sf::Color(30, 80, 30));

					for(int j = 0; j < 10; j++){
				for(int i = 0; i < 12; i++){
					square1.setPosition((i*50) + 10, (j*50) + 10);
					egger.push_back(square1);
				}
					}
		
					eggs = true;
					eggs1 = false;
			elapsedInvincible = clockInvincible.getElapsedTime();
			timeInv = 3 + elapsedInvincible.asSeconds();
		}

		BlockSpawn(xBlock, yBlock);
		if(eggs == true){
		}
		else
		egg.setPosition(xBlock,yBlock);
		directionOfBack = CreateTail(x, y, direction, checkGameOver, true);

		if(killTail == true){
			size = Robjects.size();
			if(size > 5)
			Robjects.erase(Robjects.begin()+size -5, Robjects.begin()+size);
			else if(size == 4)
			Robjects.erase(Robjects.begin()+size -4, Robjects.begin()+size);
			else if(size == 3)
            Robjects.erase(Robjects.begin()+size -3, Robjects.begin()+size);
			else if(size == 2)
			Robjects.erase(Robjects.begin()+size -2, Robjects.begin()+size);
			else if(size == 1)
            Robjects.erase(Robjects.begin()+size -1, Robjects.begin()+size);
			else
			{}
			killTail = false;
		}

		if(red == 150)
		    score1 = score1 + 10;
		else if(red == 200)
			score1 = score1 + 20;
		else if(red == 40)
			score1 = score1 + 30;
		else if(red == 204)
			score1 = score1 + 40;
		else if(red == 41)
			score1 = score1 + 50;
		else if(red == 205)
			score1 = score1 + 80;

		setEgg(red, green, blue);
		text = convertInt(score1);
	    score.setString(text);

		return true;
         }
	return false;
}
}