Skip to content

Commit 173d4c6

Browse files
Move stuff to a class
1 parent 6aafb4b commit 173d4c6

File tree

1 file changed

+112
-94
lines changed

1 file changed

+112
-94
lines changed

tictactoe_carbon/tictactoe_carbon.carbon

Lines changed: 112 additions & 94 deletions
Original file line numberDiff line numberDiff line change
@@ -299,119 +299,137 @@ fn PrintDraw() {
299299
Core.PrintChar(10);
300300
}
301301

302+
// Game Logic
302303

303-
fn PrintBoard(board: array(i32, 9)) {
304-
var i: i32 = 0;
305-
while (i < 9) {
306-
let cell: i32 = board[i];
307-
if (cell == 0) {
308-
// '-'
309-
Core.PrintChar(45);
310-
} else if (cell == 1) {
311-
// 'X'
312-
Core.PrintChar(88);
313-
} else {
314-
// 'O'
315-
Core.PrintChar(79);
316-
}
317-
if (i % 3 == 2) {
318-
// newline
319-
Core.PrintChar(10);
304+
fn SwapPlayer(player: i32) -> i32 {
305+
if (player == 1) {
306+
return 2;
320307
} else {
321-
// space
322-
Core.PrintChar(32);
308+
return 1;
323309
}
324-
i = i + 1;
325-
}
326310
}
327311

328-
fn CheckWinner(board: array(i32, 9)) -> i32 {
329-
let wins: array(array(i32, 3), 8) = (
330-
// rows
331-
(0, 1, 2), (3, 4, 5), (6, 7, 8),
332-
// cols
333-
(0, 3, 6), (1, 4, 7), (2, 5, 8),
334-
// diags
335-
(0, 4, 8), (2, 4, 6)
336-
);
337-
var i: i32 = 0;
338-
while (i < 8) {
339-
if (board[wins[i][0]] != 0 and board[wins[i][0]] == board[wins[i][1]] and board[wins[i][1]] == board[wins[i][2]]) {
340-
return board[wins[i][0]];
341-
}
342-
i = i + 1;
312+
class TicTacToe {
313+
fn Make() -> TicTacToe {
314+
returned var me: TicTacToe;
315+
me.board = (0, 0, 0, 0, 0, 0, 0, 0, 0);
316+
me.current_player = 1;
317+
318+
me.wins = (
319+
// rows
320+
(0, 1, 2), (3, 4, 5), (6, 7, 8),
321+
// cols
322+
(0, 3, 6), (1, 4, 7), (2, 5, 8),
323+
// diags
324+
(0, 4, 8), (2, 4, 6)
325+
);
326+
327+
return var;
343328
}
344-
return 0;
345-
}
346329

347-
fn IsFull(board: array(i32, 9)) -> bool {
348-
var i: i32 = 0;
349-
while (i < 9) {
350-
if (board[i] == 0) {
351-
return false;
330+
fn PrintBoard[self: Self]() {
331+
var i: i32 = 0;
332+
while (i < 9) {
333+
let cell: i32 = self.board[i];
334+
if (cell == 0) {
335+
// '-'
336+
Core.PrintChar(45);
337+
} else if (cell == 1) {
338+
// 'X'
339+
Core.PrintChar(88);
340+
} else {
341+
// 'O'
342+
Core.PrintChar(79);
343+
}
344+
if (i % 3 == 2) {
345+
// newline
346+
Core.PrintChar(10);
347+
} else {
348+
// space
349+
Core.PrintChar(32);
350+
}
351+
i = i + 1;
352352
}
353-
i = i + 1;
354353
}
355-
return true;
356-
}
357-
358-
fn InputMove(board: array(i32, 9)) -> i32 {
359-
var move: i32 = 0;
360-
while (true) {
361-
PrintBoard(board);
362-
PrintEnterMove();
363-
364354

365-
if (not ReadInt(&move)) {
366-
PrintInvalidInput();
367-
continue;
368-
}
369-
if (move < 0 or move > 8) {
370-
PrintInvalidMove();
371-
continue;
372-
}
373-
if (board[move] != 0) {
374-
PrintCellOccupied();
375-
continue;
355+
fn CheckWinner[self: Self]() -> i32 {
356+
var i: i32 = 0;
357+
while (i < 8) {
358+
if (self.board[self.wins[i][0]] != 0 and self.board[self.wins[i][0]] == self.board[self.wins[i][1]] and self.board[self.wins[i][1]] == self.board[self.wins[i][2]]) {
359+
return self.board[self.wins[i][0]];
360+
}
361+
i = i + 1;
376362
}
377-
break;
363+
return 0;
378364
}
379-
return move;
380-
}
381365

382-
fn SwapPlayer(player: i32) -> i32 {
383-
if (player == 1) {
384-
return 2;
385-
} else {
386-
return 1;
366+
fn IsFull[self: Self]() -> bool {
367+
var i: i32 = 0;
368+
while (i < 9) {
369+
if (self.board[i] == 0) {
370+
return false;
371+
}
372+
i = i + 1;
373+
}
374+
return true;
387375
}
388-
}
389376

390-
fn Run() {
391-
// 0: empty, 1: X, 2: O
392-
var board: array(i32, 9) = (0, 0, 0, 0, 0, 0, 0, 0, 0);
393-
var current_player: i32 = 1;
377+
fn InputMove[self: Self]() -> i32 {
378+
var move: i32 = 0;
379+
while (true) {
380+
self.PrintBoard();
381+
PrintEnterMove();
394382

395-
while (true) {
396-
var move: i32 = InputMove(board);
397-
board[move] = current_player;
398-
399-
var winner: i32 = CheckWinner(board);
400-
if (winner != 0) {
401-
PrintBoard(board);
402-
if (winner == 1) {
403-
PrintPlayerXWins();
404-
} else {
405-
PrintPlayerOWins();
383+
384+
if (not ReadInt(&move)) {
385+
PrintInvalidInput();
386+
continue;
387+
}
388+
if (move < 0 or move > 8) {
389+
PrintInvalidMove();
390+
continue;
391+
}
392+
if (self.board[move] != 0) {
393+
PrintCellOccupied();
394+
continue;
406395
}
407396
break;
408397
}
409-
if (IsFull(board)) {
410-
PrintBoard(board);
411-
PrintDraw();
412-
break;
413-
}
398+
return move;
399+
}
400+
401+
fn PlayGame[addr self: Self*]() {
402+
while (true) {
403+
var move: i32 = self->InputMove();
404+
self->board[move] = self->current_player;
405+
406+
var winner: i32 = self->CheckWinner();
407+
if (winner != 0) {
408+
self->PrintBoard();
409+
if (winner == 1) {
410+
PrintPlayerXWins();
411+
} else {
412+
PrintPlayerOWins();
413+
}
414+
break;
415+
}
416+
if (self->IsFull()) {
417+
self->PrintBoard();
418+
PrintDraw();
419+
break;
420+
}
414421

415-
current_player = SwapPlayer(current_player);
422+
self->current_player = SwapPlayer(self->current_player);
423+
}
416424
}
425+
426+
427+
var board: array(i32, 9);
428+
var current_player: i32;
429+
var wins: array(array(i32, 3), 8);
430+
}
431+
432+
fn Run() {
433+
var game: TicTacToe = TicTacToe.Make();
434+
game.PlayGame();
417435
}

0 commit comments

Comments
 (0)