Skip to content

Instantly share code, notes, and snippets.

@Alynva
Last active July 13, 2017 12:40
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save Alynva/5f9fd272b4ee8f73a3fc15b73671e620 to your computer and use it in GitHub Desktop.
Save Alynva/5f9fd272b4ee8f73a3fc15b73671e620 to your computer and use it in GitHub Desktop.
Um jogo da velha simples utilizando CGI
#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;
}
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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');
}
<!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