126 lines
2.3 KiB
HolyC
126 lines
2.3 KiB
HolyC
|
I8 board [9];
|
||
|
I64 board_x[9]={150,250,350,150,250,350,150,250,350};
|
||
|
I64 board_y[9]={150,150,150,250,250,250,350,350,350};
|
||
|
|
||
|
U0 DrawX(CDC *dc,I64 x,I64 y)
|
||
|
{
|
||
|
dc->thick=5;
|
||
|
GrLine3(dc,x-20,y-20,0,x+20,y+20,0);
|
||
|
GrLine3(dc,x+20,y-20,0,x-20,y+20,0);
|
||
|
}
|
||
|
|
||
|
U0 DrawO(CDC *dc,I64 x,I64 y)
|
||
|
{
|
||
|
dc->thick=5;
|
||
|
GrCircle3(dc,x,y,0,25);
|
||
|
}
|
||
|
|
||
|
U0 DrawBoard(I64 player)
|
||
|
{
|
||
|
I64 i;
|
||
|
CDC *dc=DCAlias;
|
||
|
DCFill;
|
||
|
dc->thick=5;
|
||
|
GrLine3(dc,200,100,0,200,400,0);
|
||
|
GrLine3(dc,300,100,0,300,400,0);
|
||
|
GrLine3(dc,100,200,0,400,200,0);
|
||
|
GrLine3(dc,100,300,0,400,300,0);
|
||
|
for (i=0;i<9;i++)
|
||
|
switch (board[i]) {
|
||
|
case 1:
|
||
|
DrawX(dc,board_x[i],board_y[i]);
|
||
|
break;
|
||
|
case 2:
|
||
|
DrawO(dc,board_x[i],board_y[i]);
|
||
|
break;
|
||
|
|
||
|
}
|
||
|
//ms.pos.x,ms.pos.y are mouse x,y.
|
||
|
//ms.lb is mouse left bttn
|
||
|
if (player==1)
|
||
|
DrawX(dc,ms.pos.x-Fs->pix_left,ms.pos.y-Fs->pix_top);
|
||
|
else
|
||
|
DrawO(dc,ms.pos.x-Fs->pix_left,ms.pos.y-Fs->pix_top);
|
||
|
DCDel(dc);
|
||
|
}
|
||
|
|
||
|
U0 TakeTurn(I64 player)
|
||
|
{
|
||
|
I64 i,x=0,y=0;
|
||
|
while (!(100<=x<400) || !(100<=y<400) || board[i]) {
|
||
|
if (player==1)
|
||
|
Beep;
|
||
|
else
|
||
|
Beep(74);
|
||
|
while (!ms.lb) {
|
||
|
DrawBoard(player);
|
||
|
Refresh;
|
||
|
}
|
||
|
while (ms.lb) {
|
||
|
DrawBoard(player);
|
||
|
Refresh;
|
||
|
}
|
||
|
x=ms.pos.x-Fs->pix_left;
|
||
|
y=ms.pos.y-Fs->pix_top;
|
||
|
i=(x-100)/100+(y-100)/100*3;
|
||
|
}
|
||
|
board[i]=player;
|
||
|
}
|
||
|
|
||
|
Bool CheckWinner(I64 player)
|
||
|
{
|
||
|
if ( player==board[0]==board[1]==board[2] ||
|
||
|
player==board[3]==board[4]==board[5] ||
|
||
|
player==board[6]==board[7]==board[8] ||
|
||
|
|
||
|
player==board[0]==board[3]==board[6] ||
|
||
|
player==board[1]==board[4]==board[7] ||
|
||
|
player==board[2]==board[5]==board[8] ||
|
||
|
|
||
|
player==board[0]==board[4]==board[8] ||
|
||
|
player==board[2]==board[4]==board[6] )
|
||
|
return TRUE;
|
||
|
else
|
||
|
return FALSE;
|
||
|
}
|
||
|
|
||
|
U0 DoGame()
|
||
|
{
|
||
|
I64 moves=0;
|
||
|
MemSet(board,0,sizeof(board));
|
||
|
while (TRUE) {
|
||
|
TakeTurn(1);
|
||
|
if (CheckWinner(1)) {
|
||
|
Beep;
|
||
|
Beep;
|
||
|
Beep;
|
||
|
break;
|
||
|
}
|
||
|
if (++moves==9) break;
|
||
|
|
||
|
TakeTurn(2);
|
||
|
if (CheckWinner(2)) {
|
||
|
Beep(74);
|
||
|
Beep(74);
|
||
|
Beep(74);
|
||
|
break;
|
||
|
}
|
||
|
if (++moves==9) break;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
U0 TicTacToe()
|
||
|
{
|
||
|
WinMax; //Maximize window
|
||
|
DocClear; //Clear window text.
|
||
|
"$$GREEN$$CTRL-ALT-c$$FG$$ to exit.\n";
|
||
|
try
|
||
|
while (TRUE)
|
||
|
DoGame;
|
||
|
catch
|
||
|
PutExcept;
|
||
|
DCFill;
|
||
|
}
|
||
|
|
||
|
TicTacToe;
|