Advertisement
Guest User

quadrapop C++ redo sfml

a guest
Mar 4th, 2015
227
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.06 KB | None | 0 0
  1. #include <SFML/Graphics.hpp>
  2. #include <SFML/Window.hpp>
  3. #include <SFML/System.hpp>
  4. #include <vector>
  5. #include <iostream>
  6.  
  7. #define WIDTH 6
  8. #define HEIGHT 10
  9. #define SIZE 25
  10.  
  11. sf::Color colors[5] = { sf::Color::Red, sf::Color::Green, sf::Color::Blue, sf::Color::Magenta, sf::Color::Yellow };
  12.  
  13. void drawQuad(sf::RenderTarget & rt, float x, float y, sf::Color c)
  14. {
  15. sf::RectangleShape rect(sf::Vector2f(SIZE-2, SIZE-2));
  16. rect.setPosition(x+1, y+1);
  17. rect.setFillColor(c);
  18. rt.draw(rect);
  19. }
  20.  
  21. class Part
  22. {
  23. public:
  24. int m_x, m_y;
  25. char m_data[2][2];
  26.  
  27. void generateData()
  28. {
  29. m_x = WIDTH / 2 - 1;
  30. m_y = -1;
  31. m_data[0][0] = rand() % 5;
  32. for(int i=0;i<100;i++) rand();
  33. m_data[0][1] = rand() % 5;
  34. m_data[1][0] = m_data[1][1] = -1;
  35. }
  36. Part()
  37. {
  38. generateData();
  39. }
  40. void rotate()
  41. {
  42. char c = m_data[0][0];
  43. m_data[0][0] = m_data[1][0];
  44. m_data[1][0] = m_data[1][1];
  45. m_data[1][1] = m_data[0][1];
  46. m_data[0][1] = c;
  47.  
  48. if(m_data[0][0] == -1)
  49. {
  50. m_data[0][0] = m_data[0][1];
  51. m_data[1][0] = m_data[1][1];
  52. m_data[0][1] = m_data[1][1] = -1;
  53. }
  54. }
  55. void render(sf::RenderTarget & rt)
  56. {
  57. for(int i=0;i<2;i++)
  58. for(int j=0;j<2;j++)
  59. if(m_data[i][j] != -1)
  60. drawQuad(rt, (m_x + j) * SIZE, (m_y + i) * SIZE, colors[m_data[i][j]]);
  61. }
  62. void fall()
  63. {
  64. m_y++;
  65. }
  66. bool isWithinRange(int offsetX, int offsetY)
  67. {
  68. for(int i=0;i<2;i++)
  69. for(int j=0;j<2;j++)
  70. if(m_data[i][j] != -1 && (m_x + j + offsetX >= WIDTH || m_y + i + offsetY >= HEIGHT ||
  71. m_x + j + offsetX < 0 || m_y + i + offsetY < 0) )
  72. return false;
  73. return true;
  74. }
  75. };
  76.  
  77. class Well
  78. {
  79. private:
  80. char m_data[HEIGHT][WIDTH];
  81. bool checkedData[HEIGHT][WIDTH];
  82.  
  83. public:
  84. void clearArea()
  85. {
  86. for(int i=0;i<HEIGHT;i++)
  87. for(int j=0;j<WIDTH;j++)
  88. m_data[i][j] = -1;
  89. }
  90. Well()
  91. {
  92. clearArea();
  93. }
  94. void render(sf::RenderTarget & rt)
  95. {
  96. for(int i=0;i<HEIGHT;i++)
  97. for(int j=0;j<WIDTH;j++)
  98. if(m_data[i][j] != -1)
  99. drawQuad(rt, j * SIZE, i * SIZE, colors[m_data[i][j]]);
  100. }
  101. void addPart(Part p)
  102. {
  103. for(int i=0;i<2;i++)
  104. for(int j=0;j<2;j++)
  105. if(p.m_data[i][j] != -1)
  106. m_data[p.m_y + i][p.m_x + j] = p.m_data[i][j];
  107. }
  108. bool collideWithPart(Part p)
  109. {
  110. for(int i=0;i<2;i++)
  111. for(int j=0;j<2;j++)
  112. if(m_data[p.m_y + i][p.m_x + j] != -1 && p.m_data[i][j] != -1)
  113. return true;
  114. return false;
  115. }
  116. void applyGravity()
  117. {
  118. for(int k=0;k<HEIGHT;k++)
  119. for(int i=HEIGHT-1;i>1;i--)
  120. for(int j=0;j<WIDTH;j++)
  121. if(m_data[i][j] == -1)
  122. {
  123. m_data[i][j] = m_data[i-1][j];
  124. m_data[i-1][j] = -1;
  125. }
  126. }
  127. int dfs(int x, int y, int k, bool canChange)
  128. {
  129. int dx[] = {1,-1,0,0};
  130. int dy[] = {0,0,1,-1};
  131. if(canChange) m_data[y][x] = -1;
  132. checkedData[y][x] = true;
  133. int res = 0;
  134. for(int i=0;i<4;i++)
  135. {
  136. int xx = x + dx[i], yy = y + dy[i];
  137. if(xx < 0 || xx >= WIDTH || yy < 0 || yy >= HEIGHT || m_data[yy][xx] != k || checkedData[yy][xx]) continue;
  138. res += dfs(xx, yy, k, canChange);
  139. }
  140. return 1 + res;
  141. }
  142. void resetChecked()
  143. {
  144. for(int i=0;i<HEIGHT;i++)
  145. for(int j=0;j<WIDTH;j++)
  146. checkedData[i][j] = false;
  147. }
  148. int destroyComponents()
  149. {
  150. int res = 0;
  151. resetChecked();
  152. for(int i=0;i<HEIGHT;i++)
  153. for(int j=0;j<WIDTH;j++)
  154. if(m_data[i][j] != -1)
  155. if(dfs(j, i, m_data[i][j], false) > 3)
  156. {
  157. resetChecked();
  158. dfs(j, i, m_data[i][j], true);
  159. if(res == 0) res = 1;
  160. else res *= 2;
  161. }
  162. applyGravity();
  163. return res;
  164. }
  165. };
  166.  
  167. int main()
  168. {
  169. srand(time(0));
  170. sf::RenderWindow window(sf::VideoMode(WIDTH * SIZE, HEIGHT * SIZE), "Quadrapop");
  171. window.setFramerateLimit(30);
  172.  
  173. Part part;
  174. Well well;
  175. int tick = 0, score = 0;
  176.  
  177. while(window.isOpen())
  178. {
  179. sf::Event event;
  180. while(window.pollEvent(event))
  181. {
  182. if(event.type == sf::Event::KeyPressed && event.key.code == sf::Keyboard::Escape)
  183. window.close();
  184. if(event.type == sf::Event::Closed)
  185. window.close();
  186. if(event.type == sf::Event::KeyPressed && event.key.code == sf::Keyboard::Right && part.isWithinRange(1,0))
  187. {
  188. part.m_x++;
  189. if(well.collideWithPart(part))
  190. part.m_x--;
  191. }
  192. if(event.type == sf::Event::KeyPressed && event.key.code == sf::Keyboard::Left && part.isWithinRange(-1,0))
  193. {
  194. part.m_x--;
  195. if(well.collideWithPart(part))
  196. part.m_x++;
  197. }
  198. if(event.type == sf::Event::KeyPressed && event.key.code == sf::Keyboard::Down)
  199. {
  200. while(1)
  201. {
  202. part.m_y++;
  203. if(part.isWithinRange(0,1) == false || well.collideWithPart(part))
  204. {
  205. part.m_y--;
  206. well.addPart(part);
  207. well.applyGravity();
  208. part.generateData();
  209. break;
  210. }
  211. }
  212. }
  213. if(event.type == sf::Event::KeyPressed && event.key.code == sf::Keyboard::Up)
  214. {
  215. part.rotate();
  216. if(well.collideWithPart(part) || part.isWithinRange(0,0) == false)
  217. for(int i=0;i<3;i++)
  218. part.rotate();
  219. }
  220. }
  221.  
  222. if(tick < 20)
  223. tick++;
  224. else
  225. part.fall(), tick = 0;
  226.  
  227. if(well.collideWithPart(part) || part.isWithinRange(0,1) == false)
  228. {
  229. part.m_y--;
  230. if(part.m_y == -1)
  231. {
  232. // koniec
  233. break;
  234. }
  235. well.addPart(part);
  236. well.applyGravity();
  237. part.generateData();
  238. }
  239.  
  240. score += well.destroyComponents();
  241.  
  242. window.clear();
  243. part.render(window);
  244. well.render(window);
  245. window.display();
  246. std::cout<<"Current score: "<<score<<std::endl;
  247. }
  248. std::cout<<"Final score: "<<score<<std::endl;
  249. return 0;
  250. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement