aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCharles <sircharlesaze@gmail.com>2020-03-21 17:55:49 +0100
committerCharles <sircharlesaze@gmail.com>2020-03-21 17:55:49 +0100
commit9401116d59066a2bb6de9c12d9642afee1069314 (patch)
treef886c23c9b4e2a300a1e2b1e18a068a2b39cd425
parentcaeb26e90ef09fdad85af72f460644e09d3b2c7c (diff)
downloadmario_sokoban-master.tar.gz
mario_sokoban-master.tar.bz2
mario_sokoban-master.zip
Added history and some map from sokonlineHEADmaster
-rw-r--r--include/game.hpp4
-rw-r--r--map/cosmopoly01.sokoban (renamed from map/cosomopoly01.sokoban)0
-rw-r--r--map/cosmopoly02.sokoban9
-rw-r--r--map/cosmopoly03.sokoban12
-rw-r--r--map/cosmopoly04.sokoban8
-rw-r--r--map/cosmopoly05.sokoban9
-rw-r--r--map/cosmopoly06.sokoban7
-rw-r--r--map/cosmopoly07.sokoban9
-rw-r--r--map/cosmopoly08.sokoban10
-rw-r--r--map/cosmopoly09.sokoban8
-rw-r--r--map/cosmopoly10.sokoban8
-rw-r--r--map/cosmopoly11.sokoban9
-rw-r--r--map/cosmopoly12.sokoban9
-rw-r--r--map/cosmopoly13.sokoban8
-rw-r--r--map/cosmopoly14.sokoban9
-rw-r--r--map/cosmopoly15.sokoban10
-rw-r--r--map/cosmopoly16.sokoban8
-rw-r--r--map/cosmopoly17.sokoban7
-rw-r--r--map/cosmopoly18.sokoban9
-rw-r--r--map/cosmopoly19.sokoban9
-rw-r--r--map/cosmopoly20.sokoban9
-rw-r--r--map/square.sokoban10
-rw-r--r--src/game.cpp23
-rw-r--r--src/graphics.cpp9
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;