Ir ao conteúdo
  • Cadastre-se

Problema com inportb().. ajuda?


1994mateus

Posts recomendados

Achei um programinha de Pong na net mas não consigo fazer ele funcionar... já fiz alguns ajustes mas esse ultimo bugo meu cérebro.. alguem me ajuda?

ta ai o código:

#include <graphics.h>#include <dos.h>#include <time.h>#include <stdio.h>struct bat;struct bola;struct placar;void inicia();void moverbastao(char);void movimentoBola();void fisica();void jogar();int main (){  int gdriver = DETECT, gmode;  initgraph(&gdriver, &gmode, "c:\\tc\\bgi"); // inicializa os graficos  inicia ();  jogar (); // motor do jogo  closegraph (); // fecha graphics  return 0;}struct bat{ int comprimento; int largura; int coordenadax; int nova_coordenaday; int velha_coordenaday;}bastaoA, bastaoB; // Cria 2 bastões pra cada usuário.struct bola{  int raio;  int velocidadex;  int velocidadey;  int velho_centrox;  int velho_centroy;  int novo_centrox;  int novo_centroy;}bola1;struct placar{  int pontuacao_A;  int pontuacao_B;}jogo_placar;void inicia () // Inicializa o jogo.{ char tempstring [10]; //Essa string segura os pontos no formato de char temporariamente. time_t t;             // Usado para gerar numero aleatorio do tempo do sistema. //Inicializa Bastao A bastaoA.comprimento = 20; bastaoA.largura = 2; bastaoA.coordenadax = 20; bastaoA.nova_coordenaday = 237; bastaoA.velha_coordenaday = 237; // Inicializa Bastao B bastaoB.comprimento = 20; bastaoB.largura = 2; bastaoB.coordenadax = 620; bastaoB.nova_coordenaday = 237; bastaoB.velha_coordenaday = 237; // Inicializa Bola bola1.raio = 3; bola1.velocidadex = 2; srand((int) time(&t)); // gera o numero aleatorio bola1.velocidadey = rand ()%3;// define velocidade de 0 a 3 dependendo do restante. if (rand() % 2 == 0)  {    bola1.velocidadex = - bola1.velocidadex; // Gera direçao X aleatoria.    bola1.velocidadey = - bola1.velocidadey; // Gera direçao Y aleatoria.  } bola1.velho_centrox = 320; bola1.velho_centroy = 250; bola1.novo_centrox = 320; bola1.novo_centroy = 250; // Inicializa pontuação jogo_placar.pontuacao_A = 0; jogo_placar.pontuacao_B = 0; // Deixa o background branco setbkcolor (BLACK); // Desenha a bola na posição inicial setfillstyle (1,15); fillellipse (bola1.novo_centrox,bola1.novo_centroy,bola1.raio,bola1.raio); // desenha os bastoes na posicao inicial bar (bastaoA.coordenadax,bastaoA.nova_coordenaday,bastaoA.coordenadax+bastaoA.largura,bastaoA.nova_coordenaday+bastaoA.comprimento); bar (bastaoB.coordenadax,bastaoB.nova_coordenaday,bastaoB.coordenadax+bastaoB.largura,bastaoB.nova_coordenaday+bastaoB.comprimento); // exibe pontuação sprintf (tempstring,"A - %d",jogo_placar.pontuacao_A); outtextxy (10,450,tempstring); sprintf (tempstring,"B - %d",jogo_placar.pontuacao_A); outtextxy (590,450,tempstring);}void moverbastao (char input){  switch (input)      {         case 'A' :                   if (bastaoA.nova_coordenaday > 0) // mexe somente quando o bastao nao esta tocando o topo, entao ele nao pula da tela.                    {                      bastaoA.velha_coordenaday = bastaoA.nova_coordenaday;                      bastaoA.nova_coordenaday --;                      setfillstyle (1,0); // remove a ultima posição.                      bar (bastaoA.coordenadax,bastaoA.velha_coordenaday,bastaoA.coordenadax+bastaoA.largura,bastaoA.velha_coordenaday+bastaoA.comprimento);                      setfillstyle (1,15); // mostra nova posição.                      bar (bastaoA.coordenadax,bastaoA.nova_coordenaday,bastaoA.coordenadax+bastaoA.largura,bastaoA.nova_coordenaday+bastaoA.comprimento);                    }                    break;         case 'Z' :                   if (bastaoA.nova_coordenaday+bastaoA.comprimento < 430) // pro bastão não passar da parte debaixo da tela.                    {                      bastaoA.velha_coordenaday = bastaoA.nova_coordenaday;                      bastaoA.nova_coordenaday ++;                      setfillstyle (1,0); // remove a ultima posição.                      bar (bastaoA.coordenadax,bastaoA.velha_coordenaday,bastaoA.coordenadax+bastaoA.largura,bastaoA.velha_coordenaday+bastaoA.comprimento);                      setfillstyle (1,15); // mostra nova posição.                      bar (bastaoA.coordenadax,bastaoA.nova_coordenaday,bastaoA.coordenadax+bastaoA.largura,bastaoA.nova_coordenaday+bastaoA.comprimento);                    }                    break;         case 'J' :                   if (bastaoB.nova_coordenaday > 0) // Move only when bat is not touching the top so it doesnt jump out of screen.                    {                      bastaoB.velha_coordenaday = bastaoB.nova_coordenaday;                      bastaoB.nova_coordenaday --;                      setfillstyle (1,0); // remove a ultima posição.                      bar (bastaoB.coordenadax,bastaoB.velha_coordenaday,bastaoB.coordenadax+bastaoB.largura,bastaoB.velha_coordenaday+bastaoB.comprimento);                      setfillstyle (1,15); // mostra nova posição.                      bar (bastaoB.coordenadax,bastaoB.nova_coordenaday,bastaoB.coordenadax+bastaoB.largura,bastaoB.nova_coordenaday+bastaoB.comprimento);                    }                    break;          case 'M' :                   if (bastaoB.nova_coordenaday+bastaoB.comprimento < 430) // Make sure bat doesnot go below the screen.                    {                      bastaoB.velha_coordenaday = bastaoB.nova_coordenaday;                      bastaoB.nova_coordenaday ++;                      setfillstyle (1,0); // remove a ultima posição.                      bar (bastaoB.coordenadax,bastaoB.velha_coordenaday,bastaoB.coordenadax+bastaoB.largura,bastaoB.velha_coordenaday+bastaoB.comprimento);                      setfillstyle (1,15); // mostra nova posição.                      bar (bastaoB.coordenadax,bastaoB.nova_coordenaday,bastaoB.coordenadax+bastaoB.largura,bastaoB.nova_coordenaday+bastaoB.comprimento);                    }                    break;         }}void movimentoBola (){  bola1.velho_centrox = bola1.novo_centrox;  bola1.velho_centroy = bola1.novo_centroy;  bola1.novo_centrox = bola1.novo_centrox + bola1.velocidadex;  bola1.novo_centroy = bola1.novo_centroy + bola1.velocidadey;  setcolor (0);  setfillstyle (1,0);// remove a ultima posição.  fillellipse (bola1.velho_centrox,bola1.velho_centroy,bola1.raio,bola1.raio);  setfillstyle (1,15); // mostra nova posição.  fillellipse (bola1.novo_centrox,bola1.novo_centroy,bola1.raio,bola1.raio);  if ( bola1.novo_centroy - bola1.raio < 0 ) bola1.velocidadey = -bola1.velocidadey; // refletir do topo  if ( bola1.novo_centroy + bola1.raio > 430 ) bola1.velocidadey = -bola1.velocidadey; // refletir da parte de baixo}void fisica (){  char tempstring [10];  if ( bola1.novo_centrox - bola1.raio <= 20)     {         if (bola1.novo_centroy > bastaoA.nova_coordenaday && bola1.novo_centroy < bastaoA.nova_coordenaday+bastaoA.comprimento)            {               bola1.velocidadex = - bola1.velocidadex;               bola1.velocidadey = rand () % 2;// define velocidade de 0 a 2 dependendo do restante.               if (rand() % 2 == 0) bola1.velocidadey = - bola1.velocidadey; // gera direção Y aleatoriamente.             }          else // reinicia o jogo inteiro com novo placar             {               jogo_placar.pontuacao_B ++;               inicia ();             }          return;      }  if ( bola1.novo_centrox +  bola1.raio > 620)      {         if (bola1.novo_centroy > bastaoB.nova_coordenaday && bola1.novo_centroy < bastaoB.nova_coordenaday+bastaoB.comprimento)          {            bola1.velocidadex = - bola1.velocidadex;            bola1.velocidadey = rand ()%2;// define velocidade de 0 a 2 dependendo do restante.            if (rand() % 2 == 0) bola1.velocidadey = - bola1.velocidadey; // gera direção Y aleatoriamente.           }         else // reinicia o jogo inteiro com novo placar          {           jogo_placar.pontuacao_A ++;           inicia ();          }           return;       }}void jogar (){  while (inportb (0X60) != 16) // se a letra Q for pressionado.. sai do loop    {      delay (10); // velocidade para humanos aususah      if (inportb (0X60) == 30)  moverbastao ('A');      if (inportb (0X60) == 44)  moverbastao ('Z');      if (inportb (0X60) == 36)  moverbastao ('J');      if (inportb (0X60) == 50)  moverbastao ('M');      movimentoBola ();      fisica();     }}
Link para o comentário
Compartilhar em outros sites

tipo, essa parte:

void jogar (){  while (inportb (0X60) != 16) // se a letra Q for pressionado.. sai do loop    {      delay (10); // velocidade para humanos aususah      if (inportb (0X60) == 30)  moverbastao ('A');      if (inportb (0X60) == 44)  moverbastao ('Z');      if (inportb (0X60) == 36)  moverbastao ('J');      if (inportb (0X60) == 50)  moverbastao ('M');      movimentoBola ();      fisica();     }}

preciso fazer uma função que leia o teclado enquanto a bola continue rodando.


eu adicionei uma implentação do inportb();

inline unsigned char inportb(unsigned int port) {	// lê um byte de uma porta	unsigned char ret;	asm volatile ("inb %%dx,%%al":"=a"(ret):"d"(port));	return ret;}

mas o programa para de funcionar...

Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...