From 69fe3a43071f9eb6fab103784a8cad09840b9f9c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sergiusz=20=27q3k=27=20Baza=C5=84ski?= Date: Mon, 8 Oct 2012 16:00:59 +0200 Subject: [PATCH] First commit! --- 0.png | Bin 0 -> 319 bytes 1.png | Bin 0 -> 901 bytes 2.png | Bin 0 -> 949 bytes 3.png | Bin 0 -> 833 bytes 4.png | Bin 0 -> 792 bytes 5.png | Bin 0 -> 907 bytes 6.png | Bin 0 -> 1023 bytes 7.png | Bin 0 -> 910 bytes 8.png | Bin 0 -> 1003 bytes GFXframework.cpp | 70 ++++++++++ GFXframework.h | 34 +++++ README.txt | 9 ++ bar.png | Bin 0 -> 335 bytes bomb.png | Bin 0 -> 1053 bytes flag.png | Bin 0 -> 870 bytes game.cpp | 172 +++++++++++++++++++++++++ game.h | 46 +++++++ general.h | 16 +++ ground.png | Bin 0 -> 1411 bytes happy.png | Bin 0 -> 2741 bytes main.cpp | 31 +++++ map.cpp | 326 +++++++++++++++++++++++++++++++++++++++++++++++ map.h | 44 +++++++ minesweeper.cpp | 21 +++ tile.cpp | 79 ++++++++++++ tile.h | 39 ++++++ 26 files changed, 887 insertions(+) create mode 100644 0.png create mode 100644 1.png create mode 100644 2.png create mode 100644 3.png create mode 100644 4.png create mode 100644 5.png create mode 100644 6.png create mode 100644 7.png create mode 100644 8.png create mode 100644 GFXframework.cpp create mode 100644 GFXframework.h create mode 100644 README.txt create mode 100644 bar.png create mode 100644 bomb.png create mode 100644 flag.png create mode 100644 game.cpp create mode 100644 game.h create mode 100644 general.h create mode 100644 ground.png create mode 100644 happy.png create mode 100644 main.cpp create mode 100644 map.cpp create mode 100644 map.h create mode 100644 minesweeper.cpp create mode 100644 tile.cpp create mode 100644 tile.h diff --git a/0.png b/0.png new file mode 100644 index 0000000000000000000000000000000000000000..f15830bee70cfc44e150b8aff9e7b7acafb83201 GIT binary patch literal 319 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1SD0tpLGH$mUKs7M+SzC{oH>NS%G}c0*}aI z1_r(ZAk3I`t&#frNb+a3J6dKnFFg>YYlTZ{(VPGt>VeS#&Hfmt7oX6Jtr0Pdlb86f!<*7boFyt=akR{0L))#YybcN literal 0 HcmV?d00001 diff --git a/1.png b/1.png new file mode 100644 index 0000000000000000000000000000000000000000..9935af914f1ee608822871b38100c09320509e23 GIT binary patch literal 901 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 LNkvXXu0mjfCOv9= literal 0 HcmV?d00001 diff --git a/4.png b/4.png new file mode 100644 index 0000000000000000000000000000000000000000..ac4e5c867f243e65738d47c75efc9367f3bcc6e2 GIT binary patch literal 792 zcmV+z1LypSP)00004XF*Lt006O% z3;baP00009a7bBm000ia000ia0czHX2><{98gxZibW?9;ba!ELWdKlNX>N2bPDNB8 zb~7$DE-^4L^m3s900NXrL_t(&L+zTossb?(hP~khynv!$BUq|WAU=Y%mX?+lK7xgh zA&R94zJZS**x6~Nou#GDVR6}$WZiKyNr>!nio=r2|II&1CX2CWEN1ne-RdFqzXb5K z>UoFW-D-?tqzBSay}IR)9Dlr7U$`9yJ{K80UnQs ztKRwNa=9pEAO}dN(+t3JxwHmgyWKMC|B4i)51|8)D!lqap`cVh*-6Z&z5}CHJ&aD} zKs+Aj!@pjy?Epw561@6$yRBS3i339Q`Fvi7dU*h0=DLmfptCs;tCX;;Le~A5V zw}YLE-kET_P$rYXt3RL5u2+Cf%n$A)h! zn3GDSWYv=cFoHIl4Q#$(4$ng%-5KJmMI3rozH|*e6x&e`0JB2O9Aq*vV^WB+sMg~E zvmIr#S($MB>l*=}LdiG)RS>EhrjZc`%-jbs;qYt2IFQTbWJWW;1}Lw^MpCHRY}(|& ze!pi@=y*KZ1TYv37yvT$dTJs5K4}?%!ctU^1N^ndG6xiX6f)ufWi71-pj0Y(O&E{I zmZcDU-g0kb@NJkDJ2v#L;wndiyAs|02L;MjegMqJAa1!OTV4A(}5RY W#~X^72*VTr000000004XF*Lt006O% z3;baP00009a7bBm000ia000ia0czHX2><{98gxZibW?9;ba!ELWdKlNX>N2bPDNB8 zb~7$DE-^4L^m3s900Rd}L_t(&L+zVA&nZC^$Gs*(5E2qZLo|c}iB9MwB6<=9iKrB6 z6dH~A1U`U9qgT@CC`5%ysZ_crcVq8n)~=nG<*w{Tv60y`|KItanb{f7V|W-0n*L~8 zJ*57Z03MpUo~ai&peg6U*-2$l@^Z6_pkS)My zG=e3CyDSzHzAg&*gHe58~x=$s7PIEtku0rU6!i z*lM*R05ET)(`nqgg1KulnPALatN_I6e<=c1iF`f}Q;OH?4Fm!nkH_V5RjXAD#Yj^o z0K44|0f0G?TocxlOaOd79|9n^c4Fy!+n5P}!uokDhNOWS0O4>Lk#f0Qip3(#hJ`}G z;c&o;%Uv+UXR{fJZvGj1fcbomI1rD=&1SRAdjZlOTJHCILJWFHxyy zbqxQQHPs!^9iS`le;csM8ulP{baMUG#ynZ|$#gAj}X($1d z?`BG+lF*s;dM#Fuy&0f)V6j*z*=O->;7B4A3Q1v;oKR3Y04b=~>sSm@jiKa}51xN5 z=>fP{(P)$ggQR%4j#&ZlDS=v7J}~%w97*m~0zjm|v6nngB9S0huZ9CJ)xggmVhlK8 zr;`2|2N+0{55as4sID04KnM7A#?k(C2XqH0GoY6cWdf-m*BzivA!UGHbU?U2*3SJe h{q3}NvM&68fj?g15a{HWQ#Jqq002ovPDHLkV1f~niQ@nO literal 0 HcmV?d00001 diff --git a/6.png b/6.png new file mode 100644 index 0000000000000000000000000000000000000000..2022b7145bdb17a9f2d61bb13c7c640345e44381 GIT binary patch literal 1023 zcmV00004XF*Lt006O% z3;baP00009a7bBm000ia000ia0czHX2><{98gxZibW?9;ba!ELWdKlNX>N2bPDNB8 zb~7$DE-^4L^m3s900VnTL_t(&L+zVAYcfF)$9)$cO;k{@62u}P7%(DgVR_c9xcA$no5B&+gvc?8}|G;9(Jy-I@Py=5}ZHG`_RX z=joTX)kEli6TsP1*Wb_^GTHg^e!{N|YIt<9?^FJ;Fhr_||_hZ!G-Q7v4 zhsnyAfgt52e8>}rdYbd3@n#RGxZ>S zyWKh>T@}FR=ck$adcE$TbR_`m_1aARe!q8Iz2qW39*<1*aND>cT`~jEkTKPV!(sQ- z%VdDLV?u-Js(N97o0}Ut{IOWfZS`UR@9*!ldMK_JP%j2Rt9NzP5^>_K#L#}x0I;BS zv&CXjYyE)=u0$fCtnFc@m=}On|MvC|WpDVNK( z9jHDanM|sY&RYkdveGJ{^|uW?lTBHJgwFsi6!uMg;OUX$@mN7BkN_4Pn+(HzK9^-c z0?>8W?Cf%TdrN3~eSNh!=*TW>Bmlj3nSqBTVHQykYK9?|1PlOu|KxHx8UUjM%7Wr5 zjsb|rmjYeq(@x_1vpi>VzI-QQD1O5tC3=aS!nfDTxg@1!F0L2|wn;vxVLiA3Z9z=GH|K)MzHP<3d0cz7Tf;1L0L zXaoSjE4Ley2?Ri^)#A2{0brJ4ZcnTU1VAQ};Wmo_czSwb)?MD+lNLvqO{G$f0GRFE z;C?chaJw{2AON19pSi7JG5|)IhXLJvv)SZ!d_KRtya<8&k3Mk>Q&y-3f`omT**l0Ak!~b0l zwHM!aB}StWFN5uP5%t0VnzLT7hrgq&0Vf<&@BI9mzB}!ms2l%Z;0s;=6UDe)TdM#7002ovPDHLkV1j|$&@%u4 literal 0 HcmV?d00001 diff --git a/7.png b/7.png new file mode 100644 index 0000000000000000000000000000000000000000..71eeb610d43c0ce83fd3f3ed0eff5a5f2ab8c347 GIT binary patch literal 910 zcmV;919AL`P)00004XF*Lt006O% z3;baP00009a7bBm000ia000ia0czHX2><{98gxZibW?9;ba!ELWdKlNX>N2bPDNB8 zb~7$DE-^4L^m3s900Rn1L_t(&L+zS9uQ5Rs$GyK+5=2BoL_{MIi3$y!-Y1ZVMrb5L zA-TOqqao3$^fWX&4L$)Col<%4$+IDzoi)35UiR+IZWLl?=lp-?oS8W@%k*tB>H4E@ z_2Bxy1n{k^>*4yB2Yx_xru1ERdVcW<|p(8jZ>@&;k(5G#U+& zf_GHV%iVBBsuZ2$zT zyWK7pi>W4Qx7%FD0LECi+Z9%8<=1dHT^6HQEGp`g#UNH>_|fR= z>kEZ}tW(;Fwg51PqUxarQK}x=X$yd=hsEIo_1XeB91alxOjg(HRUZJYRtt6id_Mn7 zy;c!eE|;kKOeXWOdUgPXLgBeFSS%K=%AjaN*R^0Us75^_fbn>YNp9F7i0(R_PL=8z z0YFtOxlZNt`BJHb-r8=rzY740WZ8xG*`Qo5t5?q`0?;i?=Smm?fdG+ub^y@xbUMWs zp|H;+RnHVa5SPp4FrnylI;0F7N{Pv2f?*)dA`Squg8?#4eH>T=KxrupAT(I5R%$Sq z0!W^DrPJwmNQw@EM3hVcEEbDME1aN!0LfYiS`G$-kAuJt0Cu#fr(b=HPO?yg{2~BU zeK;Hz>3coW@_M}=t7o?kBoYY}KvLg&y@tlkW>bxNMgUMhqv|V_ib{$2$Ec5icc<-4 z)U$|yWc>qqq7MLcpANZ{N~Kt-ryc<`_34zH7za=s1Mo&n;mkubAQS=q#q+<5rqFkN z(FK6RbjTTifFgp^3uC$fJY3GRnB&1?M1Y5vaW;$y7!e@!fRRFk4kUiuhybw*2|JL8 kfIk0*{FnYat00004XF*Lt006O% z3;baP00009a7bBm000ia000ia0czHX2><{98gxZibW?9;ba!ELWdKlNX>N2bPDNB8 zb~7$DE-^4L^m3s900U=9L_t(&L+zWriYhS_$Nm0B5ETSbu+dIS1v?Qd3qi3_3k$`< z_wW%EpFqK9&`KLSODpZ{EG>7>y>pcz$xM<-<~kz|%d)U1ng8#coaE%V>-cdvZ2e_# z_2BwX0{F4j^K`u`0=Cls%G)o%yW;j;LhthY^S$2)&?9gP$FG)I`<|Z)- z0Cd1{#tWd>LoUIV#Y$oZK)qf!CS5(M(P%I+$OVAPOn)zeJ7gk}V8nxl5}iRJ0Nep| zlmXa&zgG)dE|>Z(45k~iEP&x~sH48wZ0h?m7z`4J|ECB*6HZG#oX~U;PYWnck$L9x zIc2zb1a!_Xr5VBXAOPWT*mMBD-;cXLnM`u&ei?IDtb!5PZnwC4*k_EX#|tWY$t?(g zZ<_R1>cZg@nz)3B?l{U{JwLfqk|!Qt+QYmkW%fRBuj zR}$NaG}-@tPpm=cV?`nWZA}CK`d0K;k}QboR0o0n%( z24JLBDg^+qVYmPwB_NkLyskEt1psqG=vlJ!b#sTd1r#F&b*su(2}=kO0V$ZxW&!5) zfL6FYLZ71B?TRW!#!HNVWMz!geE}F9Wt!PH0;ai^apF&mfcn!K`~3V#e>-g-udDxG Z;1>#I&Si9=VNn18002ovPDHLkV1oAp!6X0x literal 0 HcmV?d00001 diff --git a/GFXframework.cpp b/GFXframework.cpp new file mode 100644 index 0000000..a645599 --- /dev/null +++ b/GFXframework.cpp @@ -0,0 +1,70 @@ +#include "GFXframework.h" + +#include + +GFXframework* GFXframework::m_GFXframework= NULL; + +GFXframework::GFXframework() +{ + +} + +GFXframework::~GFXframework() +{ + m_Window->close(); + delete m_Window; +} + +GFXframework* GFXframework::GetInstance() +{ + if (m_GFXframework== NULL) + { + m_GFXframework = new GFXframework(); + } + return m_GFXframework; +} + +void GFXframework::ResetInstance() +{ + delete m_GFXframework; // REM : it works even if the pointer is NULL (does nothing then) + m_GFXframework = NULL; // so GetInstance will still work. +} + +bool GFXframework::InitWindow(int sizeX, int sizeY, char* name) +{ + m_Window = new sf::RenderWindow(sf::VideoMode(sizeX, sizeY), name); + return true; +} + +sf::RenderWindow* GFXframework::GetWindow() +{ + return m_Window; +} + +void GFXframework::LoadSprites() +{ + m_TileTexture[0].loadFromFile("0.png"); + m_TileTexture[1].loadFromFile("1.png"); + m_TileTexture[2].loadFromFile("2.png"); + m_TileTexture[3].loadFromFile("3.png"); + m_TileTexture[4].loadFromFile("4.png"); + m_TileTexture[5].loadFromFile("5.png"); + m_TileTexture[6].loadFromFile("6.png"); + m_TileTexture[7].loadFromFile("7.png"); + m_TileTexture[8].loadFromFile("8.png"); + m_TileTexture[9].loadFromFile("bomb.png"); + m_TileTexture[10].loadFromFile("happy.png"); + m_TileTexture[11].loadFromFile("ground.png"); + m_TileTexture[12].loadFromFile("flag.png"); + + for (int i = 0; i < 13; i++) + { + m_Sprite[i] =sf::Sprite(m_TileTexture[i]); + } +} + +void GFXframework::DisplaySpriteAt(int spriteType, int x, int y) +{ + m_Sprite[spriteType].setPosition((float)x, (float)y); + m_Window->draw(m_Sprite[spriteType]); +} \ No newline at end of file diff --git a/GFXframework.h b/GFXframework.h new file mode 100644 index 0000000..f08a68d --- /dev/null +++ b/GFXframework.h @@ -0,0 +1,34 @@ +// GFX FRAMEWORK SINGLETON + +#ifndef GFXFRAMEWORK_H +#define GFXFRAMEWORK_H + +#include + +class GFXframework +{ + // Singleton mechanics +protected: + GFXframework(); + static GFXframework* m_GFXframework; + +public: + static GFXframework* GetInstance(); + static void ResetInstance(); // we don't want any leaks! + + // GFX system methods and member variables +protected: + sf::RenderWindow* m_Window; + +public: + ~GFXframework(); + bool InitWindow(int sizeX, int sizeY, char* name); + sf::RenderWindow* GetWindow(); + + sf::Texture m_TileTexture[13]; + sf::Sprite m_Sprite[13]; + void LoadSprites(); + void DisplaySpriteAt(int spriteType, int x, int y); +}; + +#endif \ No newline at end of file diff --git a/README.txt b/README.txt new file mode 100644 index 0000000..5183940 --- /dev/null +++ b/README.txt @@ -0,0 +1,9 @@ +// A game of minesweeper, written in one day. +// +// CONTROLS: +// Left mouse click - test tile for mine +// Right mouse click - mark tile with a flag or remove a flag +// 'R' key - reset the game +// Esc - exit game + +// Depends on SFML (and VLC in debug) \ No newline at end of file diff --git a/bar.png b/bar.png new file mode 100644 index 0000000000000000000000000000000000000000..f9880ce77e9f60adac9b9321a00cfcf6549ddef1 GIT binary patch literal 335 zcmeAS@N?(olHy`uVBq!ia0vp^4nVBH!2~3A|G&Hpq!^2X+?^QKos)S9a~60+7BevL9R^{>76Mi6^K@|xiEvMzk$&D_iQtK^FHJWJeEGk?T54BpHoqf#t)xQ6hL!9) zIo~m+u-$o?At#aZs<4XTrtyad$DdYhQCP6N>dnD^Q$M!l4_2@zupV$YdOm}v=NLn4 zX1)n$uiCzopr07_(dA^-pY literal 0 HcmV?d00001 diff --git a/bomb.png b/bomb.png new file mode 100644 index 0000000000000000000000000000000000000000..6030b729d10470796148ecce6e60f163dd8b4078 GIT binary patch literal 1053 zcmV+&1mgRNP)00004XF*Lt006O% z3;baP00009a7bBm000ia000ia0czHX2><{98gxZibW?9;ba!ELWdKlNX>N2bPDNB8 zb~7$DE-^4L^m3s900WsxL_t(&L+zR|PbxtW$3Y}Y5TYTG0ErEWghUH_6Jtn7EcgNx zP!JnJVPPn!2!XpS$C47f_ax^8~~)|EFWOX&6W_2J=RHk-+WbqpYx zOhT_yuF+^Djlmg!$HzxiJ^bSJdR+!^a&n>t_hQlGDrc^4ir>Rsb#1O_ZI5;>^jdyo< zB9N%%rzBS_Z9Fi!gq9d0{aKWZ>iDgDNN-4jawH51_YvdU}!!0PfQ1 zG*we56jCQUIy!;hms1WQQ`yyU}Q>soxIlp>Vsgtz}#1Q?IU z_A%gFXA1!PU66LesJAo{R45dv1d&JtVK9{eI4ofVUVFNs%nFA9ggrye)zuX> zG%^7gk7Mn2o0y6E${#HW{-k}m;?Dql$AKFDU@%CPb$@@aw?_ep6GXfh@dHpxqTB5n zX@b*50RZrpNF>yO)9F-Z3BA9+t7jSUcpMF<7y#<_KLb-4Fz0%;f`dve1K0lE>>RcN z5LE{UYG&o(_I3k+g15J~PN#!Q5wmarKuj3#s9ylyNZDn#i5d82a@TjkH|e|6?##d+ X0qdqWUe-wx00000NkvXXu0mjfSxwE! literal 0 HcmV?d00001 diff --git a/flag.png b/flag.png new file mode 100644 index 0000000000000000000000000000000000000000..4868546132eac9d1a233d7fbcccf344051a9a652 GIT binary patch literal 870 zcmV-s1DX7ZP)00004XF*Lt006O% z3;baP00009a7bBm000ia000ia0czHX2><{98gxZibW?9;ba!ELWdKlNX>N2bPDNB8 zb~7$DE-^4L^m3s900QDkL_t(&L+zR^uj)V$hWUmN2npW;5)=Xq3I_)M0TMxi;UnQU zAP^8dSQ0!QhvI)AaY!Whz3DwYz1yC4>1?~%6PgM_hIXELXJ%(x0!1R!)pMY zWHcJ_2m=1w?e+$VZvYxezu)JX;}rOtyAY&M$$!tAL6<`%iz?Ywo`cy+o07F$aH+!rxQFaSs!Km8Xl3o!sF3AF(* z?WhEBxm*|pPN$Pf0I5`po#cFVpIpQiJ9@PMB==DIFvkF3iuPFmQX9QquMEI!Hd6_p z-EK>+U}6g8^Le!a + +#include + +Game::Game() +{ + Init(); +} + +Game::~Game() +{ + delete m_LevelMap; + GFXframework::ResetInstance(); +} + +void Game::Init() +{ + m_Finished = false; + + m_numOfBombs = SMALL_MAP_BOMBS; + m_SizeX = SMALL_MAP_SIZE_X; + m_SizeY = SMALL_MAP_SIZE_Y; + + int window_width = m_SizeX * TILE_SIZE_X; + int window_height = m_SizeY * TILE_SIZE_Y + TILE_SIZE_Y/2; + + GFXframework::GetInstance()->InitWindow(window_width, window_height, "Don't Explode!"); + GFXframework::GetInstance()->LoadSprites(); + + // bottom bar, part of GUI + m_GUITexture.loadFromFile("bar.png"); + m_GUISprite =sf::Sprite(m_GUITexture); + + // create basic map + m_LevelMap = new Map(m_SizeX, m_SizeY, m_numOfBombs); + + m_FirstClick = true; +} + +void Game::Shutdown(int returnCode) +{ + (void)returnCode; +} + +void Game::MainLoop() +{ + while (GFXframework::GetInstance()->GetWindow()->isOpen()) + { + sf::Event event; + // main events processing + while (GFXframework::GetInstance()->GetWindow()->pollEvent(event)) + { + if (event.type == sf::Event::Closed) + GFXframework::GetInstance()->GetWindow()->close(); + } + + if (sf::Keyboard::isKeyPressed(sf::Keyboard::R)) + { + m_FirstClick = true; + m_LevelMap->Generate(); + m_Finished = false; + } + if (sf::Keyboard::isKeyPressed(sf::Keyboard::Escape )) + { + GFXframework::GetInstance()->GetWindow()->close(); + } + + // if the game isn't finished yet, allow all mechanics to work + if ( !m_Finished) + { + if (sf::Mouse::isButtonPressed(sf::Mouse::Left)) + { + if ( m_LeftMouseDown != true) + { + m_LeftMouseDown = true; + sf::Vector2i localPosition = sf::Mouse::getPosition(*(GFXframework::GetInstance()->GetWindow())); + + + if (m_FirstClick) + { + if (m_LevelMap->GenerateFromClick(localPosition.x, localPosition.y)) + { + m_FirstClick = false; + HandleLeftMouse(localPosition); + } + } + else + { + HandleLeftMouse(localPosition); + } + } + } + else + { + // prevent repeating signals of mousedown (SFML only has MouseDown, so we have to work around it) + m_LeftMouseDown = false; + } + + if (sf::Mouse::isButtonPressed(sf::Mouse::Right) && !m_FirstClick) + { + if ( m_RightMouseDown != true) + { + m_RightMouseDown = true; + sf::Vector2i localPosition = sf::Mouse::getPosition(*(GFXframework::GetInstance()->GetWindow())); + HandleRightMouse(localPosition); + } + } + else + { + // prevent repeating signals of mousedown (SFML only has MouseDown, so we have to work around it) + m_RightMouseDown = false; + } + + if (m_LevelMap->IsMapDone()) + { + m_Finished = true; + if (m_LevelMap->IsMapWon()) + { + m_LevelMap->WinMap(); + } + else + { + m_LevelMap->LoseMap(); + } + } + } + GFXframework::GetInstance()->GetWindow()->clear(); + Render(); + GFXframework::GetInstance()->GetWindow()->display(); + } + +} + +bool Game::HandleLeftMouse(sf::Vector2i localPosition) +{ + m_LevelMap->ClickAt(localPosition.x, localPosition.y); + return true; +} + +bool Game::HandleRightMouse(sf::Vector2i localPosition) +{ + m_LevelMap->RightClickAt(localPosition.x, localPosition.y); + return true; +} + +void Game::HandleGame() +{ +} + +void Game::DrawGui() +{ + // draw bottom bar, for MORE BLING! + for (int x = 0; x < m_SizeX; x++) + { + m_GUISprite.setPosition((float)(x * TILE_SIZE_X), (float)(m_SizeY * TILE_SIZE_Y)); + GFXframework::GetInstance()->GetWindow()->draw(m_GUISprite); + } +} + +void Game::Render() +{ + DrawGui(); + m_LevelMap->Render(); + +} diff --git a/game.h b/game.h new file mode 100644 index 0000000..e6d9d70 --- /dev/null +++ b/game.h @@ -0,0 +1,46 @@ +// MAIN GAME CLASS + +#ifndef GAME_H +#define GAME_H + +class Map; + +#include +#include + +class Game +{ +private: + bool m_Finished; + + int m_SizeX; + int m_SizeY; + int m_numOfBombs; + + bool m_FirstClick; + bool m_LeftMouseDown; + bool m_RightMouseDown; + + sf::Texture m_GUITexture; + sf::Sprite m_GUISprite; + + Map* m_LevelMap; + +public: + Game(); + ~Game(); + + + void Init(); + void Shutdown(int exitCode); // init and shutdown methods, woo + + void MainLoop(); // main loop, call that from the MAIN file and you have a game + bool HandleLeftMouse(sf::Vector2i localPosition); + bool HandleRightMouse(sf::Vector2i localPosition); + void HandleGame(); // some cool stuff may go here, eventually + + void DrawGui(); // draw gui... pretty stuff + void Render(); // render our game. we call this every frame +}; + +#endif \ No newline at end of file diff --git a/general.h b/general.h new file mode 100644 index 0000000..bd277f6 --- /dev/null +++ b/general.h @@ -0,0 +1,16 @@ +#ifndef GENERAL_H +#define GENERAL_H + +const int BOMB = 9; +const int HAPPY = 10; +const int GROUND = 11; +const int FLAG = 12; + +const int TILE_SIZE_X = 64; +const int TILE_SIZE_Y = 64; + +const int SMALL_MAP_SIZE_X = 9; +const int SMALL_MAP_SIZE_Y = 9; +const int SMALL_MAP_BOMBS = 10; + +#endif \ No newline at end of file diff --git a/ground.png b/ground.png new file mode 100644 index 0000000000000000000000000000000000000000..665c5c819a0bd5d1162d02eddcd6eadab73332a7 GIT binary patch literal 1411 zcmV-}1$_F6P)00004XF*Lt006O% z3;baP00009a7bBm000iZ000iZ0XPLyBme*a8gxZibW?9;ba!ELWdKlNX>N2bPDNB8 zb~7$DE-^4L^m3s900jR@L_t(&L)}_!Qrj>PjQOXNs08#?|MH}eb6GdZuy(c+Z-c|o1Sy(j3Do0A7&c^<0 zS7`@FrcNywT}4(oZ<@g2-F}9iIAoubApP}B12;}!?|jgm1{mQ{5G@DEjp+IDVJDXn zK>yc3MZ?g*4HLi{AnjkD-})@0v!2JhioSP&KD}+?1`N|i*2an{oOhu5O8a5K)(^Vn zN1z!U(4C8J7K-e&@T5sBO?DFH@PtbIA~O-f)u-uV89MtAi@^J2cpf|Z0S{!tCHxv` zKA_Vl4PD4S6gpF<_Ovy;SX)(x8xR88)U=0jhCYBIfxy9CLK{^OfY!G&4i`_`DC^gLykX>(@DZTwQz;BAy+r8eQ)HOF?qux;ovlz)XZh@0XB}mlv!WBe zB)|8Ic6pW@XB=LcKzbchh>-=0AP^+i_OhQ&Nd?u&?x(HSClH;&t7K=7YTtuHtPY-s z4=N(`zX3Av)`YMm$IrhF&aLQQ`M{xEnm+;FOpmniN24k#)ET|BN>N(AGHDf6i$DoD zKN>=|K4uiz87vnWifAbG(vUjoWYjD4nn*(k-z#Al2G1-&<37#r< zN-`-Oq7grr6`)kBQb`2(w*X(6CruD(9=kxG*e{+Lw*M&@0LtOQy#!A^i?OZv42 z+kEHP8yPP&QdWmhqB5T<63xZKl3!X0i52DeEZIScE4GBSKI-Tu!sznS^7M8@{X(i? z@qk|CJxRWWtXGJgLy2+%$TO)##YI2s{L!VVWa<4f{yw~X>c0!`$I}m3rKi7D;S$z5 zJ`3gB)68fd#HY@y8omKn&`r&6P6q_7_NGAVax4V+Puun79sPECyAGbw{sZ&*Vh=3C R(njXnSX literal 0 HcmV?d00001 diff --git a/happy.png b/happy.png new file mode 100644 index 0000000000000000000000000000000000000000..4dbceb67325f0603fda30381c432d66ee11157ec GIT binary patch literal 2741 zcmV;m3QF~fP)N2bPDNB8 zb~7$DE-^4L^m3s9017clL_t(|Ue#M!j8sJwt$Mu-Dsk6F~RrT&Y_tw2tx9Vx5j8T20UCQSu+F$Ljrh@xPdL#j$qMO0*g1-Q7 z1-lSII39c^_$)C09x3WM091M%_$e@zZl@$G$9cyDH9^e<-w5tC7(D}kmcARz-$GQD z7NjK?nddVZ@mamVdJe}6PZ@g0tzZJu3+fsGy7h9fC_YY&QZ7eZm0WNBwAQE6kAg1(OPp{4!N~(SAYGnF)7^eBC%BB= z_cq7t-F8|sQ@jjjpiHAw0BG&mU@Ff*v&$TvHs+{)KUM!`*B?}VJD3JbqSPs{NG_!?~rfV9KvCPQ> zh!pcF^XeO>(i{19E9Kpxl^W{Ja9Kv-3YFRGQ}8NqJ9Wf>X=<8nOxN#)^~+PW(sewR zWfx#Tsvo0N^<}p@jQ5mMg-5ljU5tLWyY-0zXq?_+f%q02UMaQ!uwJdVIlou=eqc(V zvDLg)cyo|al}*VCm8Su`TBka-8A=U5o(+td`d@3<_JG(D1GvT~alhRy4Z!k31~3o3 zN4RL+oz0X?fn4N)bFg94$p*n^FWP3o$j4xRVU84H^J&^+bf2^RpH&Is}0N zif&I;kAS5=gW3ncI#7$3qsRo zYkY+FHltneb#-ZWNiR?r*iJ0Ck}Lr7539GmAajaQ^&^9kAnX99MEMM@N;ft~A70U_ zr1x>~T}oUlE@_TYpPwxivZn-iF}ejn>i5@}$9ti_9izGdARL810)_M+_){{&UJ;K8 zbV*bRp41p)Fu$mFcMIm8$74>6I>2Zj-rEE#o{j+aiF@j)zUHSd)249c&Fq$=JjJEW z1y$wMd}DANsT2_ePn1tPaVaeZ`hOz;Ezgd8Wm}NPgM6-#&N@hNP0*|GK6|+vAWl-z zmAZRUKy=Lj^@Z61aOq)=^;<j9%_SND)|d=RX;AZWmgTV{wbR!rq0qFjo;1B zhOfongUOH3Kl`p4iQhdN=BaDaoDFT?}uV&H$5^>FJTOR-eIqd>etKvCl_I3LBf!-T1j|jDQfD zp60}O$a(jO#4`_T(C|Ou3r-zF9D+p%Dme^HwNsl)d*7nv7>EsAH^@@5x;8#&wr~Ay zNsNo31Hf6&0j2D11^~`Sj*)r<=0oG`0b|#3dS6{1FN>TP?o>PNl{@PJTnx$mnw9!I zXA!A5Njoeiod?a>u*~wg)EOX8lJXpy!Jdjs_G^TTIcko5bhu)gCQGBN1@9}(?Qbk7 zpNnNOmA4jv^Y4@Hg>&_xRwbzp+pgiOvJ=%rTQ|>A86KDtNI>^P4Zj*LW2YgQ<9iRs zWW~o?OXBsz@!XB+Q;-#5dOMHDWCh%kFyust$4IU;^iH#-_m_X7Q=X0#`Hb%og*Dij zA!YI;r*w6GFDakzTfBsVtA8E<(?R+n#2y#r#rpHr{Fdr>iw7_W@_Znx7f_t?Ot@nt zZtcr6Yv0@gm+-wHRC$JhvRL)ar!-ooD* zl;>SS60P69=!?7}GfT~~H!67XaFyAS35cY|-qTS2{-CnU*A(LFUyVWh?XW4q;xEAB zliV#HmP3xlY5n%nUnBtBED(gO>w+vu@gT(es9EN2@5}jJeFB!AmSxn=wvzXGnUV%= zr`StUyiIWnxGxtYG1rSrFcp3VAW(dGmHU1^2_CrRn+79hyf4=f(wu}U^#q{?-)eM6nZ~! z6b)hj%S{-SZNIg`zO3X>d6##AT-={+dg1|552FH%6Y~0NmN&UL9z952yXCa%g|$cA v1Cmge7o%z6q$7EzSz0)41?Otvw08difH2fR-4_jc00000NkvXXu0mjfZ&4S3 literal 0 HcmV?d00001 diff --git a/main.cpp b/main.cpp new file mode 100644 index 0000000..0ff75f2 --- /dev/null +++ b/main.cpp @@ -0,0 +1,31 @@ +#include +/* +int main() +{ + sf::RenderWindow window(sf::VideoMode(800, 600), "SFML works!"); + + sf::Texture texture; + if (!texture.loadFromFile("happy.png")) + { + return -1; + } + sf::Sprite sprite(texture); + + sprite.setPosition(100,100); + + while (window.isOpen()) + { + sf::Event event; + while (window.pollEvent(event)) + { + if (event.type == sf::Event::Closed) + window.close(); + } + + window.clear(); + window.draw(sprite); + window.display(); + } + + return 0; +}*/ \ No newline at end of file diff --git a/map.cpp b/map.cpp new file mode 100644 index 0000000..c8d743d --- /dev/null +++ b/map.cpp @@ -0,0 +1,326 @@ +#include "map.h" + +#include "general.h" +#include "tile.h" + +#include +#include +#include + +Map::Map(int sizeX, int sizeY, int numBombs) +{ + srand((unsigned int)time(NULL)); + + m_SizeX = sizeX; + m_SizeY = sizeY; + m_numOfBombs = numBombs; + m_PlacesLeft = m_SizeX * m_SizeY - m_numOfBombs; + + m_MapDone = false; + + m_Layout = NULL; + + Generate(); +} + +Map::~Map() +{ + delete[] m_Layout; +} + +void Map::GenerateFrom(int fromX, int fromY) +{ + if (m_Layout != NULL) + { + delete[] m_Layout; + m_Layout = NULL; + } + + m_PlacesLeft = m_SizeX * m_SizeY - m_numOfBombs; + + m_Layout = new Tile[m_SizeX * m_SizeY]; + + for (int x = 0; x < m_SizeX; x++) + { + for (int y = 0; y < m_SizeY; y++) + { + m_Layout[x+y*m_SizeX].SetType(0); + } + } + int bombCount = m_numOfBombs; + while (bombCount != 0) + { + int posX = rand() % m_SizeX; + int posY = rand() % m_SizeY; + if ( posX > fromX + 1 || posX < fromX -1 || posY > fromY + 1 || posY < fromY - 1) + { + if (m_Layout[posX+posY*m_SizeX].GetType() == 0) + { + m_Layout[posX+posY*m_SizeX].SetType(BOMB); + bombCount--; + } + } + } + + for (int x = 0; x < m_SizeX; x++) + { + for (int y = 0; y < m_SizeY; y++) + { + if (m_Layout[x+y*m_SizeX].GetType() != 9) + { + int bombInNeighbours = 0; + + // CHECK LEFT THREE NEIGHBOURS + if (x > 0) + { + if (y > 0) + { + if (m_Layout[x-1+(y-1)*m_SizeX].GetType() == 9) + { + bombInNeighbours++; + } + } + if (y < m_SizeY - 1) + { + if (m_Layout[x-1+(y+1)*m_SizeX].GetType() == 9) + { + bombInNeighbours++; + } + } + if (m_Layout[x-1+y*m_SizeX].GetType() == 9) + { + bombInNeighbours++; + } + } + // CHECK RIGHT THREE NEIGHBOURS + if (x < m_SizeX - 1) + { + if (y > 0) + { + if (m_Layout[x+1+(y-1)*m_SizeX].GetType() == 9) + { + bombInNeighbours++; + } + } + if (y < m_SizeY - 1) + { + if (m_Layout[x+1+(y+1)*m_SizeX].GetType() == 9) + { + bombInNeighbours++; + } + } + if (m_Layout[x+1+y*m_SizeX].GetType() == 9) + { + bombInNeighbours++; + } + } + // CHECK MIDDLE TWO NEIGHBOURS + if (y > 0) + { + if (m_Layout[x+(y-1)*m_SizeX].GetType() == 9) + { + bombInNeighbours++; + } + } + if (y < m_SizeY - 1) + { + if (m_Layout[x+(y+1)*m_SizeX].GetType() == 9) + { + bombInNeighbours++; + } + } + + m_Layout[x+y*m_SizeX].SetType(bombInNeighbours); + + + } + //m_Layout[x+y*m_SizeX].SetSprite(); + m_Layout[x+y*m_SizeX].SetSpritePosition(x*TILE_SIZE_X, y*TILE_SIZE_Y); + } + } +} + +void Map::Generate() +{ + m_MapDone = false; + GenerateFrom(rand() % m_SizeX, rand() % m_SizeY); +} + +bool Map::GenerateFromClick(int mouseX, int mouseY) +{ + bool found = false; + int currentX = 0; + int currentY = 0; + m_MapDone = false; + for (int x = 0; x < m_SizeX; x++) + { + for (int y = 0; y < m_SizeY; y++) + { + bool revealed = m_Layout[x+y*m_SizeX].TestPosition(mouseX, mouseY); + if (revealed) + { + currentX = x; + currentY = y; + found = true; + DecrementFreePlaces(); + } + } + } + GenerateFrom(currentX, currentY); + return found; +} + +void Map::Render() +{ + for (int x = 0; x < m_SizeX; x++) + { + for (int y = 0; y < m_SizeY; y++) + { + m_Layout[x+y*m_SizeX].Render(); + } + } +} + +void Map::ClickAt(int mouseX, int mouseY) +{ + for (int x = 0; x < m_SizeX; x++) + { + for (int y = 0; y < m_SizeY; y++) + { + bool revealed = m_Layout[x+y*m_SizeX].TestClick(mouseX, mouseY); + if (revealed) + { + if (m_Layout[x+y*m_SizeX].GetType() == 0) + { + Reveal(x, y); + } + else + { + DecrementFreePlaces(); + if (m_Layout[x+y*m_SizeX].GetType() == 9) + { + m_MapDone = true; + } + } + } + } + } +} + +void Map::RightClickAt(int mouseX, int mouseY) +{ + for (int x = 0; x < m_SizeX; x++) + { + for (int y = 0; y < m_SizeY; y++) + { + bool revealed = m_Layout[x+y*m_SizeX].TestRightClick(mouseX, mouseY); + if (revealed) + { + + } + } + } +} + +void Map::Reveal(int indexX, int indexY) +{ + m_Layout[indexX+indexY*m_SizeX].Reveal(); + DecrementFreePlaces(); + if (m_Layout[indexX+indexY*m_SizeX].GetType() == 0) + { + if (indexX > 0) + { + if (indexY > 0) + { + if(m_Layout[indexX - 1 + (indexY - 1) * m_SizeX].IsRevealed() != true) + { + Reveal(indexX - 1, indexY - 1); + } + } + if (indexY < m_SizeY - 1) + { + if(m_Layout[indexX - 1 + (indexY + 1) * m_SizeX].IsRevealed() != true) + { + Reveal(indexX - 1, indexY + 1); + } + } + + if(m_Layout[indexX - 1 + indexY * m_SizeX].IsRevealed() != true) + { + Reveal(indexX - 1, indexY); + } + } + if (indexX < m_SizeX - 1) + { + if (indexY > 0) + { + if(m_Layout[indexX + 1 + (indexY - 1) * m_SizeX].IsRevealed() != true) + { + Reveal(indexX + 1, indexY - 1); + } + } + if (indexY < m_SizeY - 1) + { + if(m_Layout[indexX + 1 + (indexY + 1) * m_SizeX].IsRevealed() != true) + { + Reveal(indexX + 1, indexY + 1); + } + } + + if(m_Layout[indexX + 1 + indexY * m_SizeX].IsRevealed() != true) + { + Reveal(indexX + 1, indexY); + } + } + if (indexY > 0) + { + if(m_Layout[indexX + (indexY - 1) * m_SizeX].IsRevealed() != true) + { + Reveal(indexX, indexY - 1); + } + } + if (indexY < m_SizeY - 1) + { + if(m_Layout[indexX + (indexY + 1) * m_SizeX].IsRevealed() != true) + { + Reveal(indexX, indexY + 1); + } + } + } + +} + + +void Map::DecrementFreePlaces() +{ + m_PlacesLeft--; + if (m_PlacesLeft == 0) + { + m_MapDone = true; + } +} + +void Map::WinMap() +{ + for (int x = 0; x < m_SizeX; x++) + { + for (int y = 0; y < m_SizeY; y++) + { + m_Layout[x+y*m_SizeX].SetType(10); + m_Layout[x+y*m_SizeX].SetSpritePosition(x*TILE_SIZE_X, y*TILE_SIZE_Y); + m_Layout[x+y*m_SizeX].Finish(); + } + } +} + + +void Map::LoseMap() +{ + for (int x = 0; x < m_SizeX; x++) + { + for (int y = 0; y < m_SizeY; y++) + { + m_Layout[x+y*m_SizeX].Finish(); + } + } +} \ No newline at end of file diff --git a/map.h b/map.h new file mode 100644 index 0000000..eef0e97 --- /dev/null +++ b/map.h @@ -0,0 +1,44 @@ +// MAP CLASS, CONTAINS ALL LOGIC AND WINNING/LOSING TESTS + +#ifndef MAP_H +#define MAP_H + +class Tile; + +class Map +{ +private: + Tile* m_Layout; + + int m_SizeX; + int m_SizeY; + int m_numOfBombs; + + int m_PlacesLeft; + bool m_MapDone; + + void DecrementFreePlaces(); + +public: + Map(int sizeX, int sizeY, int numBombs); + ~Map(); + + void Render(); // render to window + + inline bool IsMapWon() { return m_PlacesLeft == 0; } + inline bool IsMapDone() { return m_MapDone; } + void WinMap(); + void LoseMap(); + + // generate map depending on amount of parameters + void Generate(); + void GenerateFrom(int x, int y); + bool GenerateFromClick(int mouseX, int mouseY); + + // process input + void ClickAt(int mouseX, int mouseY); + void RightClickAt(int mouseX, int mouseY); + void Reveal(int indexX, int indexY); +}; + +#endif diff --git a/minesweeper.cpp b/minesweeper.cpp new file mode 100644 index 0000000..cff76f5 --- /dev/null +++ b/minesweeper.cpp @@ -0,0 +1,21 @@ +// A game of minesweeper, written in one day. +// +// CONTROLS: +// Left mouse click - test tile for mine +// Right mouse click - mark tile with a flag or remove a flag +// 'R' key - reset the game +// Esc - exit game + +#include "game.h" + +#ifdef _DEBUG +#include // Visual Leak Detector +#endif + +int main() +{ + Game *game = new Game(); + game->MainLoop(); + delete game; + return 0; +} \ No newline at end of file diff --git a/tile.cpp b/tile.cpp new file mode 100644 index 0000000..3cfcb59 --- /dev/null +++ b/tile.cpp @@ -0,0 +1,79 @@ +#include "tile.h" + +#include "general.h" +#include "GFXframework.h" + +Tile::Tile() +{ + m_Revealed = false; + m_Flagged = false; +} + +Tile::~Tile() +{ +} + + +void Tile::SetSpritePosition(int x, int y) +{ + + m_PosX = x; + m_PosY = y; +} + +void Tile::Render() +{ + if (!m_Flagged) + { + if (m_Revealed) + { + GFXframework::GetInstance()->DisplaySpriteAt(m_Type, m_PosX, m_PosY); + } + else + { + GFXframework::GetInstance()->DisplaySpriteAt(GROUND, m_PosX, m_PosY); + } + } + else + { + GFXframework::GetInstance()->DisplaySpriteAt(FLAG, m_PosX, m_PosY); + } +} + +bool Tile::TestClick(int x, int y) +{ + if ( x > m_PosX && x <= m_PosX + TILE_SIZE_X && + y > m_PosY && y <= m_PosY + TILE_SIZE_Y) + { + if (!m_Revealed && !m_Flagged) + { + m_Revealed = true; + return true; + } + } + return false; +} + +bool Tile::TestRightClick(int x, int y) +{ + if ( x > m_PosX && x <= m_PosX + TILE_SIZE_X && + y > m_PosY && y <= m_PosY + TILE_SIZE_Y) + { + if (!m_Revealed) + { + m_Flagged = !m_Flagged; + return true; + } + } + return false; +} + +bool Tile::TestPosition(int x, int y) +{ + if ( x > m_PosX && x <= m_PosX + TILE_SIZE_X && + y > m_PosY && y <= m_PosY + TILE_SIZE_Y) + { + return true; + } + return false; +} \ No newline at end of file diff --git a/tile.h b/tile.h new file mode 100644 index 0000000..80ba3ab --- /dev/null +++ b/tile.h @@ -0,0 +1,39 @@ +// TILE CLASS, CONTAINS GRAPHICS AND COLLISION TESTS + +#ifndef TILE_H +#define TILE_H + +#include + +class Tile +{ +private: + int m_Type; + bool m_Revealed; + bool m_Flagged; + int m_PosX; + int m_PosY; +public: + Tile(); + ~Tile(); + + inline int GetType() { return m_Type; } + inline void SetType(int type) { m_Type = type; } + + void SetSpritePosition(int x, int y); + + bool IsRevealed() { return m_Revealed; } + inline void Reveal() { m_Revealed = true; } + + // used to fully reveal the tile once the game is done + inline void Finish() { m_Revealed = true; m_Flagged = false; } + + // tests for collision and mechanics for processing the input + bool TestPosition(int x, int y); + bool TestClick(int x, int y); + bool TestRightClick(int x, int y); + + void Render(); +}; + +#endif \ No newline at end of file