Páginas

quarta-feira, 22 de agosto de 2012

/* Jogo da velha do Chaves (C e Allegro) */

Com mais tempo livre por causa da greve na universidade, resolvi desenvolver um jogo da velha "gráfico". Esse projeto basicamente é uma evolução de um simples exercício que fiz e postei aqui no blog há um tempo: jogo da velha em C, só que agora utilizando a biblioteca gráfica Allegro. Resolvi fazê-lo pois eu estava sentindo que a sintaxe e conceitos da Allegro estavam caindo no esquecimento pelo tempo sem desenvolver nada utilizando-a.

O tema do jogo é o seriado Chaves. O jogador 1 é o Chaves e o jogador 2 o Kiko. O background do jogo é a vila do seriado e adicionei uma trilha sonora para o jogo ficar mais animado :)
Como estou temporariamente sem Linux, tive que desenvolver no Windows utilizando o Dev-C++. Por isso ainda não testei no Linux para fazer as adaptações e tornar um código "multi-SO".

O código, como de costume, coloquei no GitHub: Jogo da Velha do Chaves com Allegro. No momento faltam apenas três características para a versão final:
- implementar scores(jogador 1 e jogador 2)
- implementar uma lógica de quem é o primeiro a jogar(atualmente o Chaves sempre começa jogando)
- criar a possibilidade de um jogo contra o computador com 3 níveis(até o momento só temos o modo multiplayer)

26/08/12: Commitado no repositório as modificações para gravar o placar e definir quem começa jogando na atual rodada.




Pra quem for dar uma olhada, aceito críticas(boas ou ruins) e sugestões :)

You can do it!

domingo, 13 de maio de 2012

Plugin Java para navegadores no Gentoo

Recentemente tentei acessar o site do Geogebra para utilizar o aplicativo online, mas acabei me deparando com um problema: o aplicativo não era executado pela justificativa de que eu não tinha nenhuma JRE instalada. O problema disso tudo é que eu tinha sim uma JRE instalada, até porque eu desenvolvo normalmente aplicativos Java.


Então qual seria o problema? Tentei diversos navegadores: Chrome, Firefox e o próprio Epiphany que vem com o Gentoo. Mas, com algumas pesquisas descobri que era algo bem simples! Quando for instalar a sua JRE/JDK é preciso usar a USE Flag nsplugin. Só isso? Sim! Apenas edite seu arquivo make.conf que fica neste caminho: /etc/make.conf. Adicione nsplugin às variáveis USE e compile o pacote novamente.


Para confirmar que os plugins para seu navegador foram corretamente instalados, execute o comando para listar os plugins instalados:


$ eselect java-nsplugin list


Se estiver com dificuldades em instalar a JRE/JDK da Oracle em seu Gentoo recomendo a leitura desta postagem: Instalando pacotes manualmente no Gentoo




Mais sobre Gentoo em:
Gentoo
- Dalton Matos

sábado, 17 de março de 2012

Chrooting Gentoo

Quem utiliza o Gentoo já precisou ao menos uma vez fazer chroot por outro SO, como durante a instalação do próprio. Ainda há casos onde é necessário recorrer ao live do Gentoo(ou à uma outra distro Linux com live) para poder acessar nosso Gentoo original e realizar as devidas modificações.

Exemplo?
Em um emerge --depclean que uma vez fiz, acidentalmente removi o pacote da synaptics que era necessário para que meu teclado funcionasse. Como meu teclado não funcionava precisei dar chroot pelo live do Ubuntu no Gentoo, e então, fiz emerge do pacote.

How to?
Utilizando o live de alguma distro Linux, abra o terminal. Após isso, precisamos montar as partições do Gentoo:


# mkdir /mnt/gentoo
# mount /dev/sdaX /mnt/gentoo
# mkdir /mnt/gentoo/boot
# mount /dev/sdaY /mnt/gentoo/boot
# mount -t proc none /mnt/gentoo/proc
# mount -rbind /dev /mnt/gentoo/dev

obs.:
  • sdaX: 'X' é o número da partição da instalação do Gentoo
  • sdaY: 'Y' é o número da partição de boot do seu Gentoo
  • Os comandos precisam ser executados como root
Agora podemos dar chroot e acessar nosso Gentoo:


# chroot /mnt/gentoo /bin/bash
# env-update
# source /etc/profile
# export PS1="(chroot) $PS1" /*este comando é opcional*/


Pronto! Você já está no seu Gentoo e pronto para modificações, reparos, etc.


Considerações:

  • Uma cópia do Gentoo já instalada na máquina
  • O live utilizado possuir a mesma arquitetura que a instalação do Gentoo
  • As partições sda podem variar de acordo com o modo de particionamento e instalação do Gentoo


Mais informações, acesse:

If it moves, compile it!

quarta-feira, 21 de dezembro de 2011

/* Instalando pacotes manualmente no Gentoo */

     Há pouco tempo resolvi instalar alguma distro Linux no meu notebook. Depois de algumas pesquisas e indicações, escolhi o Gentoo Linux. Ainda estou me habituando ao novo ambiente e frequentemente me surgem dúvidas, onde nada que uma pesquisa básica na internet ou a ajuda do Dalton Matos (que me ajuda ativamente com o Gentoo) não resolva.


     Como desenvolvo programas em Java, resolvi começar a usar o Gentoo também para tal fim. Após baixar o Eclipse, fui fazer emerge da JDK pelo terminal. Foi então que surgiu o problema!
Fiz o emerge normalmente: emerge virtual/jdk
A questão foi que a JDK default do emerge não é a da Oracle. Com isso, um projeto teve alguns problemas de compatibilidade. Fui então procurar como instalar a JDK adequada. Graças a esta página da documentação do Gentoo consegui instalá-la.


Instalando Pacotes Manualmente
     Alguns pacotes não podem ser baixados diretamente pelo emerge, mesmo com modificações em arquivos como o package.license. Isso ocorre por questões de licenciamento, registro, etc.
     Ao tentar fazer emerge de pacotes que estão nesta situação ocorrerá um erro. Será então exibido no terminal o caminho do log (algo parecido com "/var/tmp/portage/.../build.log"). Abra este arquivo com o editor de preferência. Nele você encontrará informações sobre o porque não foi possível fazer o emerge. Se o pacote tiver que ser baixado manualmente, neste arquivo estará indicado aonde fazer o download. Faça o download do arquivo e então copie este arquivo para o caminho /usr/portage/distfiles. Pronto, agora você poderá fazer o emerge deste pacote e, como ele já foi baixado, será compilado(se for o caso) e instalado em seu sistema.
     No caso da JDK7 da Oracle, eu baixei o .tar e copiei-o para a pasta distfiles. Depois disso, dei emerge: emerge dev-java/oracle-jdk-bin, e o pacote foi instalado normalmente.

sexta-feira, 4 de novembro de 2011

/* Mini-Grep */


Descrição/Sobre:
Grep (global / regular expression / print) é um programa executado pela linha de comando do Linux. Esse programa consiste em buscar uma expressão (uma palavra, por exemplo) em arquivos. O Grep original imprime na saída padrão todas as linhas em que ocorreram a expressão mencionada.
Este é um código que funciona de forma parecida, mas reduzida, por isso mini-grep. O uso pela linha de comando é: [programa] [opções] [expressão] [arquivo]. Lembrando que programa é o executável do mini-grep e o arquivo deverá ser o nome com sua extensão.


Código:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

FILE* abreArquivo(char caminho[], char modo[]){
    FILE *f = fopen(caminho, modo);
    
    if(!f){
           printf("ERRO: O arquivo nao existe\n<ENTER>");
           getchar();
           exit(0);
    }
    return f;
}


void fechaArquivo(FILE *f){
    if(fclose(f)){
        printf("ERRO: Problemas ao fechar o arquivo\n<ENTER>");
        getchar();
     }
}

char* leLinha(FILE *f, char *aux){
     int cont = 0;
     
     do{
        if(aux == NULL){
           aux = (char*) malloc(sizeof(char));
           if(!aux){
              printf("ERRO: erro ao alocar memoria\n<ENTER>");
              getchar();
              exit(0);
           }
        }
        else{
           aux = (char*) realloc(aux, (cont+1) * sizeof(char));
           if(!aux){
              printf("ERRO: erro ao realocar memoria\n<ENTER>");
              getchar();
              exit(0);
           }
        }

        fscanf(f, "%c", &aux[cont]);
        cont++;
     }while(aux[cont-1] != 10 && aux[cont-1] != 0);
     aux[cont-1] = 0;
     
     return aux;
}

void buscaPalavra(FILE *f, char *palavra, int op){
    int linha = 0;
    
    if(!op) strupr(palavra);
    
    while(!feof(f)){
       char *aux = NULL;
       
       aux = leLinha(f, aux);
       linha++;
       if(!op) strupr(aux);
       
       if(strstr(aux, palavra)){
          printf("%d: %s\n", linha, aux);
          printf("\n<ENTER>");
          getchar();
          free(aux);
          aux = NULL;
          return ;
       }
       
       free(aux);
       aux = NULL;
    }
    
    printf("Palavra nao encontrada");
    printf("\n\n<ENTER>");
    getchar();
    
}

int parametrosCorretos(int argc, char *argv[]){
    if(argc < 3 || argc > 4){
       printf("\nUso correto: [%s] [opcoes] [palavra] [nome_do_arquivo]", argv[0]);
       printf("\n\n\n<ENTER>");
       getchar();
       return 0;
    }
    
    if(argc == 4)
       if(strcmp(argv[1], "-i")){
          printf("\nOpcao incorreta.\n\nLista de opcoes validas:\n\n");
          printf(" [-i]\tnao diferenciar maiusculas de minusculas");
          printf("\n\n\n<ENTER>");
          getchar();
          return 0;
       }
    return 1;
}

int main(int argc, char *argv[]){
    FILE *f = NULL;
    
    system("cls");
    if(!parametrosCorretos(argc, argv)) exit(0);
    
    if(argc == 4){
       f = abreArquivo(argv[3], "r");
       buscaPalavra(f, argv[2], 0);
    }
    else{
       f = abreArquivo(argv[2], "r");
       buscaPalavra(f, argv[1], 1);
    }
    
    fechaArquivo(f);
    return 0;
}



Primeiro testamos se os parâmetros foram passados de maneira correta e para isso chamamos a função 'parametrosCorretos'. Se o programa foi chamado de forma correta, abrimos o arquivo(se ele existir) e buscamos a palavra a partir da função 'buscaPalavra'. Como não sabemos o tamanho da linha a princípio, se usássemos um array já com suas dimensões definidas poderíamos cair em uma situação em que a linha é maior que este array. Resolvemos este problema com a função 'leLinha', que vai alocando a memória caractere a caractere. Por fim retorna o endereço da linha. O programa para na primeira ocorrência da expressão, e se a mesma não for encontrada exibe uma mensagem no final. :)


---
You can do it!

domingo, 30 de outubro de 2011

/* PGC - Programa de Gerenciamento de Clientes */

Como já sabemos, sistemas que gerenciam informações sempre "quebram um galho"(quando bem feitos). É só você pensar que em uma lista com 1000 materiais escritos em papéis precise das informações de um em específico. Mesmo estando organizados em ordem alfabética, por exemplo, essa é uma tarefa bem cansativa. Com um sistema fazendo esse trabalho de armazenar as informações e gerenciá-las, uma função para pesquisar um material se sairia muito melhor.

Há alguns meses, quando eu estava mais ativo na Namelez, surgiu uma proposta de sistema para um salão de beleza. O sistema deveria guardar as informações de clientes, como nome, endereço, telefones de contato, observações, etc. Fazer esse sistema foi uma experiência única, pois além de ter um contato mais direto com o cliente, pude aprender e entender várias das funções de um analista de sistemas.

Vendo que o sistema feito para o salão (que demos o nome de NameleZ SoftHair) havia sido bem sucedido, minha mãe, que trabalha com vendas, pediu que eu fizesse algo similar para ela. Foi aí que surgiu a ideia do PGC. Um sistema simples feito em C e que roda em console do Windows. Algumas características foram decididas de forma a parear com meu conteúdo atual na faculdade, como a linguagem de programação C e o uso de arquivos para guardar as informações.

O projeto ainda está na metade de desenvolvimento. É open-source e você pode fazer *o que quiser* com o código que está no meu perfil do GitHub, bem aqui.
Aceito críticas, boas ou ruins ...



You can do it!

quinta-feira, 20 de outubro de 2011

/* Jogo da Forca */

O jogo da forca consiste em acertar uma palavra secreta com o limite de x erros.
Para os mais iniciantes algumas funções podem parecer complexa, mas não são. A chToUpper() recebe um caractere e retorna seu equivalente em maiúsculo. A função fflush() limpa o buffer do teclado, ou seja, isso impede que o programa recolha lixo ao invés da entrada do usuário.
Nesta primeira versão, a palavra secreta já está no código-fonte. Melhorias em breve. :3

O jogo é simples e pequeno. Segue o código:

21/10/11: você pode ver a última versão com o código completo no meu repositório do GitHub: Jogo da Forca

#include <stdio.h>

char palavraSecreta[] = "OVERFLOW";
int letrasUsadas[256] = { 0 };
char palavraDescoberta[] = "--------";
int vida = 5;

void showTelaInicial(){
     printf("\t\t\t\t ------- \n");
     printf("\t\t\t\t| Forca |\n");
     printf("\t\t\t\t ------- \n");
     printf("\n\n\n\nPressione <ENTER> para continuar...");
     getchar();
}

int chToUpper(char ch){
     return ch & ~32;
}

void printLetrasUsadas(){
     int i;
     printf("\t\t\tLetras usadas: [ ");
     for(i = 65; i < 91; i++)
           if(letrasUsadas[i]) printf("%c ", i);
     printf("]\n");
}

void printPalavraDescoberta(){
     int i;
     printf("\n\t\t\t=> ");
     for(i = 0; palavraSecreta[i]; i++)
           printf("%c ", palavraDescoberta[i]);
     printf("<=\n");
}

char chutaLetra(){
     char ch;
     printf("\t\t\tNova letra: ");
     fflush(stdin);
     scanf("%c", &ch);
     return chToUpper(ch);
}

int verificaLetraUsada(int letra){
    if(letrasUsadas[letra]) return 1;
    return 0;
}

int chuteCerto(char ch){
    int i;
    int acertou = 0;
    for(i = 0; palavraSecreta[i]; i++)
          if(palavraSecreta[i] == ch){
             palavraDescoberta[i] = ch;
             acertou = 1;
          }
    return acertou;
}

int terminou(){
     int i;
     for(i = 0; palavraSecreta[i]; i++)
           if(palavraDescoberta[i] == '-') return 0;
     
     return 1;
}

void play(){
     char chute;
     while(vida){
          system("cls");
          printf("\n\n");
          
          printLetrasUsadas();
          printf("\t\t\tVidas: %d\n", vida);
          printPalavraDescoberta();
          chute = chutaLetra();
          
          if(!verificaLetraUsada(chute)){
             letrasUsadas[chute] = 1;
             if(!chuteCerto(chute)) vida--;
             else if(terminou()) break;
          }
          else{
             printf("\t\t\tLetra ja utilizada... <ENTER>");
             fflush(stdin);
             getchar();
          }
          
          
     }
     system("cls");
     if(!vida) printf("\n\n\t\t\t\tVoce perdeu...");
     else printf("\n\n\t\t\tParabens, voce ganhou");
     fflush(stdin);
     getchar();
}

int main(){
    showTelaInicial();
    play();

    return 0;
}


sexta-feira, 7 de outubro de 2011

/* Jogo da velha */

Trago-lhes um simples jogo da velha feito em C.
O jogo consiste em você jogar contra o computador. Na função main há um loop que, analogamente, é o "coração" do jogo.
A função init_matriz inicializa a matriz 3x3 com espaços, para que assim fique melhor sua exibição. A função disp_matriz mostra o "tabuleiro" formatado na tela do console. A função move_jogador e move_cpu são, respectivamente, para a sua jogada e a jogada do computador. A função check_vencedor verifica se alguém ganhou o jogo, pela linha, coluna ou diagonal.
Como o programa foi desenvolvido apenas de forma didática, o computador não possui nenhuma "inteligência", sendo assim, na sua vez ele simplesmente procura um espaço em branco e joga nele. Para implementar algum tipo de IA, é necessário apenas modificar a função move_cpu.

12/10/11:
Você pode ver o código do jogo completo no meu repositório no GitHub: Jogo da Velha
22/10/11:
Código no repositório adaptado para rodar tanto em Windows quanto em Linux.
-----

#include <stdio.h>

char matriz[3][3];

void init_matriz(){
     int i, j;
     
     for(i = 0; i < 3; i++)
        for(j = 0; j < 3; j++) matriz[i][j] = ' ';
}

void disp_matriz(){
     int i, j;
     printf(" --- --- --- \n");
     for(i = 0; i < 3; i++){
        printf("|");
        for(j = 0; j < 3; j++) printf(" %c |", matriz[i][j]);
        printf("\n|---|---|---|\n");
     }
}

void move_jogador(){
     int x, y;
     printf("\n\nDigite em qual pos(x, y) deseja jogar: ");
     scanf("%d%d", &x, &y);
     x--;
     y--;
     
     if(matriz[x][y] != ' '){
        printf("Posicao invalida ou ja jogada, tente novamente...\n\n");
        move_jogador();
     }
     else matriz[x][y] = 'X';
}

void move_cpu(){
     int i, j;
     
     for(i = 0; i < 3; i++){
        for(j = 0; j < 3; j++)
              if(matriz[i][j] == ' ') break;
        if(matriz[i][j] == ' ') break;
     }
     
     if(i*j == 9){
            printf("\nEMPATE");
            getchar();
            exit(0);
     }
     else matriz[i][j] = 'O';
}

char check_vencedor(){
     int i;
     
     for(i = 0; i < 3; i++)
        if( (matriz[i][0] == matriz[i][1]) && (matriz[i][0] == matriz[i][2]) )
           return matriz[i][0];
           
     for(i = 0; i < 3; i++)
        if( (matriz[0][i] == matriz[1][i]) && (matriz[0][i] == matriz[2][i]) )
           return matriz[0][i];
           
     if( (matriz[0][0] == matriz[2][2]) && (matriz[1][1] == matriz[2][2]) )
        return matriz[1][1];
     if( (matriz[1][1] == matriz[0][2]) && (matriz[1][1] == matriz[2][0]) )
        return matriz[1][1];
     
     return ' ';
}

int main(){
    char terminado = ' ';
    
    printf("\t\tJogo da Velha :)\n");
    printf("Modo: vs cpu\n\n");
    init_matriz();
    do{
       disp_matriz();
       move_jogador();
       terminado = check_vencedor();
       
       if(terminado != ' ') break;
       
       move_cpu();
       terminado = check_vencedor();
    }while( terminado == ' ');
    
    if(terminado == 'X') printf("\n\nParabens, voce venceu!\n");
    else printf("\n\nQue pena, voce perdeu!\n");
    
    disp_matriz();
    fflush(stdin);
    getchar();
    return 0;
}


-----
Divirtam-se, façam modificações e code it! :)

quinta-feira, 6 de outubro de 2011

Bubble Sort (Método da bolha)

Bubble sort é um algoritmo de ordenação de vetores. Ele é um dos mais simples de se entender e implementar. O algoritmo consiste em comparar um numero na posição n e n+1 e, caso n for maior, eles trocam de posição. Por isso é chamado de método da bolha, pois ele vai jogando o maior para o final do vetor, formando bolhas.

-----
#include "stdio.h"
void troca( int *a, int *b ){
      int aux = *a;
      *a = *b;
      *b = aux;
}
void bubbleSort( int array[], int tamanho ){
      int i, j;
            for( i = 0; i < tamanho-1; i++ )
for( j = i+1; j < tamanho; j++ )

if( array[i] > array[j] ) troca( &array[i], &array[j] );

}

int main(){
     int array[] = { 2, 7, 1, 0, 20 };
     bubbleSort( array, 5 );
     return 0;
}
-----
Este algoritmo é bem útil, tendo em vista que constantemente precisamos fazer ordenações em nossos programas :)

Para quem não entendeu o que se está passando, este vídeo inusitado pode te ajudar:

quarta-feira, 5 de outubro de 2011

Converge()

Este é um daqueles programas aparentemente inúteis, porém divertidos.
A grande sacada deste programa é a função converge. Esta função escreve no console uma string convergindo para o meio, isto é:
- letra 0;
- letra n;
- letra 1;
- letra n-1;
...
De forma que o texto passado por parâmetro seja por fim escrito.
Let's to the code:

-----
#include "stdio.h"
#include "windows.h"

int tamanhoString(char *str){
     int tamanho = 0;
     while(*str){
        tamanho++;
        *str++;
     }
     return tamanho;
}

void gotoxy(int x, int y){
      COORD c;
      c.X = x;
      c.Y = y;
      SetConsoleCursorPosition (GetStdHandle(STD_OUTPUT_HANDLE), c);
}
void converge( int line, char *msg ){
      int i, j;
            for( i = 1, j = tamanhoString(msg); i < j; i++, j-- ){
            gotoxy(i, line);
            printf("%c", msg[i-1]);
            gotoxy(j, line);
            printf("%c", msg[j-1]);
      }
}
int main(){
     converge(10, "Testando a funcao converge()");
     getchar();
     return 0;
}
-----

Como você pôde perceber, utilizamos uma função já implementada: SetConsoleCursorPosition.
Por este motivo, incluímos a biblioteca windows.h e, obviamente, este programa só funciona em ambiente Windows. Para quem utiliza Linux, se não me engano, utilizamos a biblioteca graph.h para usar a função já implementada gotoxy();