/*	Treasure Hunt program */

#include <gui_top.h>
#include <matrix.h>
#include <lvpstring.h>
//#include <lvp\bool.h>
#include <lvprandom.h>

using namespace std;	// October 5, 2001

class GridClass {
	public:
	GridClass();
	void Paint();
	void MouseClick(int x, int y);
	private:
	const int GridDimension;    // # of rows and columns in grid
	// Constants for board; must all differ
	const int Empty, EmptyPicked, Treasure, TreasurePicked;
	matrix<int> Board;    // Uses above constants
	bool GameOver;
	int NumClicks;
	int BoxSize;    // Pixels per box
	int LeftMargin;    // Pixels from left
	int TopMargin;    // Pixels from top
	void XYToRowCol(int x, int y, int &Row, int &Col);
	void MarkBox(int Row, int Col, int BoxContents);
};

GridClass::GridClass()
	: GridDimension(5),
	Empty(0), EmptyPicked(-1), Treasure(1), TreasurePicked(2),
	Board(GridDimension, GridDimension,0),
	NumClicks(0), GameOver(false),
	BoxSize(GetMaxY()/2/GridDimension),     // Fill half of y
	LeftMargin((GetMaxX()-BoxSize*GridDimension)/2),
	TopMargin(GetMaxY()/4)
{
	randomize();
	Board[lvprandom(GridDimension)][lvprandom(GridDimension)] = Treasure;
}
//--------------------------------------------------------------------------------
void GridClass::XYToRowCol(int x, int y, int &Row, int &Col)
/*	Post: Row and Column corresponding to x, y returned, 
	or –1 returned if x, y is not on the board                          */
{
	int DistFromLeft = x - LeftMargin;
	Col = (DistFromLeft+BoxSize)/BoxSize-1;
	int DistFromTop = y - TopMargin;
	Row = (DistFromTop+BoxSize)/BoxSize-1;
	if (Col < 0 || Col >= GridDimension ||
		Row < 0 || Row >= GridDimension) {
		Row = -1;
		Col = -1;
	}
}
//--------------------------------------------------------------------------------
void GridClass::MarkBox(int Row, int Col, int BoxContents)
/*	Post: Row, Col box in appropriate color */
{
	SetColor(BLACK);    // For outline
	SetFillColor(WHITE);
	if (BoxContents==EmptyPicked)
		SetFillColor(GRAY);
	else if (BoxContents==TreasurePicked)
		SetFillColor(RED);
	FilledRectangle(Col*BoxSize+LeftMargin, Row*BoxSize+TopMargin,
		(Col+1)*BoxSize+LeftMargin, (Row+1)*BoxSize+TopMargin);
}
//--------------------------------------------------------------------------------
void GridClass::MouseClick(int x, int y)
{
	int Row, Col;
	XYToRowCol(x, y, Row, Col);
	if (Row != -1 && Col != -1 && Board[Row][Col] != EmptyPicked) {
		if (Board[Row][Col] == Empty)
			Board[Row][Col] = EmptyPicked;
		else if (Board[Row][Col] == Treasure) {
			Board[Row][Col] = TreasurePicked;
			GameOver = true;
		}
		NumClicks++;
	}
}
//--------------------------------------------------------------------------------
void GridClass::Paint()
{
	SetColor(BLACK);
	int Row,Col;
	// Draw lines
	for (Col = 0; Col <= GridDimension; Col++)
		Line(LeftMargin+Col*BoxSize, TopMargin,
			LeftMargin+Col*BoxSize, TopMargin+GridDimension*BoxSize);
	for (Row = 0; Row <= GridDimension; Row++)
		Line(LeftMargin, TopMargin+Row*BoxSize,
			LeftMargin+GridDimension*BoxSize, TopMargin+Row*BoxSize);
	// Color in boxes
	for (Row=0; Row < GridDimension; Row++)
		for (Col=0; Col < GridDimension; Col++)
			MarkBox(Row, Col, Board[Row][Col]);
	// Display results
	if (GameOver==true) {
		gotoxy(20, 20);
		DrawText("Game over!  Score = ");
		DrawText(NumClicks);
	}
}
//--------------------------------------------------------------------------------
//--------------------------------------------------------------------------------
class GuiClass {
	public:
	GuiClass();
	void GuiMouseClick(int x, int y);    // Action if mouse click
	void GuiPaint();    // Repaint the entire window
	lvpstring Title();    // Title to display
	private:
	GridClass Game;
};
//--------------------------------------------------------------------------------
GuiClass::GuiClass()
{
}
//--------------------------------------------------------------------------------
lvpstring GuiClass::Title()
{
	return ("Treasure hunt!");
}
//--------------------------------------------------------------------------------
void GuiClass::GuiMouseClick(int x, int y)
{
	Game.MouseClick(x, y);
}
//--------------------------------------------------------------------------------
void GuiClass::GuiPaint()
{
	Game.Paint();
}
//--------------------------------------------------------------------------------
#include <gui_bot.h>

