Índice
- Disciplinas Atuais
- Disciplinas Antigas
Os eventos descritos a seguir ocorreram após a data estelar 3192.1, ou seja, depois que o comandante J.T.Kirk mudou a história de dois planetas, pertencentes ao cluster NGC321, numa clara violação da primeira diretiva de não intervenção.
Na era pré-Kirk, a guerra estre os dois planetas era simulada em computadores e, de acordo com o resultado, as pessoas “atingidas” na simulação deveriam se encaminhar a desintegradores nucleares para serem eliminadas, respeitando os cálculos do computador.
Como é do conhecimento de todos, o comandante J.T.Kirk destruiu todos os computadores do segundo e terceiro planetas, Eminiar VII e Vendikar, que simulavam a guerra. Apesar da paz alcançada, alguns descontentes com a paz, vindos do oriente médio de um dos planetas, saudosos do tempo de guerra limpa e mortes por desintegração nuclear, ainda tentam recuperar os códigos e montar os computadores originais.
Roubando alguns arquivos da nave estelar Enterprise, eles descobriram que no final do século 20 existia uma modalidade de jogo de guerra muito comum entre estudantes desocupados e que deu origem a vários jogos de simulação de guerra.
Conhecedores da fama de um grupo de programadores de uma determinada turma de engenharia de computação, formada no início do século 21, eles voltam no tempo e sequestram esses alunos antes de se formarem, para desenvolver um jogo de simulação semelhante e assim retomar a guerra limpa.
Incrivelmente desenvolvidos tecnologicamente, os planetas Eminiar VII e Vendikar, vão usar a última palavra em simulação de jogos de guerra:o 2D e a linha de comando!. O modelo dos planetas terá as seguintes regras:
Com um phaser apontado para cabeça, um dos sequestradores dita para você as regras da simulação que você tem que desenvolver:
Tipo de ilha | formato | quantidade | Mensagem de destruição |
---|---|---|---|
ponto | 4 | Z. | |
ipequeno | 2 | Zi | |
imaior | 2 | ZI | |
principal | 1 | Zp | |
quadrada | 2 | Zq | |
Triangular | 3 | Zt |
Mensagens | Significado |
---|---|
X | Mar |
Y | Ilha |
Z | Ilha destruída completamente |
A mensagem Z deve vir acompanhada do tipo de ilha destruída, como mostrado na primeira tabela. Observe o ponto após o Z na primeira linha.
Para programar este jogo intergaláctico, você deve usar datagramas com a biblioteca de C.
Os programas a seguir demonstram a base de um listener (ouvinte) e de um talker (falante):
listener.c
/* ** listener.c -- uma demonstração de servidor com datagrama */ #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <errno.h> #include <string.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #define MINHAPORTA 4950 // a porta na qual os usuários vão se conectar #define MAXBUFLEN 100 int main(void) { int sockfd; struct sockaddr_in meu_endereco; // a informação de meu endereço struct sockaddr_in seu_endereco; // Informação do endereço de quem se conecta socklen_t tam_endereco; int numbytes; char buf[MAXBUFLEN]; if ((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) == -1) { perror("socket"); exit(1); } meu_endereco.sin_family = AF_INET; // host byte order meu_endereco.sin_port = htons(MINHAPORTA); // short, network byte order meu_endereco.sin_addr.s_addr = INADDR_ANY; // automatically fill with my IP memset(meu_endereco.sin_zero, '\0', sizeof meu_endereco.sin_zero); if (bind(sockfd, (struct sockaddr *)&meu_endereco, sizeof meu_endereco) == -1) { perror("bind"); exit(1); } tam_endereco = sizeof seu_endereco; while (1){ printf("Fala que eu te escuto\n"); if ((numbytes = recvfrom(sockfd, buf, MAXBUFLEN-1 , 0, (struct sockaddr *)&seu_endereco, &tam_endereco)) == -1) { perror("recvfrom"); exit(1); } printf("obteve pacote de %s\n",inet_ntoa(seu_endereco.sin_addr)); printf("o pacote possui %d bytes\n",numbytes); buf[numbytes] = '\0'; printf("O conteúdo do pacote é: %s\n",buf); } close(sockfd); return 0; }
talker.c
/* ** talker.c -- um demonstrativo de cliente com datagrama */ #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <errno.h> #include <string.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <netdb.h> #define SERVERPORT 4950 // a porta que os usuários vão se conectar #define MAXLINHA 100 int lelinha(char s[],int lim); int main(int argc, char *argv[]) { int sockfd; struct sockaddr_in seu_endereco; // informação do endereço do conector struct hostent *he; int numbytes; int tam, soma=0; int lim=MAXLINHA; char s[MAXLINHA]; if (argc != 2) { fprintf(stderr,"uso: talker hostname\n"); exit(1); } if ((he=gethostbyname(argv[1])) == NULL) { // get the host info herror("gethostbyname"); exit(1); } if ((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) == -1) { perror("socket"); exit(1); } seu_endereco.sin_family = AF_INET; // ordem do byte do host seu_endereco.sin_port = htons(SERVERPORT); // short, network byte order seu_endereco.sin_addr = *((struct in_addr *)he->h_addr); memset(seu_endereco.sin_zero, '\0', sizeof seu_endereco.sin_zero); while ((tam=lelinha(s,MAXLINHA))>0){ if ((numbytes = sendto(sockfd, s, strlen(s), 0, (struct sockaddr *)&seu_endereco, sizeof seu_endereco)) == -1) { perror("sendto"); exit(1); } printf("enviado %d bytes para %s\n", numbytes, inet_ntoa(seu_endereco.sin_addr)); } close(sockfd); return 0; } int lelinha(char s[],int lim) { int c,i; for (i=0; i<lim-1 && (c=getchar())!=EOF && c!='\n';++i) s[i]=c; if (c=='\n') { s[i]=c; ++i; } s[i]='\0'; return i; }
Os alienígenas raptores propuseram uma competição, entre os afamados programadores: Aquele que desenvolver o melhor algoritmo automático de jogo, que cause o maior número de baixas nos outros adversários, jogando cada um por si,num esquema cada um contra todos, terá como prêmio, ou 70 virgens no paraíso, ou 1 ponto a mais na média da disciplina de Laboratório de Programação I, cursada no primeiro semestre do oitavo ano do século 21, o que o ganhador achar melhor.
Nos próximos episódios: excitantes aulas sobre datagramas, sockets ( que não são meias…) e comunicação pela Internet diretamente do século 21!