Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include "MinesweeperBoard.h"
- #include <iostream>
- #include<cstdlib>
- #include<time.h>
- using namespace std;
- MinesweeperBoard::MinesweeperBoard(int outWidth,int outHeight,GameMode mode)
- {
- MineCount=0;
- width=outWidth;
- height=outHeight;
- int x,y;
- srand(time(NULL));
- if(mode==EASY)
- {
- for(int i=0;i<height;i++)
- for(int j=0;j<width;j++)
- board[j][i].isRevealed=false;
- allMines=0.1*width*height;
- for(int i=0;i<allMines;i++)
- {
- x=rand()%width;
- y=rand()%height;
- if(board[x][y].hasMine==true)
- {
- do{
- x=rand()%width;
- y=rand()%height;
- }while(board[x][y].hasMine==false);
- board[x][y].hasMine=true;
- }
- else
- board[x][y].hasMine=true;
- }
- }
- else if(mode==NORMAL)
- {
- for(int i=0;i<height;i++)
- for(int j=0;j<width;j++)
- board[j][i].isRevealed=false;
- allMines=0.2*width*height;
- for(int i=0;i<allMines;i++)
- {
- x=rand()%width;
- y=rand()%height;
- if(board[x][y].hasMine==true)
- {
- do{
- x=rand()%width;
- y=rand()%height;
- }while(board[x][y].hasMine==false);
- board[x][y].hasMine=true;
- }
- else
- board[x][y].hasMine=true;
- }
- }
- else if(mode==HARD)
- {
- for(int i=0;i<height;i++)
- for(int j=0;j<width;j++)
- board[j][i].isRevealed=false;
- allMines=0.3*width*height;
- for(int i=0;i<allMines;i++)
- {
- x=rand()%width;
- y=rand()%height;
- if(board[x][y].hasMine==true)
- {
- do{
- x=rand()%width;
- y=rand()%height;
- }while(board[x][y].hasMine==false);
- board[x][y].hasMine=true;
- }
- else
- board[x][y].hasMine=true;
- }
- }
- else if(mode==DEBUG)
- {
- for(int i=0;i<height;i++)
- for(int j=0;j<width;j++)
- {
- board[j][i].isRevealed=false;
- if(i==j)
- board[j][i].hasMine=true;
- else if(i==0)
- board[j][i].hasMine=true;
- else if(j==0&&i%2==0)
- board[j][i].hasMine=true;
- }
- }
- }
- MinesweeperBoard::getBoardHeight()const
- {
- return height;
- }
- MinesweeperBoard::getBoardWidth()const
- {
- return width;
- }
- MinesweeperBoard::getMineCount()const
- {
- return MineCount;
- }
- int MinesweeperBoard::countMines(int x,int y)
- {
- int mines=0;
- if(board[x][y].isRevealed==true)
- return -1;
- if(x<0 || x>height || y<0 ||y>width)
- return -1;
- if(x==0)
- {
- if(board[x][y-1].hasMine==true)
- mines++;
- if(board[x][y+1].hasMine==true)
- mines++;
- if(board[x+1][y-1].hasMine==true)
- mines++;
- if(board[x+1][y].hasMine==true)
- mines++;
- if(board[x+1][y+1].hasMine==true)
- mines++;
- }
- else if(y==0)
- {
- if(board[x-1][y].hasMine==true)
- mines++;
- if(board[x][y+1].hasMine==true)
- mines++;
- if(board[x+1][y].hasMine==true)
- mines++;
- if(board[x+1][y+1].hasMine==true)
- mines++;
- if(board[x-1][y+1].hasMine==true)
- mines++;
- }
- else
- {
- if(board[x-1][y-1].hasMine==true)
- mines++;
- if(board[x-1][y].hasMine==true)
- mines++;
- if(board[x-1][y+1].hasMine==true)
- mines++;
- if(board[x][y-1].hasMine==true)
- mines++;
- if(board[x][y+1].hasMine==true)
- mines++;
- if(board[x+1][y-1].hasMine==true)
- mines++;
- if(board[x+1][y].hasMine==true)
- mines++;
- if(board[x+1][y+1].hasMine==true)
- mines++;
- }
- MineCount=mines;
- return MineCount;
- }
- void MinesweeperBoard::debug_display()const
- {
- for(int i=0; i<height; i++)
- {
- for(int j=0; j<width; j++)
- {
- cout<<"[";
- if(board[j][i].hasMine==false)
- cout<<".";
- else
- cout<<"M";
- if(board[j][i].isRevealed==false)
- cout<<".";
- else
- cout<<"o";
- if(board[j][i].hasFlag==false)
- cout<<".";
- else
- cout<<"f";
- cout<<"]";
- }
- cout<<endl;
- }
- }
- int MinesweeperBoard::hasFlag(int x, int y)const
- {
- if(board[x][y].hasFlag==true)
- return true;
- else if(board[x][y].isRevealed==true ||x<0 || x>height || y<0 || y>width || board[x][y].hasFlag==false )
- return false;
- }
- void MinesweeperBoard::toggleFlag(int x,int y)
- {
- if(board[x][y].isRevealed==false)
- {
- if(board[x][y].hasFlag==true)
- board[x][y].hasFlag=false;
- else if(board[x][y].hasFlag==false)
- board[x][y].hasFlag=true;
- }
- }
- void MinesweeperBoard::revealField(int x,int y)
- {
- if(board[x][y].isRevealed==false)
- board[x][y].isRevealed=true;
- else if(board[x][y].isRevealed==false&&board[x][y].hasMine==true)
- {
- board[x][y].isRevealed=true;
- state=FINISHED_LOSS;
- }
- }
- bool MinesweeperBoard::isRevealed(int x,int y)const
- {
- if(board[x][y].isRevealed==true)
- return true;
- }
- GameState MinesweeperBoard::getGameState()const
- {
- int X=0,Y=0;
- for(int i=0;i<height;i++)
- for(int j=0;j<width;j++)
- {
- if(board[j][i].hasMine==true && board[j][i].isRevealed==true)
- X=1;
- else if((board[j][i].hasMine==true && board[j][i].isRevealed==false)||(board[j][i].hasMine==true && board[j][i].hasFlag==true))
- Y++;
- }
- if(X==1)
- return FINISHED_LOSS;
- else if(Y==allMines)
- return FINISHED_WIN;
- else if(Y<allMines)
- return RUNNING;
- }
- char MinesweeperBoard::getFieldInfo(int x,int y)const
- {
- char q=MineCount+48;
- if(x<0 || x>height || y<0 || y>width)
- return '#';
- else if(board[x][y].hasFlag==true &&board[x][y].isRevealed==false)
- return 'F';
- else if(board[x][y].hasFlag==false &&board[x][y].isRevealed==false)
- return '_';
- else if(board[x][y].isRevealed==true &&board[x][y].hasMine==true)
- return 'x';
- else if(board[x][y].isRevealed==true && MineCount==0)
- return ' ';
- else if(board[x][y].isRevealed==true && MineCount>0)
- return q;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement