I've made a Noughts and Crosses game (Tic Tac Toe) for practice in incorporating C++. My C++ code works perfectly, as I've tested it using simple console input/output. Of interest is the getcell(x, y) function which returns -1 for a O, 0 for empty and 1 for X. I was hoping just to return the array but I couldn't be bothered with pointers.
My code gets the number and draws the appropriate image for that square. The only problem is random Xs do not draw any image at all, it's just left blank, unless I put a default case in the select. I can't imagine why. Apart from the fact I know my C++ is giving the right number, using a simple debuglogger with the right mouse button clicking on a square I can see that the correct number (1) is being reported, but no image being drawn (without default). I'm completely stumped.
Here's my code:
Strict
Import "noughtcross.cpp"
Const XRES = 1024, YRES = 768, IMAGESIZE = 128, SIZE = 3;
Const EMPTY = 0, X = 1, O = -1;
Const XOFFSET = 00, YOFFSET = 00;
Const PLAYING = 0, ONEWINS = 1, TWOWINS = 2, DRAW = 3; 'statuses
Extern
Type gametype
Method makemove(x, y) 'give x and y to make a move there, if possible
Method checkstatus() 'results a status (above)
Method getturn() 'the current turn number, as of yet unused
Method getplayer() 'the current player, as of set unused
Method getcell(x, y) 'results one of the numbers above for empty, X or O
End Type
Function newgame:gametype()
Function endgame(game:gametype)
End Extern;
Graphics XRES, YRES;
SetClsColor(100, 100, 100); 'because empty squares are all mask colour and i haven't drawn a background yet
Local game:gametype = newgame();
SetMaskColor(255, 0, 255);
Local image:Timage = LoadAnimImage("images.png", IMAGESIZE, IMAGESIZE, 0, 3, MASKEDIMAGE);
'frames 0 = empty, 1 = cross, 2 = nought
Local mouseclick = False, rightmouse = False;
Local gamemode = PLAYING;
Local carryon = True;
While (carryon)
Cls;
For Local x = 0 To 2
For Local y = 0 To 2
Select game.getcell(x, y)
Case EMPTY
DrawImage(image, XOFFSET + IMAGESIZE * x, YOFFSET + IMAGESIZE * y, 0);
Case X
DrawImage(image, XOFFSET + IMAGESIZE * x, YOFFSET + IMAGESIZE * y, 1);
Case O
DrawImage(image, XOFFSET + IMAGESIZE * x, YOFFSET + IMAGESIZE * y, 2);
Default 'without this does not draw random Xs
DrawImage(image, XOFFSET + IMAGESIZE * x, YOFFSET + IMAGESIZE * y, 1);
End Select;
Next;
Next;
Flip;
If MouseHit(1)
mouseclick = True;
Else
mouseclick = False;
EndIf;
If MouseHit(2)
rightmouse = True;
Else
rightmouse = False;
EndIf;
If mouseclick 'try to make a move here
game.makemove(Floor(MouseX() - XOFFSET)/IMAGESIZE, Floor(MouseY() - YOFFSET)/IMAGESIZE);
EndIf;
If rightmouse 'gets the current type of piece here
DebugLog game.getcell(Floor(MouseX() - XOFFSET)/IMAGESIZE, Floor(MouseY() - YOFFSET)/IMAGESIZE);
EndIf;
gamemode = game.checkstatus();
If Not gamemode = PLAYING
carryon = False;
EndIf;
If KeyHit(1)
carryon = False;
EndIf;
Wend;
Cls;
Select gamemode
Case PLAYING
DrawText("You exited the game.", 50, 50);
Case ONEWINS
DrawText("Player 1 wins!", 50, 50);
Case TWOWINS
DrawText("Player 2 wins!", 50, 50);
Case DRAW
DrawText("It's a draw.. boring.", 50, 50);
End Select;
DrawText("Any key to exit.", 50, 100);
Flip;
WaitKey();
endgame(game);
End;
|