Advertisement
Guest User

Untitled

a guest
Mar 19th, 2019
64
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.49 KB | None | 0 0
  1. #include "MinesweeperBoard.h"
  2. #include <iostream>
  3. #include<cstdlib>
  4. #include<time.h>
  5. using namespace std;
  6.  
  7.  
  8. MinesweeperBoard::MinesweeperBoard(int outWidth,int outHeight,GameMode mode)
  9. {
  10. MineCount=0;
  11. width=outWidth;
  12. height=outHeight;
  13. int x,y;
  14. srand(time(NULL));
  15.  
  16. if(mode==EASY)
  17. {
  18. for(int i=0;i<height;i++)
  19. for(int j=0;j<width;j++)
  20. board[j][i].isRevealed=false;
  21.  
  22. allMines=0.1*width*height;
  23. for(int i=0;i<allMines;i++)
  24. {
  25. x=rand()%width;
  26. y=rand()%height;
  27. if(board[x][y].hasMine==true)
  28. {
  29. do{
  30. x=rand()%width;
  31. y=rand()%height;
  32. }while(board[x][y].hasMine==false);
  33. board[x][y].hasMine=true;
  34. }
  35. else
  36. board[x][y].hasMine=true;
  37.  
  38. }
  39. }
  40.  
  41. else if(mode==NORMAL)
  42. {
  43. for(int i=0;i<height;i++)
  44. for(int j=0;j<width;j++)
  45. board[j][i].isRevealed=false;
  46.  
  47. allMines=0.2*width*height;
  48. for(int i=0;i<allMines;i++)
  49. {
  50. x=rand()%width;
  51. y=rand()%height;
  52. if(board[x][y].hasMine==true)
  53. {
  54. do{
  55. x=rand()%width;
  56. y=rand()%height;
  57. }while(board[x][y].hasMine==false);
  58. board[x][y].hasMine=true;
  59. }
  60. else
  61. board[x][y].hasMine=true;
  62.  
  63. }
  64. }
  65.  
  66. else if(mode==HARD)
  67. {
  68. for(int i=0;i<height;i++)
  69. for(int j=0;j<width;j++)
  70. board[j][i].isRevealed=false;
  71.  
  72. allMines=0.3*width*height;
  73. for(int i=0;i<allMines;i++)
  74. {
  75. x=rand()%width;
  76. y=rand()%height;
  77. if(board[x][y].hasMine==true)
  78. {
  79. do{
  80. x=rand()%width;
  81. y=rand()%height;
  82. }while(board[x][y].hasMine==false);
  83. board[x][y].hasMine=true;
  84. }
  85. else
  86. board[x][y].hasMine=true;
  87.  
  88. }
  89. }
  90.  
  91. else if(mode==DEBUG)
  92. {
  93. for(int i=0;i<height;i++)
  94. for(int j=0;j<width;j++)
  95. {
  96. board[j][i].isRevealed=false;
  97.  
  98.  
  99.  
  100. if(i==j)
  101. board[j][i].hasMine=true;
  102.  
  103. else if(i==0)
  104. board[j][i].hasMine=true;
  105.  
  106. else if(j==0&&i%2==0)
  107. board[j][i].hasMine=true;
  108. }
  109.  
  110. }
  111.  
  112. }
  113.  
  114.  
  115. MinesweeperBoard::getBoardHeight()const
  116. {
  117. return height;
  118. }
  119. MinesweeperBoard::getBoardWidth()const
  120. {
  121. return width;
  122.  
  123. }
  124. MinesweeperBoard::getMineCount()const
  125. {
  126. return MineCount;
  127. }
  128. int MinesweeperBoard::countMines(int x,int y)
  129. {
  130.  
  131.  
  132.  
  133. int mines=0;
  134.  
  135.  
  136. if(board[x][y].isRevealed==true)
  137. return -1;
  138.  
  139. if(x<0 || x>height || y<0 ||y>width)
  140. return -1;
  141.  
  142.  
  143. if(x==0)
  144. {
  145. if(board[x][y-1].hasMine==true)
  146. mines++;
  147.  
  148. if(board[x][y+1].hasMine==true)
  149. mines++;
  150.  
  151. if(board[x+1][y-1].hasMine==true)
  152. mines++;
  153.  
  154. if(board[x+1][y].hasMine==true)
  155. mines++;
  156.  
  157. if(board[x+1][y+1].hasMine==true)
  158. mines++;
  159. }
  160.  
  161. else if(y==0)
  162. {
  163. if(board[x-1][y].hasMine==true)
  164. mines++;
  165.  
  166. if(board[x][y+1].hasMine==true)
  167. mines++;
  168.  
  169. if(board[x+1][y].hasMine==true)
  170. mines++;
  171.  
  172. if(board[x+1][y+1].hasMine==true)
  173. mines++;
  174.  
  175. if(board[x-1][y+1].hasMine==true)
  176. mines++;
  177.  
  178. }
  179.  
  180. else
  181. {
  182.  
  183. if(board[x-1][y-1].hasMine==true)
  184. mines++;
  185.  
  186. if(board[x-1][y].hasMine==true)
  187. mines++;
  188.  
  189. if(board[x-1][y+1].hasMine==true)
  190. mines++;
  191.  
  192. if(board[x][y-1].hasMine==true)
  193. mines++;
  194.  
  195. if(board[x][y+1].hasMine==true)
  196. mines++;
  197.  
  198. if(board[x+1][y-1].hasMine==true)
  199. mines++;
  200.  
  201. if(board[x+1][y].hasMine==true)
  202. mines++;
  203.  
  204. if(board[x+1][y+1].hasMine==true)
  205. mines++;
  206.  
  207. }
  208.  
  209. MineCount=mines;
  210.  
  211. return MineCount;
  212. }
  213.  
  214. void MinesweeperBoard::debug_display()const
  215. {
  216.  
  217. for(int i=0; i<height; i++)
  218. {
  219.  
  220. for(int j=0; j<width; j++)
  221. {
  222. cout<<"[";
  223.  
  224. if(board[j][i].hasMine==false)
  225. cout<<".";
  226. else
  227. cout<<"M";
  228.  
  229. if(board[j][i].isRevealed==false)
  230. cout<<".";
  231. else
  232. cout<<"o";
  233.  
  234. if(board[j][i].hasFlag==false)
  235. cout<<".";
  236. else
  237. cout<<"f";
  238.  
  239. cout<<"]";
  240. }
  241. cout<<endl;
  242. }
  243.  
  244. }
  245. int MinesweeperBoard::hasFlag(int x, int y)const
  246. {
  247.  
  248.  
  249. if(board[x][y].hasFlag==true)
  250. return true;
  251.  
  252. else if(board[x][y].isRevealed==true ||x<0 || x>height || y<0 || y>width || board[x][y].hasFlag==false )
  253. return false;
  254. }
  255.  
  256. void MinesweeperBoard::toggleFlag(int x,int y)
  257. {
  258. if(board[x][y].isRevealed==false)
  259. {
  260. if(board[x][y].hasFlag==true)
  261. board[x][y].hasFlag=false;
  262.  
  263. else if(board[x][y].hasFlag==false)
  264. board[x][y].hasFlag=true;
  265. }
  266. }
  267.  
  268. void MinesweeperBoard::revealField(int x,int y)
  269. {
  270. if(board[x][y].isRevealed==false)
  271. board[x][y].isRevealed=true;
  272.  
  273. else if(board[x][y].isRevealed==false&&board[x][y].hasMine==true)
  274. {
  275. board[x][y].isRevealed=true;
  276. state=FINISHED_LOSS;
  277. }
  278. }
  279.  
  280.  
  281. bool MinesweeperBoard::isRevealed(int x,int y)const
  282. {
  283. if(board[x][y].isRevealed==true)
  284. return true;
  285. }
  286.  
  287. GameState MinesweeperBoard::getGameState()const
  288. {
  289. int X=0,Y=0;
  290.  
  291.  
  292. for(int i=0;i<height;i++)
  293. for(int j=0;j<width;j++)
  294. {
  295. if(board[j][i].hasMine==true && board[j][i].isRevealed==true)
  296. X=1;
  297.  
  298. else if((board[j][i].hasMine==true && board[j][i].isRevealed==false)||(board[j][i].hasMine==true && board[j][i].hasFlag==true))
  299. Y++;
  300. }
  301. if(X==1)
  302. return FINISHED_LOSS;
  303.  
  304. else if(Y==allMines)
  305. return FINISHED_WIN;
  306.  
  307. else if(Y<allMines)
  308. return RUNNING;
  309.  
  310. }
  311.  
  312.  
  313. char MinesweeperBoard::getFieldInfo(int x,int y)const
  314. {
  315. char q=MineCount+48;
  316.  
  317.  
  318. if(x<0 || x>height || y<0 || y>width)
  319. return '#';
  320.  
  321. else if(board[x][y].hasFlag==true &&board[x][y].isRevealed==false)
  322. return 'F';
  323.  
  324. else if(board[x][y].hasFlag==false &&board[x][y].isRevealed==false)
  325. return '_';
  326.  
  327. else if(board[x][y].isRevealed==true &&board[x][y].hasMine==true)
  328. return 'x';
  329.  
  330. else if(board[x][y].isRevealed==true && MineCount==0)
  331. return ' ';
  332.  
  333. else if(board[x][y].isRevealed==true && MineCount>0)
  334. return q;
  335.  
  336.  
  337. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement