#include "types.h"
#include "shell.h"
#include "luffar.h"
#include "mouse.h"
CBoard::CBoard(CPlayer* p1,CPlayer* p2)
{
m_bSearchAll = TRUE;
//Rensa arrayen
for (int temp=0;temp<MAX_X;temp++)
{
for (int temp1=0;temp1<MAX_Y;temp1++)
{
m_nBoard[temp][temp1]=0;
}
}
m_bIsEmpty = TRUE;
m_pPlayer1 = p1;
m_pPlayer2 = p2;
m_pCurrentPlayer = p1;
m_nWhoBegins=1;
x0 = 25;
y0 = 45;
x1 = 435;
y1 = 455;
m_nMargin = 10;
m_nShadow = 5;
m_nCellX = (x1-x0)/MAX_X;
m_nCellY = (y1-y0)/MAX_Y;
//Justera storleken p?brdet s?att det blir delbart
x1=x0+m_nCellX*MAX_X;
y1=y0+m_nCellY*MAX_Y;
msg[0]='\0';
CreateImages();
}
void CBoard::ResetBoard()
{
if (!m_bIsEmpty)
{
for (int temp=0;temp<MAX_X;temp++)
{
for (int temp1=0;temp1<MAX_Y;temp1++)
{
m_nBoard[temp][temp1]=0;
}
}
m_lastPt = CPoint();
m_nextlPt = CPoint();
if (m_nWhoBegins==1)
{
m_pCurrentPlayer = m_pPlayer2;
m_nWhoBegins=2;
}else
{
m_pCurrentPlayer = m_pPlayer1;
m_nWhoBegins=1;
}
m_bIsEmpty = TRUE;
Draw();
Message("-----------------");
Message("New game ... ");
}
}
CBoard::~CBoard()
{
free(m_pImage1);
free(m_pImage2);
}
void CBoard::CreateImages()
{
int r = (m_nCellX>m_nCellY)?m_nCellY:m_nCellX;
r/=2;
r-=1;
int x = 465;
int y = 60;
unsigned int size;
/* calculate the size of the image */
size = imagesize(0,0,r*2,r*2);
/* allocate memory to hold the image */
m_pImage1 = malloc(size);
m_pImage2 = malloc(size);
//Frsta image
setcolor(BLACK);
setfillstyle(SOLID_FILL,BLACK);
fillellipse(x,y,r,r);
setfillstyle(SOLID_FILL,DGRAY);
fillellipse(x-3,y-3,r-4,r-4);
setcolor(LGRAY);
setfillstyle(SOLID_FILL,LGRAY);
fillellipse(x-3,y-3,r-7,r-7);
/* grab the image */
getimage(x-r,y-r,x+r,y+r, m_pImage1);
x = 465;
y = 85;
//Andra image
setcolor(DGRAY);
setfillstyle(SOLID_FILL,DGRAY);
fillellipse(x,y,r,r);
setfillstyle(SOLID_FILL,LGRAY);
fillellipse(x-1,y-2,r-2,r-2);
setcolor(WHITE);
setfillstyle(SOLID_FILL,WHITE);
fillellipse(x-3,y-3,r-7,r-7);
getimage(x-r,y-r,x+r,y+r, m_pImage2);
// putimage(x, y-ARROW_SIZE, arrow, XOR_PUT);
}
void CBoard::Draw()
{
//Bakgrunden fr schackbrdet
HidePoint();
CRect rect(x0-m_nMargin,y0-m_nMargin,
x1+m_nMargin,y1+m_nMargin);
rect.Draw(BROWN,NOCOLOR,TRUE,m_nShadow);
setcolor(BLACK);
for (int temp=0;temp<MAX_Y+1;temp++)
line(x0,y0+temp*m_nCellY,x1,y0+temp*m_nCellY);
for (temp=0;temp<MAX_X+1;temp++)
line(x0+temp*m_nCellX,y0,x0+temp*m_nCellX,y1);
ShowPoint();
}
int CBoard::Go()
{
int scrx=-1,scry=-1,b;
CPoint newPt;
BOOL redraw=FALSE;
if (m_pCurrentPlayer->IsComputer())
{
newPt = Think();
m_nBoard[newPt.x][newPt.y]=m_pCurrentPlayer->WhichPlayer();
redraw = TRUE;
m_bIsEmpty = FALSE;
m_nextlPt = m_lastPt;
m_lastPt = newPt;
}else
{
ReadMouse(scrx,scry,b);
if (b==1)
{
if (CRect(x0,y0,x1,y1).PtInRect(CPoint(scrx,scry)))
{
newPt = CPoint((scrx-x0)/m_nCellX,(scry-y0)/m_nCellY);
if (newPt.x>=MAX_X) newPt.x=MAX_X-1;
if (newPt.y>=MAX_Y) newPt.y=MAX_Y-1;
if (m_nBoard[newPt.x][newPt.y]==0)
{
m_nBoard[newPt.x][newPt.y]=m_pCurrentPlayer->WhichPlayer();
redraw = TRUE;
m_bIsEmpty = FALSE;
m_nextlPt = m_lastPt;
m_lastPt = newPt;
}
}
}
}
//Rita p?skrmen
if (newPt.x!=-1 && newPt.y!=-1 && redraw)
{
HidePoint();
if (m_pCurrentPlayer->WhichPlayer() == 1)
{
putimage(x0+newPt.x*m_nCellX+1,y0+newPt.y*m_nCellY+1,
m_pImage1,COPY_PUT);
}
else
putimage(x0+newPt.x*m_nCellX+1,y0+newPt.y*m_nCellY+1,
m_pImage2,COPY_PUT);
ShowPoint();
//Visa meddelande
msg[0]='\0';
if (m_pCurrentPlayer->IsComputer())
strcat(msg,"Computer ( ");
else
{
strcat(msg,"Player ");
if (m_pCurrentPlayer->WhichPlayer()==1)
strcat(msg,"1 ( ");
else if (m_pCurrentPlayer->WhichPlayer()==2)
strcat(msg,"2 ( ");
}
char temp[3];
IntToChar(newPt.x,temp);
strcat(msg,temp);
strcat(msg,":");
IntToChar(newPt.y,temp);
strcat(msg,temp);
strcat(msg," )");
Message(msg);
//ndra p?current player
if (m_pCurrentPlayer==m_pPlayer1)
m_pCurrentPlayer=m_pPlayer2;
else
m_pCurrentPlayer=m_pPlayer1;
return GetWinner();
}
return -1;
}
CPoint CBoard::RandomPoint()
{
CPoint pt;
do
{
randomize();
pt = CPoint(random(19),random(19));
}while (m_nBoard[pt.x][pt.y]!=0);
return pt;
}
CPoint CBoard::GetEndPoint(int x, int y, Direction d, BOOL& closed)
{
closed = TRUE;
int player=m_nBoard[x][y];
switch (d)
{
case UP:
if (y==0)
return CPoint();
if (m_nBoard[x][y-1]==player && m_nBoard[x][y-1]!=0)
return GetEndPoint(x,y-1,UP,closed);
if (m_nBoard[x][y-1]==0) closed = FALSE;
return CPoint(x,y-1);
case UPRIGHT:
if (y==0 || x==MAX_X-1)
return CPoint();
if ((m_nBoard[x+1][y-1]==player) && ((m_nBoard[x+1][y-1]!=0)))
return GetEndPoint(x+1,y-1,UPRIGHT,closed);
if (m_nBoard[x+1][y-1]==0) closed = FALSE;
return CPoint(x+1,y-1);
case RIGHT:
if (x==MAX_X-1)
return CPoint();
if (m_nBoard[x+1][y]==player && m_nBoard[x+1][y]!=0)
return GetEndPoint(x+1,y,RIGHT,closed);
if (m_nBoard[x+1][y]==0) closed = FALSE;
return CPoint(x+1,y);
case DOWNRIGHT:
if (y==MAX_Y-1 || x==MAX_X-1)
return CPoint();
if (m_nBoard[x+1][y+1]==player && m_nBoard[x+1][y+1]!=0)
return GetEndPoint(x+1,y+1,DOWNRIGHT,closed);
if (m_nBoard[x+1][y+1]==0) closed = FALSE;
return CPoint(x+1,y+1);
case DOWN:
if (y==MAX_Y-1)
return CPoint();
if (m_nBoard[x][y+1]==player && m_nBoard[x][y+1]!=0)
return GetEndPoint(x,y+1,DOWN,closed);
if (m_nBoard[x][y+1]==0) closed = FALSE;
return CPoint(x,y+1);
case DOWNLEFT:
if (y==MAX_Y-1 || x==0)
return CPoint();
if (m_nBoard[x-1][y+1]==player && m_nBoard[x-1][y+1]!=0)
return GetEndPoint(x-1,y+1,DOWNLEFT,closed);
if (m_nBoard[x-1][y+1]==0) closed = FALSE;
return CPoint(x-1,y+1);
case LEFT:
if (x==0)
return CPoint();
if (m_nBoard[x-1][y]==player && m_nBoard[x-1][y]!=0)
return GetEndPoint(x-1,y,LEFT,closed);
if (m_nBoard[x-1][y]==0) closed = FALSE;
return CPoint(x-1,y);
case UPLEFT:
if (x==0 || y==0)
return CPoint();
if (m_nBoard[x-1][y-1]==player && m_nBoard[x-1][y-1]!=0)
return GetEndPoint(x-1,y-1,UPLEFT,closed);
if (m_nBoard[x-1][y-1]==0) closed = FALSE;
return CPoint(x-1,y-1);
} return CPoint();
}
CPoint CBoard::SearchAll(int player, int count, int param)
{
CPoint pt;
// Sk genom hela spelet
for (int temp=0;temp<MAX_X;temp++)
{
for (int temp1=0;temp1<MAX_Y;temp1++)
{
if (m_nBoard[temp][temp1]==player)
{
pt = Analyse(temp,temp1,count,param);
if (pt.x != -1) return pt;
}
}
}
return pt;
}
CPoint CBoard::Think()
{
Message("I'm thinking...");
CPoint pt;
//Om det r ett nytt spel
if (m_lastPt.x==-1)
return CPoint(10,9);
else if (m_nextlPt.x==-1)
return CPoint(m_lastPt.x+1,m_lastPt.y);
else
{
// 1. Se om jag har 4 i rad eller 3 i rad med 1 till i nrheten
pt = Analyse(m_nextlPt.x, m_nextlPt.y, 4);
if (pt.x != -1) return pt;
if (m_bSearchAll)
{
pt = SearchAll(m_nBoard[m_nextlPt.x][m_nextlPt.y],4);
if (pt.x != -1) return pt;
}
// 2. Se om motstndaren har 4 i rad.
pt = Analyse(m_lastPt.x, m_lastPt.y, 4);
if (pt.x != -1) return pt;
if (m_bSearchAll)
{
pt = SearchAll(m_nBoard[m_lastPt.x][m_lastPt.y],4);
if (pt.x != -1) return pt;
}
// 3. Se om jag har 3 i rad eller 2 i rad plus en till i nrheten
pt = Analyse(m_nextlPt.x, m_nextlPt.y, 3);
if (pt.x != -1) return pt;
if (m_bSearchAll)
{
pt = SearchAll(m_nBoard[m_nextlPt.x][m_nextlPt.y],3);
if (pt.x != -1) return pt;
}
// 4. Se om motstndaren har
评论0