Last active
March 20, 2021 01:13
-
-
Save yeggor/2b40c61e382dc7e2e8faddbb1cd769b2 to your computer and use it in GitHub Desktop.
This file was created with the Hex-Rays decompiler
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* This file was generated by the Hex-Rays decompiler. | |
Copyright (c) 2007-2020 Hex-Rays <[email protected]> | |
Detected compiler: GNU C++ | |
Changed: manual error resolve + clang formatting | |
*/ | |
#include "defs.h" | |
#include <stdio.h> | |
#include <stdlib.h> | |
#include <string.h> | |
#include <time.h> | |
//------------------------------------------------------------------------- | |
// Function declarations | |
__int64 frame_dummy(_QWORD, _QWORD, _QWORD); // weak | |
int main(int argc, const char **argv, const char **envp); | |
unsigned __int64 singlemode(); | |
unsigned __int64 doublemode(); | |
__int64 check_placex(void); // weak | |
__int64 placex(int a1); | |
int place(); | |
__int64 placey(int a1); | |
__int64 checkwin(void); // weak | |
//------------------------------------------------------------------------- | |
// Data declarations | |
char game_table[9]; // weak | |
unsigned __int64 singlemode() { | |
int v1; // [rsp+4h] [rbp-2Ch] BYREF | |
int v2; // [rsp+8h] [rbp-28h] | |
int v3; // [rsp+Ch] [rbp-24h] | |
int i; // [rsp+10h] [rbp-20h] | |
int j; // [rsp+14h] [rbp-1Ch] | |
int k; // [rsp+18h] [rbp-18h] | |
int l; // [rsp+1Ch] [rbp-14h] | |
int m; // [rsp+20h] [rbp-10h] | |
int v9; // [rsp+24h] [rbp-Ch] | |
unsigned __int64 v10; // [rsp+28h] [rbp-8h] | |
v2 = 0; | |
v3 = 0; | |
for (i = 0; i <= 2; ++i) { | |
for (j = 0; j <= 2; ++j) | |
printf("%c ", (unsigned int)game_table[v2++]); | |
putchar(10); | |
} | |
for (k = 1; k <= 9; ++k) { | |
v2 = 0; | |
printf("Where would you like to place 'x' "); | |
scanf("%d", &v1); | |
placex(v1); | |
if (v3 <= 3) | |
place(); | |
for (l = 0; l <= 2; ++l) { | |
for (m = 0; m <= 2; ++m) | |
printf("%c ", (unsigned int)game_table[v2++]); | |
putchar(10); | |
} | |
++v3; | |
v9 = checkwin(); | |
if (v9 == -1 || v9 == -2) { | |
if (v9 == -1) | |
puts("YOU WIN"); | |
if (v9 == -2) | |
puts("YOU LOSE"); | |
return 1; | |
} | |
if (v3 == 4) { | |
printf("\nDRAW "); | |
return 1; | |
} | |
} | |
return 1; | |
} | |
unsigned __int64 doublemode() { | |
int v1; // [rsp+0h] [rbp-30h] BYREF | |
int v2; // [rsp+4h] [rbp-2Ch] BYREF | |
int v3; // [rsp+8h] [rbp-28h] | |
int v4; // [rsp+Ch] [rbp-24h] | |
int i; // [rsp+10h] [rbp-20h] | |
int j; // [rsp+14h] [rbp-1Ch] | |
int k; // [rsp+18h] [rbp-18h] | |
int l; // [rsp+1Ch] [rbp-14h] | |
int m; // [rsp+20h] [rbp-10h] | |
int v10; // [rsp+24h] [rbp-Ch] | |
unsigned __int64 v11; // [rsp+28h] [rbp-8h] | |
v3 = 0; | |
v4 = 0; | |
for (i = 0; i <= 2; ++i) { | |
for (j = 0; j <= 2; ++j) | |
printf("%c ", (unsigned int)game_table[v3++]); | |
putchar(10); | |
} | |
for (k = 1; k <= 9; ++k) { | |
v3 = 0; | |
printf("PLAYER1 - where would you like to place 'x' : "); | |
scanf("%d", &v1); | |
placex(v1); | |
if (v4 <= 3) { | |
printf("PLAYER2 - where would you like to place 'o' : "); | |
scanf("%d", &v2); | |
placey(v2); | |
} | |
for (l = 0; l <= 2; ++l) { | |
for (m = 0; m <= 2; ++m) | |
printf("%c ", (unsigned int)game_table[v3++]); | |
putchar(10); | |
} | |
++v4; | |
v10 = checkwin(); | |
if (v10 == -1 || v10 == -2) { | |
if (v10 == -1) | |
puts("Player 1 WIN"); | |
if (v10 == -2) | |
puts("Player 2 WIN"); | |
return 1; | |
} | |
if (v4 == 4) { | |
printf("\nDRAW "); | |
return 1; | |
} | |
} | |
return 1; | |
} | |
__int64 check_placex() { | |
unsigned int v1; // [rsp+Ch] [rbp-44h] BYREF | |
char s[56]; // [rsp+10h] [rbp-40h] BYREF | |
unsigned __int64 v3; // [rsp+48h] [rbp-8h] | |
while (1) { | |
while (1) { | |
fgets(s, 49, stdin); | |
if (strlen(s) <= 2 && s[0] && (unsigned int)sscanf(s, "%d", &v1) == 1) | |
break; | |
fwrite("Invalid move, Enter number 1 - 9: ", 1uLL, 0x22uLL, stderr); | |
} | |
if (game_table[v1 - 1] != 120 && game_table[v1 - 1] != 111 && v1) | |
break; | |
fwrite("Already allocated, Enter number: ", 1uLL, 0x21uLL, stderr); | |
} | |
return v1; | |
} | |
__int64 placex(int a1) { | |
__int64 result; // rax | |
unsigned int v2; // [rsp+18h] [rbp-8h] | |
unsigned int v3; // [rsp+1Ch] [rbp-4h] | |
if (a1 <= 0 || a1 > 9) { | |
v3 = check_placex(); | |
result = placex(v3); | |
} else if (game_table[a1 - 1] == 120 || game_table[a1 - 1] == 111) { | |
v2 = check_placex(); | |
result = placex(v2); | |
} else { | |
result = a1 - 1; | |
game_table[result] = 120; | |
} | |
return result; | |
} | |
int place() { | |
int result; // eax | |
result = rand() % 9; | |
if (result >= 0 && result <= 8) { | |
if (game_table[result] == 120 || game_table[result] == 111) { | |
result = place(); | |
} else { | |
game_table[result] = 111; | |
result = printf("\n Computer placed at %d position\n", | |
(unsigned int)(result + 1)); | |
} | |
} | |
return result; | |
} | |
__int64 placey(int a1) { | |
__int64 result; // rax | |
int v2; // [rsp+18h] [rbp-8h] | |
int v3; // [rsp+1Ch] [rbp-4h] | |
if (a1 <= 0 || a1 > 9) { | |
v3 = check_placex(); | |
result = placex(v3); | |
} else if (game_table[a1 - 1] == 120 || game_table[a1 - 1] == 111) { | |
v2 = check_placex(); | |
result = placex(v2); | |
} else { | |
result = a1 - 1; | |
game_table[result] = 111; | |
} | |
return result; | |
} | |
__int64 checkwin() { | |
if (game_table[0] == game_table[1] && game_table[1] == game_table[2]) { | |
if (game_table[0] == 120 && game_table[1] == 120 && game_table[2] == 120) | |
return 0xFFFFFFFFLL; | |
if (game_table[0] == 111 && game_table[1] == 111 && game_table[2] == 111) | |
return 4294967294LL; | |
} else if (game_table[0] == game_table[4] && game_table[4] == game_table[8]) { | |
if (game_table[0] == 120 && game_table[4] == 120 && game_table[8] == 120) | |
return 0xFFFFFFFFLL; | |
if (game_table[0] == 111 && game_table[4] == 111 && game_table[8] == 111) | |
return 4294967294LL; | |
} else if (game_table[0] == game_table[3] && game_table[3] == game_table[6]) { | |
if (game_table[0] == 120 && game_table[3] == 120 && game_table[6] == 120) | |
return 0xFFFFFFFFLL; | |
if (game_table[0] == 111 && game_table[3] == 111 && game_table[6] == 111) | |
return 4294967294LL; | |
} else if (game_table[3] == game_table[4] && game_table[4] == game_table[5]) { | |
if (game_table[3] == 120 && game_table[4] == 120 && game_table[5] == 120) | |
return 0xFFFFFFFFLL; | |
if (game_table[3] == 111 && game_table[4] == 111 && game_table[5] == 111) | |
return 4294967294LL; | |
} else if (game_table[6] == game_table[7] && game_table[7] == game_table[8]) { | |
if (game_table[6] == 120 && game_table[7] == 120 && game_table[8] == 120) | |
return 0xFFFFFFFFLL; | |
if (game_table[6] == 111 && game_table[7] == 111 && game_table[8] == 111) | |
return 4294967294LL; | |
} else if (game_table[1] == game_table[4] && game_table[4] == game_table[7]) { | |
if (game_table[1] == 120 && game_table[4] == 120 && game_table[7] == 120) | |
return 0xFFFFFFFFLL; | |
if (game_table[1] == 111 && game_table[4] == 111 && game_table[7] == 111) | |
return 4294967294LL; | |
} else if (game_table[2] == game_table[5] && game_table[5] == game_table[8]) { | |
if (game_table[2] == 120 && game_table[5] == 120 && game_table[8] == 120) | |
return 0xFFFFFFFFLL; | |
if (game_table[2] == 111 && game_table[5] == 111 && game_table[8] == 111) | |
return 4294967294LL; | |
} else if (game_table[2] == game_table[4] && game_table[4] == game_table[6]) { | |
if (game_table[2] == 120 && game_table[4] == 120 && game_table[6] == 120) | |
return 0xFFFFFFFFLL; | |
if (game_table[2] == 111 && game_table[4] == 111 && game_table[6] == 111) | |
return 4294967294LL; | |
} | |
return 0LL; | |
} | |
int main(int argc, const char **argv, const char **envp) { | |
unsigned int v3; // eax | |
int v5; // [rsp+Ch] [rbp-14h] BYREF | |
int v6; // [rsp+10h] [rbp-10h] BYREF | |
int i; // [rsp+14h] [rbp-Ch] | |
unsigned __int64 v8; // [rsp+18h] [rbp-8h] | |
v3 = time(0LL); | |
srand(v3); | |
v5 = 0; | |
do { | |
v6 = 0; | |
for (i = 0; i <= 8; ++i) | |
game_table[i] = 42; | |
puts("***************************************"); | |
puts("*************TIC TAC TOE***************"); | |
puts("***************************************"); | |
puts("***********1. YOU vs COMPUTER *********"); | |
puts("***********2. YOU vs PLAYER ***********"); | |
puts("***********3.EXIT *********************"); | |
printf("Enter your choice : "); | |
scanf("%d", &v6); | |
if (v6 == 1) { | |
singlemode(); | |
} else if (v6 == 2) { | |
doublemode(); | |
} else { | |
printf("THANK YOU and EXIT!"); | |
} | |
printf("Next game ? : "); | |
printf("Enter 1 – YES and 0 - NO "); | |
scanf("%d", &v5); | |
} while (v5 == 1); | |
return 0; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment