Skip to content

Instantly share code, notes, and snippets.

@yeggor
Last active March 20, 2021 01:13
Show Gist options
  • Save yeggor/2b40c61e382dc7e2e8faddbb1cd769b2 to your computer and use it in GitHub Desktop.
Save yeggor/2b40c61e382dc7e2e8faddbb1cd769b2 to your computer and use it in GitHub Desktop.
This file was created with the Hex-Rays decompiler
/* 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