XO-game/source/main.cpp

325 lines
14 KiB
C++
Raw Normal View History

2023-09-10 08:50:41 +00:00
#include <3ds.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <citro2d.h>
int player = 1; //1 - X 2 - O
bool win = false;
2023-09-10 17:44:19 +00:00
bool all9 = false;
2023-09-10 08:50:41 +00:00
int pressedSquares[9] = {0,0,0,0,0,0,0,0,0};
2023-11-27 10:09:46 +00:00
int winCount[3] = {0,0,0}; //0 - X 1 - O 2 - Draw
2023-09-10 18:39:17 +00:00
bool addedWin = false;
2023-09-10 08:50:41 +00:00
C3D_RenderTarget* top;
C3D_RenderTarget* bottom;
void drawGridTopScreen()
{
C2D_DrawLine(0, 0, C2D_Color32(0xFF, 0xFF, 0xFF, 0xFF), 0, 180, C2D_Color32(0xFF, 0xFF, 0xFF, 0xFF), 2, 0);
C2D_DrawLine(1, 1, C2D_Color32(0xFF, 0xFF, 0xFF, 0xFF), 300, 1, C2D_Color32(0xFF, 0xFF, 0xFF, 0xFF), 2, 0);
C2D_DrawLine(100, 0, C2D_Color32(0xFF, 0xFF, 0xFF, 0xFF), 100, 180, C2D_Color32(0xFF, 0xFF, 0xFF, 0xFF), 2, 0);
C2D_DrawLine(200, 0, C2D_Color32(0xFF, 0xFF, 0xFF, 0xFF), 200, 180, C2D_Color32(0xFF, 0xFF, 0xFF, 0xFF), 2, 0);
C2D_DrawLine(300, 0, C2D_Color32(0xFF, 0xFF, 0xFF, 0xFF), 300, 180, C2D_Color32(0xFF, 0xFF, 0xFF, 0xFF), 2, 0);
C2D_DrawLine(0, 60, C2D_Color32(0xFF, 0xFF, 0xFF, 0xFF), 300, 60, C2D_Color32(0xFF, 0xFF, 0xFF, 0xFF), 2, 0);
C2D_DrawLine(0, 120, C2D_Color32(0xFF, 0xFF, 0xFF, 0xFF), 300, 120, C2D_Color32(0xFF, 0xFF, 0xFF, 0xFF), 2, 0);
C2D_DrawLine(0, 180, C2D_Color32(0xFF, 0xFF, 0xFF, 0xFF), 300, 180, C2D_Color32(0xFF, 0xFF, 0xFF, 0xFF), 2, 0);
}
void drawGridBottomScreen()
{
//320x240
C2D_DrawLine(0, 0, C2D_Color32(0xFF, 0xFF, 0xFF, 0xFF), 0, 240, C2D_Color32(0xFF, 0xFF, 0xFF, 0xFF), 2, 0);
C2D_DrawLine(1, 1, C2D_Color32(0xFF, 0xFF, 0xFF, 0xFF), 320, 1, C2D_Color32(0xFF, 0xFF, 0xFF, 0xFF), 2, 0);
C2D_DrawLine(0, 80, C2D_Color32(0xFF, 0xFF, 0xFF, 0xFF), 320, 80, C2D_Color32(0xFF, 0xFF, 0xFF, 0xFF), 2, 0);
C2D_DrawLine(0, 160, C2D_Color32(0xFF, 0xFF, 0xFF, 0xFF), 320, 160, C2D_Color32(0xFF, 0xFF, 0xFF, 0xFF), 2, 0);
C2D_DrawLine(0, 240, C2D_Color32(0xFF, 0xFF, 0xFF, 0xFF), 320, 240, C2D_Color32(0xFF, 0xFF, 0xFF, 0xFF), 2, 0);
C2D_DrawLine(106, 0, C2D_Color32(0xFF, 0xFF, 0xFF, 0xFF), 106, 240, C2D_Color32(0xFF, 0xFF, 0xFF, 0xFF), 2, 0);
C2D_DrawLine(212, 0, C2D_Color32(0xFF, 0xFF, 0xFF, 0xFF), 212, 240, C2D_Color32(0xFF, 0xFF, 0xFF, 0xFF), 2, 0);
C2D_DrawLine(320, 0, C2D_Color32(0xFF, 0xFF, 0xFF, 0xFF), 320, 240, C2D_Color32(0xFF, 0xFF, 0xFF, 0xFF), 2, 0);
}
void drawWhoseMove()
{
C2D_Text text;
C2D_TextBuf buf = C2D_TextBufNew(4096);
if(player == 1)
{
C2D_TextParse(&text, buf, "X's move");
C2D_TextOptimize(&text);
C2D_DrawText(&text, C2D_WithColor, 10, 200, 0, 0.5f, 0.5f, C2D_Color32(0xFF, 0xFF, 0xFF, 0xFF));
}
else
{
C2D_TextParse(&text, buf, "O's move");
C2D_TextOptimize(&text);
C2D_DrawText(&text, C2D_WithColor, 10, 200, 0, 0.5f, 0.5f, C2D_Color32(0xFF, 0xFF, 0xFF, 0xFF));
}
C2D_TextBufDelete(buf);
}
2023-09-10 17:01:45 +00:00
void drawMoves(int display)
{
for(int square = 0; square < 9; square++)
{
if(pressedSquares[square] == 1)
{
if(display == 1)
{
C2D_DrawLine(10 + (square % 3) * 100, 10 + (square / 3) * 60, C2D_Color32(0xFF, 0xFF, 0xFF, 0xFF), 90 + (square % 3) * 100, 50 + (square / 3) * 60, C2D_Color32(0xFF, 0xFF, 0xFF, 0xFF), 2, 0);
C2D_DrawLine(90 + (square % 3) * 100, 10 + (square / 3) * 60, C2D_Color32(0xFF, 0xFF, 0xFF, 0xFF), 10 + (square % 3) * 100, 50 + (square / 3) * 60, C2D_Color32(0xFF, 0xFF, 0xFF, 0xFF), 2, 0);
}
else
{
C2D_DrawLine(10 + (square % 3) * 106, 10 + (square / 3) * 80, C2D_Color32(0xFF, 0xFF, 0xFF, 0xFF), 96 + (square % 3) * 106, 70 + (square / 3) * 80, C2D_Color32(0xFF, 0xFF, 0xFF, 0xFF), 2, 0);
C2D_DrawLine(96 + (square % 3) * 106, 10 + (square / 3) * 80, C2D_Color32(0xFF, 0xFF, 0xFF, 0xFF), 10 + (square % 3) * 106, 70 + (square / 3) * 80, C2D_Color32(0xFF, 0xFF, 0xFF, 0xFF), 2, 0);
}
}
else if(pressedSquares[square] == 2)
{
if(display == 1)
{
C2D_DrawCircleSolid(50 + (square % 3) * 100, 30 + (square / 3) * 60, 0, 25, C2D_Color32(0xFF, 0xFF, 0xFF, 0xFF));
2023-11-27 10:09:46 +00:00
C2D_DrawCircleSolid(50 + (square % 3) * 100, 30 + (square / 3) * 60, 0, 20, C2D_Color32(0x00, 0x00, 0x00, 0xFF));
2023-09-10 17:01:45 +00:00
}
else
{
C2D_DrawCircleSolid(53 + (square % 3) * 106, 40 + (square / 3) * 80, 0, 25, C2D_Color32(0xFF, 0xFF, 0xFF, 0xFF));
2023-11-27 10:09:46 +00:00
C2D_DrawCircleSolid(53 + (square % 3) * 106, 40 + (square / 3) * 80, 0, 20, C2D_Color32(0x00, 0x00, 0x00, 0xFF));
2023-09-10 17:01:45 +00:00
}
}
}
}
2023-09-10 16:10:31 +00:00
void touching(touchPosition touch)
{
2023-09-10 18:39:17 +00:00
addedWin = false;
2023-09-10 16:10:31 +00:00
if(touch.px < 106 && touch.py < 80 && pressedSquares[0] == 0)
{
pressedSquares[0] = player;
player = player == 1 ? 2 : 1;
}
else if(touch.px < 212 && touch.px > 80 && touch.py < 80 && pressedSquares[1] == 0)
{
pressedSquares[1] = player;
player = player == 1 ? 2 : 1;
}
else if(touch.px < 320 && touch.px > 212 && touch.py < 80 && pressedSquares[2] == 0)
{
pressedSquares[2] = player;
player = player == 1 ? 2 : 1;
}
else if(touch.px < 106 && touch.py < 160 && touch.py > 80 && pressedSquares[3] == 0)
{
pressedSquares[3] = player;
player = player == 1 ? 2 : 1;
}
else if(touch.px < 212 && touch.px > 80 && touch.py < 160 && touch.py > 80 && pressedSquares[4] == 0)
{
pressedSquares[4] = player;
player = player == 1 ? 2 : 1;
}
else if(touch.px < 320 && touch.px > 212 && touch.py < 160 && touch.py > 80 && pressedSquares[5] == 0)
{
pressedSquares[5] = player;
player = player == 1 ? 2 : 1;
}
else if(touch.px < 106 && touch.py < 240 && touch.py > 160 && pressedSquares[6] == 0)
{
pressedSquares[6] = player;
player = player == 1 ? 2 : 1;
}
else if(touch.px < 212 && touch.px > 80 && touch.py < 240 && touch.py > 160 && pressedSquares[7] == 0)
{
pressedSquares[7] = player;
player = player == 1 ? 2 : 1;
}
else if(touch.px < 320 && touch.px > 212 && touch.py < 240 && touch.py > 160 && pressedSquares[8] == 0)
{
pressedSquares[8] = player;
player = player == 1 ? 2 : 1;
}
}
2023-09-10 18:39:17 +00:00
void winCountShow()
{
C2D_Text text;
C2D_TextBuf buf = C2D_TextBufNew(4096);
char buffer[100];
sprintf(buffer, "X wins: %d", winCount[0]);
C2D_TextParse(&text, buf, buffer);
C2D_TextOptimize(&text);
C2D_DrawText(&text, C2D_WithColor, 305, 20, 0, 0.5f, 0.5f, C2D_Color32(0xFF, 0xFF, 0xFF, 0xFF));
sprintf(buffer, "O wins: %d", winCount[1]);
C2D_TextParse(&text, buf, buffer);
C2D_TextOptimize(&text);
C2D_DrawText(&text, C2D_WithColor, 305, 40, 0, 0.5f, 0.5f, C2D_Color32(0xFF, 0xFF, 0xFF, 0xFF));
C2D_TextBufDelete(buf);
2023-11-27 10:09:46 +00:00
sprintf(buffer, "Draws: %d", winCount[2]);
C2D_TextParse(&text, buf, buffer);
C2D_TextOptimize(&text);
C2D_DrawText(&text, C2D_WithColor, 305, 60, 0, 0.5f, 0.5f, C2D_Color32(0xFF, 0xFF, 0xFF, 0xFF));
C2D_TextBufDelete(buf);
2023-09-10 18:39:17 +00:00
}
2023-09-10 17:24:44 +00:00
void checkWin()
{
if(pressedSquares[0] == pressedSquares[1] && pressedSquares[1] == pressedSquares[2] && pressedSquares[0] != 0)
{
win = true;
}
else if(pressedSquares[3] == pressedSquares[4] && pressedSquares[4] == pressedSquares[5] && pressedSquares[3] != 0)
{
win = true;
}
else if(pressedSquares[6] == pressedSquares[7] && pressedSquares[7] == pressedSquares[8] && pressedSquares[6] != 0)
{
win = true;
}
else if(pressedSquares[0] == pressedSquares[3] && pressedSquares[3] == pressedSquares[6] && pressedSquares[0] != 0)
{
win = true;
}
else if(pressedSquares[1] == pressedSquares[4] && pressedSquares[4] == pressedSquares[7] && pressedSquares[1] != 0)
{
win = true;
}
else if(pressedSquares[2] == pressedSquares[5] && pressedSquares[5] == pressedSquares[8] && pressedSquares[2] != 0)
{
win = true;
}
else if(pressedSquares[0] == pressedSquares[4] && pressedSquares[4] == pressedSquares[8] && pressedSquares[0] != 0)
{
win = true;
}
else if(pressedSquares[2] == pressedSquares[4] && pressedSquares[4] == pressedSquares[6] && pressedSquares[2] != 0)
{
win = true;
}
2023-09-10 18:39:17 +00:00
else
{
return;
}
2023-09-10 17:24:44 +00:00
}
2023-09-10 17:44:19 +00:00
void checkAll9()
{
for(int i = 0; i < 9; i++)
{
if(pressedSquares[i] == 0)
{
return;
}
}
all9 = true;
2023-11-27 10:09:46 +00:00
winCount[2]++;
2023-09-10 17:44:19 +00:00
}
2023-09-10 08:50:41 +00:00
int main(int argc, char **argv) {
romfsInit();
gfxInitDefault();
C3D_Init(C3D_DEFAULT_CMDBUF_SIZE);
C2D_Init(C2D_DEFAULT_MAX_OBJECTS);
C2D_Prepare();
// Create screens
C3D_RenderTarget* top = C2D_CreateScreenTarget(GFX_TOP, GFX_LEFT);
C3D_RenderTarget* bottom = C2D_CreateScreenTarget(GFX_BOTTOM, GFX_LEFT);
// Main loop
while (aptMainLoop())
{
hidScanInput();
2023-09-10 17:24:44 +00:00
2023-09-10 08:50:41 +00:00
touchPosition touch;
hidTouchRead(&touch);
u32 kHeld = hidKeysHeld();
if (kHeld & KEY_START) break; // break in order to return to hbmenu
C3D_FrameBegin(C3D_FRAME_SYNCDRAW);
C2D_TargetClear(top, C2D_Color32(0x00, 0x00, 0x00, 0xFF));
C2D_TargetClear(bottom, C2D_Color32(0x09, 0x00, 0x00, 0xFF));
2023-09-10 17:44:19 +00:00
if(!win && !all9)
2023-09-10 17:24:44 +00:00
{
C2D_SceneBegin(top);
drawGridTopScreen();
drawWhoseMove();
drawMoves(1);
2023-09-10 18:39:17 +00:00
winCountShow();
2023-09-10 17:24:44 +00:00
C2D_SceneBegin(bottom);
drawGridBottomScreen();
drawMoves(2);
//check if touched
if(touch.px != 0 && touch.py != 0)
touching(touch);
2023-09-10 18:50:02 +00:00
checkAll9();
2023-09-10 17:24:44 +00:00
checkWin();
}
else
{
2023-09-10 17:44:19 +00:00
if(win)
2023-09-10 17:24:44 +00:00
{
2023-09-10 17:44:19 +00:00
C2D_SceneBegin(top);
C2D_Text text;
C2D_TextBuf buf = C2D_TextBufNew(4096);
if(player == 1)
{
C2D_TextParse(&text, buf, "O wins!");
C2D_TextOptimize(&text);
2023-09-10 18:39:17 +00:00
C2D_DrawText(&text, C2D_WithColor, 10, 10, 0, 3.5f, 3.5f, C2D_Color32(0xFF, 0xFF, 0xFF, 0xFF));
if(!addedWin)
{
winCount[1]++;
addedWin = true;
}
2023-09-10 17:44:19 +00:00
}
else
{
C2D_TextParse(&text, buf, "X wins!");
C2D_TextOptimize(&text);
2023-09-10 18:39:17 +00:00
C2D_DrawText(&text, C2D_WithColor, 10, 10, 0, 3.5f, 3.5f, C2D_Color32(0xFF, 0xFF, 0xFF, 0xFF));
if(!addedWin)
{
winCount[0]++;
addedWin = true;
}
2023-09-10 17:44:19 +00:00
}
C2D_TextBufDelete(buf);
C2D_SceneBegin(bottom);
2023-09-10 17:24:44 +00:00
}
2023-09-10 17:44:19 +00:00
else if(all9)
2023-09-10 17:24:44 +00:00
{
2023-09-10 17:44:19 +00:00
C2D_SceneBegin(top);
C2D_Text text;
C2D_TextBuf buf = C2D_TextBufNew(4096);
C2D_TextParse(&text, buf, "Draw!");
2023-09-10 17:24:44 +00:00
C2D_TextOptimize(&text);
2023-09-10 18:39:17 +00:00
C2D_DrawText(&text, C2D_WithColor, 10, 10, 0, 3.5f, 3.5f, C2D_Color32(0xFF, 0xFF, 0xFF, 0xFF));
2023-09-10 17:44:19 +00:00
C2D_TextBufDelete(buf);
C2D_SceneBegin(bottom);
2023-09-10 17:24:44 +00:00
}
//press A to restart
if(kHeld & KEY_A)
{
player = 1;
2023-09-10 17:44:19 +00:00
all9 = false;
2023-09-10 17:24:44 +00:00
win = false;
for(int i = 0; i < 9; i++)
{
pressedSquares[i] = 0;
}
}
}
2023-09-10 08:50:41 +00:00
C3D_FrameEnd(0);
}
C2D_Fini();
C3D_Fini();
gfxExit();
romfsExit();
return 0;
}