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; } }