Last active
July 13, 2017 12:40
-
-
Save Alynva/5f9fd272b4ee8f73a3fc15b73671e620 to your computer and use it in GitHub Desktop.
Um jogo da velha simples utilizando CGI
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
#include <stdio.h> | |
#include <stdlib.h> | |
#include <string.h> | |
int main() { | |
// Declaração de variáveis | |
char *dado = NULL; | |
char tabuleiro[3][3]; | |
// Inicialização do tabuleiro | |
tabuleiro[0][0] = '-'; tabuleiro[0][1] = '-'; tabuleiro[0][2] = '-'; | |
tabuleiro[1][0] = '-'; tabuleiro[1][1] = '-'; tabuleiro[1][2] = '-'; | |
tabuleiro[2][0] = '-'; tabuleiro[2][1] = '-'; tabuleiro[2][2] = '-'; | |
int jogador = 1; // 1 para X e 0 (zero) para O, representa um "falso booleano", só importa se é zero ou não | |
char vencedor = '-'; // Armazena a letra que presenta o vencedor | |
int i, j; // Variáveis contadoras para os loops | |
int sala = 1; // Representa o id da sala atual | |
char sala_string[5]; // Variável para guardar o id da sala em caracteres (para criar/ler o arquivo) | |
FILE *arquivo; | |
char arquivo_nome[50] = {""}; // Utilizada para concatenar o nome do arquivo | |
int jogada; // Utilizada para diferenciar onde o jogador deseja marcar | |
// Inicia o documento HTML | |
printf("%s%c%c\n","Content-Type:text/html;charset=UTF-8",13,10); | |
printf("<!DOCTYPE html>"); | |
printf("<html>"); | |
printf("<head>"); | |
printf("<meta charset=\"utf-8\">"); | |
printf("<title>Jogo da velha</title>"); | |
printf("<link rel=\"stylesheet\" href=\"../jogo-da-velha-2.css\">"); | |
printf("<link href=\"https://fonts.googleapis.com/css?family=Rock+Salt\" rel=\"stylesheet\">"); | |
printf("</head>"); | |
printf("<body>"); | |
// Lógica do jogo | |
// Obtém os parâmetros da URL | |
dado = getenv("QUERY_STRING"); | |
if (dado == NULL) { | |
printf("<span class=\"erro\">Variável QUERY_STRING não existe.</span>"); | |
} else if (sscanf(dado, "sala-id=%d", &sala) != 1) { // Tenta identificar a sala atual | |
printf("<span class=\"erro\">Erro ao obter parâmetros do jogo.</span>"); | |
} else { | |
// Concatena a id da sala com o nome do arquivo | |
strcat(arquivo_nome, "jogo-da-velha-"); | |
sprintf(sala_string, "%d", sala); // Transforma int para char* | |
strcat(arquivo_nome, sala_string); | |
strcat(arquivo_nome, ".txt"); | |
// Tenta apenas abrir o arquivo em modo de leitura e escrita | |
arquivo = fopen(arquivo_nome, "r+"); | |
if (arquivo == NULL) { // Caso não exista um arquivo para esta sala | |
printf("<span class=\"alerta\">Novo jogo iniciado.</span>"); | |
// Cria um novo arquivo | |
arquivo = fopen(arquivo_nome, "w"); | |
// Grava os valores iniciais para a rodada | |
fprintf(arquivo, "%d\n", jogador); | |
for (i = 0; i < 3; i++) { | |
fprintf(arquivo, "\n"); | |
for (j = 0; j < 3; j++) { | |
if (j > 0) fprintf(arquivo, " "); | |
fprintf(arquivo, "%c", tabuleiro[i][j]); | |
} | |
} | |
} else { // Caso exista o arquivo desta sala | |
// Lê do arquivo os dados atuais | |
fscanf(arquivo, "%d\n", &jogador); | |
for (i = 0; i < 3; i++) { | |
fscanf(arquivo, "\n"); | |
for (j = 0; j < 3; j++) { | |
if (j > 0) fscanf(arquivo, " "); | |
fscanf(arquivo, "%c", &tabuleiro[i][j]); | |
} | |
} | |
// Verifica se houve alguma jogada nos parâmetros da URL | |
if (sscanf(dado, "sala-id=%*d&jogada=%d", &jogada) == 1) { | |
// Atualiza os dados de acordo com a jogada | |
j = jogada % 10; // Pega o primeiro dígito do número | |
i = (int)(jogada / 10) % 10; // Pega o segundo dígito do número | |
if (tabuleiro[i][j] == '-') { // Verifica se não há nenhuma jogada no local | |
// Atualiza o tabuleiro de acordo com o jogador atual | |
if (jogador) { | |
tabuleiro[i][j] = 'X'; | |
} else { | |
tabuleiro[i][j] = 'O'; | |
} | |
// Alterna o jogador (0 -> 1, 1 -> 0) (falso booleano) | |
jogador = !jogador; | |
// Reabre o arquivo para atualizar todos os dados | |
arquivo = freopen(arquivo_nome, "r+", arquivo); | |
fprintf(arquivo, "%d\n", jogador); | |
for (i = 0; i < 3; i++) { | |
fprintf(arquivo, "\n"); | |
for (j = 0; j < 3; j++) { | |
if (j > 0) fprintf(arquivo, " "); | |
fprintf(arquivo, "%c", tabuleiro[i][j]); | |
} | |
} | |
// Verifica se ganhou o jogo | |
if (tabuleiro[0][0] != '-' && ((tabuleiro[0][0] == tabuleiro[0][1] && tabuleiro[0][1] == tabuleiro[0][2]) || (tabuleiro[0][0] == tabuleiro[1][0] && tabuleiro[1][0] == tabuleiro[2][0]))) { | |
vencedor = tabuleiro[0][0]; | |
} else if (tabuleiro[2][2] != '-' && ((tabuleiro[2][2] == tabuleiro[2][1] && tabuleiro[2][1] == tabuleiro[2][0]) || (tabuleiro[2][2] == tabuleiro[1][2] && tabuleiro[1][2] == tabuleiro[0][2]))) { | |
vencedor = tabuleiro[2][2]; | |
} else if (tabuleiro[1][1] != '-' && ((tabuleiro[1][1] == tabuleiro[0][0] && tabuleiro[0][0] == tabuleiro[2][2]) || (tabuleiro[1][1] == tabuleiro[0][1] && tabuleiro[0][1] == tabuleiro[2][1]) || (tabuleiro[1][1] == tabuleiro[0][2] && tabuleiro[0][2] == tabuleiro[2][0]) || (tabuleiro[1][1] == tabuleiro[1][2] && tabuleiro[1][2] == tabuleiro[1][0]))) { | |
vencedor = tabuleiro[1][1]; | |
} else { | |
// Checa se deu velha | |
vencedor = 'V'; // V de VELHA | |
for (i = 0; i < 3; i++) { | |
for (j = 0; j < 3; j++) { | |
if (tabuleiro[i][j] == '-') { | |
vencedor = '-'; | |
} | |
} | |
} | |
} | |
} | |
} | |
} | |
// Fecha o arquivo | |
fclose(arquivo); | |
} | |
if (vencedor == '-') { // Caso não tenha vencedor, imprime o título que mostra de quem é a vez da jogada | |
if (jogador == 1) { | |
printf("<h1>Vez do jogador X</h1>"); | |
} else { | |
printf("<h1>Vez do jogador O</h1>"); | |
} | |
} else { | |
// Tendo um vencedor, cria um novo arquivo para a sala com os dados padrões | |
arquivo = fopen(arquivo_nome, "w"); | |
fprintf(arquivo, "%d\n", jogador); | |
for (i = 0; i < 3; i++) { | |
fprintf(arquivo, "\n"); | |
for (j = 0; j < 3; j++) { | |
if (j > 0) fprintf(arquivo, " "); | |
fprintf(arquivo, "-"); | |
} | |
} | |
// Exibe o título final | |
if (vencedor == 'V') { | |
printf("<h1>Deu velha!!!</h1>"); | |
} else { | |
printf("<h1>O jogador %c venceu!</h1>", vencedor); | |
} | |
} | |
// Cria uma tabela que representa o tabuleiro | |
printf("<table>"); | |
printf("<tbody>"); | |
for (i = 0; i < 3; i++) { | |
printf("<tr>"); | |
for (j = 0; j < 3; j++) { | |
printf("<td>"); | |
if (tabuleiro[i][j] == '-' && vencedor == '-') { // Se não houver jogadas no bloco e não houver nenhum vencedor, imprime um link que recarrega a página e passa como parâmetros o id da sala e o código da jogada, que representa o número da linha e coluna do bloco | |
printf("<a href=\"?sala-id=%d&jogada=%d%d\"></a>", sala, i, j); | |
} else { | |
printf("%c", tabuleiro[i][j]); | |
} | |
printf("</td>"); | |
} | |
printf("</tr>"); | |
} | |
printf("</tbody>"); | |
printf("</table>"); | |
if (vencedor != '-') { // Tendo algum vencedor, exibe um link para recarregar a página sem fazer nenhuma jogada | |
printf("<a href=\"?sala-id=%d\">Recomeçar</a>", sala); | |
} | |
// Finaliza o documento HTML | |
printf("</body>"); | |
printf("</html>"); | |
return 0; | |
} |
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
body { | |
text-align: center; | |
} | |
input[type="number"] { | |
width: 5em; | |
} | |
input[type="submit"] { | |
margin: 5px; | |
} | |
table { | |
font-family: 'Rock Salt', cursive; | |
width: 400px; | |
height: 400px; | |
background-position: center; | |
background-size: cover; | |
margin: 0 auto; | |
} | |
tbody { | |
transform: rotateY(39deg) rotateX(-37deg) rotateZ(-12deg) translateX(-3px); | |
} | |
td { | |
font-size: 4em; | |
font-weight: bold; | |
line-height: 2em; | |
width: 120px; | |
height: 120px; | |
} | |
a { | |
display: block; | |
width: 100%; | |
height: 100%; | |
} | |
table { | |
background-image: url('data:image/png;base64,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'); | |
} |
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
<!DOCTYPE html> | |
<html> | |
<head> | |
<title>Jogo da velha</title> | |
<link rel="stylesheet" href="jogo-da-velha-2.css" ></link> | |
</head> | |
<body> | |
<h1>Jogo da velha</h1> | |
<form action="cgi-bin/jogo-da-velha-2.cgi"> | |
<label for="sala-id">Insira o id da sala: </label><input type="number" id="sala-id" name="sala-id" min="1" max="9999" required /> | |
<br> | |
<input type="submit" value="Jogar" /> | |
</form> | |
</body> | |
</html> |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment