diff options
| author | Charles <sircharlesaze@gmail.com> | 2020-03-21 17:55:49 +0100 |
|---|---|---|
| committer | Charles <sircharlesaze@gmail.com> | 2020-03-21 17:55:49 +0100 |
| commit | 9401116d59066a2bb6de9c12d9642afee1069314 (patch) | |
| tree | f886c23c9b4e2a300a1e2b1e18a068a2b39cd425 | |
| parent | caeb26e90ef09fdad85af72f460644e09d3b2c7c (diff) | |
| download | mario_sokoban-master.tar.gz mario_sokoban-master.tar.bz2 mario_sokoban-master.zip | |
| -rw-r--r-- | include/game.hpp | 4 | ||||
| -rw-r--r-- | map/cosmopoly01.sokoban (renamed from map/cosomopoly01.sokoban) | 0 | ||||
| -rw-r--r-- | map/cosmopoly02.sokoban | 9 | ||||
| -rw-r--r-- | map/cosmopoly03.sokoban | 12 | ||||
| -rw-r--r-- | map/cosmopoly04.sokoban | 8 | ||||
| -rw-r--r-- | map/cosmopoly05.sokoban | 9 | ||||
| -rw-r--r-- | map/cosmopoly06.sokoban | 7 | ||||
| -rw-r--r-- | map/cosmopoly07.sokoban | 9 | ||||
| -rw-r--r-- | map/cosmopoly08.sokoban | 10 | ||||
| -rw-r--r-- | map/cosmopoly09.sokoban | 8 | ||||
| -rw-r--r-- | map/cosmopoly10.sokoban | 8 | ||||
| -rw-r--r-- | map/cosmopoly11.sokoban | 9 | ||||
| -rw-r--r-- | map/cosmopoly12.sokoban | 9 | ||||
| -rw-r--r-- | map/cosmopoly13.sokoban | 8 | ||||
| -rw-r--r-- | map/cosmopoly14.sokoban | 9 | ||||
| -rw-r--r-- | map/cosmopoly15.sokoban | 10 | ||||
| -rw-r--r-- | map/cosmopoly16.sokoban | 8 | ||||
| -rw-r--r-- | map/cosmopoly17.sokoban | 7 | ||||
| -rw-r--r-- | map/cosmopoly18.sokoban | 9 | ||||
| -rw-r--r-- | map/cosmopoly19.sokoban | 9 | ||||
| -rw-r--r-- | map/cosmopoly20.sokoban | 9 | ||||
| -rw-r--r-- | map/square.sokoban | 10 | ||||
| -rw-r--r-- | src/game.cpp | 23 | ||||
| -rw-r--r-- | src/graphics.cpp | 9 |
24 files changed, 205 insertions, 8 deletions
diff --git a/include/game.hpp b/include/game.hpp index 946f07c..031f4fe 100644 --- a/include/game.hpp +++ b/include/game.hpp @@ -5,6 +5,7 @@ #include <fstream> #include <string> #include <vector> +#include <stack> #include <algorithm> class Game @@ -38,6 +39,8 @@ public: bool won(); void move(Direction direction); + void undo(); + void reset(); Cell get(int y, int x) const; Cell get(Position pos) const; size_t getHeight() const; @@ -54,6 +57,7 @@ private: Direction m_playerDirection; std::vector<Position> m_cratePos; std::vector<Position> m_payloadPos; + std::stack< std::pair<Position, std::vector<Position> > > m_history; void construct(std::string fmt); void findWidth(std::string fmt); diff --git a/map/cosomopoly01.sokoban b/map/cosmopoly01.sokoban index 7dc5f4e..7dc5f4e 100644 --- a/map/cosomopoly01.sokoban +++ b/map/cosmopoly01.sokoban diff --git a/map/cosmopoly02.sokoban b/map/cosmopoly02.sokoban new file mode 100644 index 0000000..96a1e1b --- /dev/null +++ b/map/cosmopoly02.sokoban @@ -0,0 +1,9 @@ + ##### +###@ # +# $*#$## +# # . # +# . $# # +## #. # + # ## + ### # + #### diff --git a/map/cosmopoly03.sokoban b/map/cosmopoly03.sokoban new file mode 100644 index 0000000..c804d48 --- /dev/null +++ b/map/cosmopoly03.sokoban @@ -0,0 +1,12 @@ + #### + # # + # # +### *### +# # +# .*** # +## $ ## + ##* ## + #@ # + # # # + # # + ##### diff --git a/map/cosmopoly04.sokoban b/map/cosmopoly04.sokoban new file mode 100644 index 0000000..b4f8289 --- /dev/null +++ b/map/cosmopoly04.sokoban @@ -0,0 +1,8 @@ +##### +# #### +# $$ # +##.@ . # + #. #.## + # $$ # + # ### + #### diff --git a/map/cosmopoly05.sokoban b/map/cosmopoly05.sokoban new file mode 100644 index 0000000..6efcf0f --- /dev/null +++ b/map/cosmopoly05.sokoban @@ -0,0 +1,9 @@ +##### +#. .##### +# . # +##$$@$ # +## ###### +# $ ## +# . # +### # + ##### diff --git a/map/cosmopoly06.sokoban b/map/cosmopoly06.sokoban new file mode 100644 index 0000000..2459636 --- /dev/null +++ b/map/cosmopoly06.sokoban @@ -0,0 +1,7 @@ + #### + ## # + # #### +##$ ..*.# +# $ #$ # +# #@ # +######### diff --git a/map/cosmopoly07.sokoban b/map/cosmopoly07.sokoban new file mode 100644 index 0000000..c6c7339 --- /dev/null +++ b/map/cosmopoly07.sokoban @@ -0,0 +1,9 @@ + ##### + ## # + # # ### + # # * # + # # #@# + # * # + ### *$## + # . # + ##### diff --git a/map/cosmopoly08.sokoban b/map/cosmopoly08.sokoban new file mode 100644 index 0000000..25f3d69 --- /dev/null +++ b/map/cosmopoly08.sokoban @@ -0,0 +1,10 @@ + ######## + # # # + # . $. # + ###$## # + #.. ##$## +## $*$ # +# * # # +# @.##### +## # + ##### diff --git a/map/cosmopoly09.sokoban b/map/cosmopoly09.sokoban new file mode 100644 index 0000000..d2f4fc5 --- /dev/null +++ b/map/cosmopoly09.sokoban @@ -0,0 +1,8 @@ + #### +######## @# +# $ $ $ $# +# #*. .# ## +# . #. # +##$### . # + # ##### + ####### diff --git a/map/cosmopoly10.sokoban b/map/cosmopoly10.sokoban new file mode 100644 index 0000000..11faf02 --- /dev/null +++ b/map/cosmopoly10.sokoban @@ -0,0 +1,8 @@ + ####### + # # # + #$.@.$# + # .#. # +##$.#.$## +# $ $ # +# # # +######### diff --git a/map/cosmopoly11.sokoban b/map/cosmopoly11.sokoban new file mode 100644 index 0000000..273429a --- /dev/null +++ b/map/cosmopoly11.sokoban @@ -0,0 +1,9 @@ +##### +# #### +# $.$ ## +##$#@# # + # ... # +##$#.# ## +# $ # +# # # +######### diff --git a/map/cosmopoly12.sokoban b/map/cosmopoly12.sokoban new file mode 100644 index 0000000..db1e16a --- /dev/null +++ b/map/cosmopoly12.sokoban @@ -0,0 +1,9 @@ + ##### +## .# +# $#.## +# # +##$ # +# #*## +# @ # +# ### +#### diff --git a/map/cosmopoly13.sokoban b/map/cosmopoly13.sokoban new file mode 100644 index 0000000..21e18d9 --- /dev/null +++ b/map/cosmopoly13.sokoban @@ -0,0 +1,8 @@ + ##### +### ## +# .. . # +# $$ # # +## #$$ # + #.@ ## + ### # + #### diff --git a/map/cosmopoly14.sokoban b/map/cosmopoly14.sokoban new file mode 100644 index 0000000..cc79126 --- /dev/null +++ b/map/cosmopoly14.sokoban @@ -0,0 +1,9 @@ + ##### +### # +# #.## +# *$@ # +## * **## + # # # # + # # + ### ### + #### diff --git a/map/cosmopoly15.sokoban b/map/cosmopoly15.sokoban new file mode 100644 index 0000000..346dbab --- /dev/null +++ b/map/cosmopoly15.sokoban @@ -0,0 +1,10 @@ +######## +# # # +# # +## #.$.# +# $@### +# #$*.# +# # # # +# # +## ## + ##### diff --git a/map/cosmopoly16.sokoban b/map/cosmopoly16.sokoban new file mode 100644 index 0000000..b5e15b7 --- /dev/null +++ b/map/cosmopoly16.sokoban @@ -0,0 +1,8 @@ + ##### + ### # + ## * # # + ## # +## * * ### +# $### +# + # +###### diff --git a/map/cosmopoly17.sokoban b/map/cosmopoly17.sokoban new file mode 100644 index 0000000..29e78da --- /dev/null +++ b/map/cosmopoly17.sokoban @@ -0,0 +1,7 @@ + #### +###### # +#@ $. $ # +# $ .$ # +### . ### + # . # + ##### diff --git a/map/cosmopoly18.sokoban b/map/cosmopoly18.sokoban new file mode 100644 index 0000000..963aee7 --- /dev/null +++ b/map/cosmopoly18.sokoban @@ -0,0 +1,9 @@ + #### + ### ## +## * # +# ## ## +#@$* # +## .# # # + # * # + # ##### + #### diff --git a/map/cosmopoly19.sokoban b/map/cosmopoly19.sokoban new file mode 100644 index 0000000..be21f7e --- /dev/null +++ b/map/cosmopoly19.sokoban @@ -0,0 +1,9 @@ + #### + ## .# + ## # + ## ...# +#### $$ ## +# @$ ## +# $ ## +# ### +##### diff --git a/map/cosmopoly20.sokoban b/map/cosmopoly20.sokoban new file mode 100644 index 0000000..08d2787 --- /dev/null +++ b/map/cosmopoly20.sokoban @@ -0,0 +1,9 @@ + ##### + # ### +### # $ # +# $* .# # +# # + # +# *#.### +## $ # + # ### + #### diff --git a/map/square.sokoban b/map/square.sokoban index 23d637c..c17d5c7 100644 --- a/map/square.sokoban +++ b/map/square.sokoban @@ -1,7 +1,7 @@ ####### -# m # -#* # -# U # -# U # -# * # +# @ # +#. # +# $ # +# $ # +# . # ####### diff --git a/src/game.cpp b/src/game.cpp index cdc8937..67e4a28 100644 --- a/src/game.cpp +++ b/src/game.cpp @@ -45,6 +45,7 @@ void Game::move(Direction direction) { m_playerDirection = direction; Position saved = m_playerPos; + std::vector<Position> cratePosSaved = m_cratePos; switch (direction) { case DirectionUp: @@ -64,14 +65,30 @@ void Game::move(Direction direction) m_playerPos = saved; return; } - if (get(m_playerPos) == CellCrate || get(m_playerPos) == CellCrateSolved) - { if (!tryMoveCrate(*std::find( m_cratePos.begin(), m_cratePos.end(), m_playerPos), direction)) + { m_playerPos = saved; - } + return; + } + m_history.push(std::make_pair(saved, cratePosSaved)); +} + +void Game::undo() +{ + if (m_history.size() < 1) + return; + m_playerPos = m_history.top().first; + m_cratePos = m_history.top().second; + m_history.pop(); +} + +void Game::reset() +{ + while (m_history.size() > 0) + undo(); } Game::Cell Game::get(int y, int x) const diff --git a/src/graphics.cpp b/src/graphics.cpp index 298fc43..2c8e525 100644 --- a/src/graphics.cpp +++ b/src/graphics.cpp @@ -134,6 +134,9 @@ void Graphics::handleEvent() case SDL_KEYDOWN: switch (e.key.keysym.sym) { + case SDLK_ESCAPE: + m_running = false; + break; case SDLK_UP: m_game.move(Game::DirectionUp); break; @@ -146,6 +149,12 @@ void Graphics::handleEvent() case SDLK_RIGHT: m_game.move(Game::DirectionRight); break; + case SDLK_BACKSPACE: + m_game.undo(); + break; + case SDLK_r: + m_game.reset(); + break; } if (m_game.won()) m_running = false; |
