Ir ao conteúdo

Problema com inportb().. ajuda?


1994mateus

Posts recomendados

Postado

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();     }}
Postado

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...

Postado

no seu computador roda aquele código la em cima?

eu coloco a biblioteca <dos.h> mas fala que o inportb não foi declarado no scope.

Estou usando o code blocks 10.5(meu professor de estrutura de dados falou que é bom essa versão porque não dá bugs com o graphics.h)

Postado

mas pra fazer funcionar no code blocks o que eu devo fazer?

você sabe dizer se aquela implementação do inporb() está correta?

esse turbo C++ ja é muito pra mim... a ultima vez q usei o dos foi pra instala torin's passage '-'

Postado

agora eu peguei os includes (dos.h e _defs.h) do turbo C++ e coloquei no code blocks (como dos2.h) e um ajuste de uma função para unsigned int. Agora esta dando outro erro: undefined reference to `__inportb__'

Arquivado

Este tópico foi arquivado e está fechado para 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...

LANÇAMENTO!

eletronica2025-popup.jpg


CLIQUE AQUI E BAIXE AGORA MESMO!