Ir ao conteúdo
  • Cadastre-se

ping pong


Visitante: Cronicle8

Posts recomendados

Visitante: Cronicle8
 

Bom dia caros amigos!

então é assim eu preciso de fazer um jogo em pascal! que é o ping-pong!

e que dê a dois jugadores 1-player (w-andar com barra para cima !!! s- andar com barra para baixo)2-player(seta UP-andar pra cima!!! seta Down- andar pra baixo)

Gostava que me dessem uma ajuda como fazê-lo toda a ajuda será agradecida!

PS

Ainda não comecei o programa porque preciso de um pequena ajuda para comeca-lo!

Link para o comentário
Compartilhar em outros sites

  • mês depois...

Ei amigo, há uns tempos atrás consegui na internet um exemplo simples desse tipo de jogo, onde o usuário joga contra o PC (invencível). Utiliza-se Backbuffer, que é uma tela virtual onde você cria as imagens e depois as imprime na tela exibida para o usuário.

O código está logo abaixo e as imagens são todas pegas de arquivos .bmp externos. Dê uma estudada e altere-o como quiser.


type
//objeto que contém as informaçoes sobre a bolinha
TBall = record
//posiçao no plano do jogo
X,Y: Single;
//largura e altura da bolinha
W,H: Integer;
//velocidade vertical e horizontal
//(determina a direção - angulo - da bolinha)
Vx, Vy: Single;
//velocidade da bolinha
Speed: Single;
end;


//objeto que contém as informações da barrinha da AI (PC)
TCPUBar = record
//posiçao da barrinha no plano do jogo
X,Y: Single;
//largura e altura
W,H: Integer;
//velocidade máxima da barrinha
Speed: Single;
end;

//objeto que conté, as informações da barrinha do jogador
TPlayerBar = record
//posiçao da barrinha no plano do jogo
X,Y : Single;
//largura e altura
W,H: Integer;
end;

var
Form1: TForm1;

{variaveis que manipulam dados dos records}
ball: TBall;
bar_cp: TCPUBar;
bar_p1: TPlayerBar;

{indica se o jogo está pausado ou não}
paused: boolean = true;

{pontos do jogador}
score_p1: Integer = 0;

{pontos da AI}
score_cp: Integer = 0;

{buffer de desenho do jogo (backbuffer) }
bbuffer: TBitmap;

{matriz de bitmaps do jogo}
bitmaps: array of TBitmap;
//Declaramos uma matriz de bitmaps para carregar todas as imagens do jogo
//para a memória

implementation

{$R *.dfm}

{funcao que toca sons}
procedure TocaWave(som: String);
begin
SndPlaySound(PChar(som), SND_ASYNC);
//SND_ASYNC indica pro windows que é pra executar som sem interromper
//as aplicacoes rodando, no caso, o jogo. Temos que converter o nome
//do arquivo para PChar porque é isso o que a função entende!
end;

//função que carrega as imagens pra matriz
procedure loadImage(imagem: string);
begin
//aloca um novo espaço na memória para a imagem
//como aqui estamos usando matrizes dinâmicas
//fica bem fácil fazer isso.
SetLength(bitmaps, Length(bitmaps) + 1);
//cria e carrega a imagem
bitmaps[high(bitmaps)]:= TBitmap.Create;
with bitmaps[high(bitmaps)] do
begin
//carrega o arquivo do disco pra memória
LoadFromFile(imagem);
//adiciona a transparência
Transparent:= True;
//modifica a cor de transparência para magenta
TransparentColor:= clFuchsia;
end;
end;

//função que libera todos os bitmaps da matriz
procedure freeBitmaps;
Var
i:integer;
begin
//percorre toda a matriz
for i:=0 to High(bitmaps) do
begin
//libera o bitmap da memória
FreeAndNil(bitmaps[i]);
end;
//libera o espaço alocado para a matriz
bitmaps:= nil;
end;

procedure LoadGameGraphics;
begin
//carrega todas as imagens do jogo
LoadImage('0.bmp');
LoadImage('1.bmp');
LoadImage('2.bmp');
LoadImage('3.bmp');
LoadImage('4.bmp');
LoadImage('5.bmp');
LoadImage('6.bmp');
LoadImage('7.bmp');
LoadImage('8.bmp');
LoadImage('9.bmp');
LoadImage('ball.bmp');
LoadImage('bar.bmp');
LoadImage('cpu.bmp');
LoadImage('cts_text.bmp');
LoadImage('field.bmp');
LoadImage('player.bmp');
end;


{funçao que inicia o jogo e reseta as variáveis}
procedure InitGame();
begin
//pausa o jogo
paused:= True;
//reseta a bosiçao da bolinha
Ball.X:= 37 + ((566 - Ball.W) / 2);
Ball.Y:= 77 + ((366 - Ball.H) / 2);
//reseta a velocidade e direcao da bolinha
Ball.Speed:= 8;
Ball.Vx:= 0.5;
Ball.Vy:= 0.5;
//reseta a posicao da barrinha do jogador
Bar_p1.X:= 57;
Bar_p1.Y:= 77 + ((366 - bar_p1.H) / 2);
//reseta a posiçao da barrinha da AI
Bar_cp.X:= 577;
Bar_cp.Y:= bar_p1.Y;
end;

{funcao que verifica as colisoes da bolinha}
procedure ball_check_collision();
Var
bt: Single;
begin
//distância da bolinha até o topo do cenário
bt:= 77 + ball.H / 2;

//verifica se a bolinha colidiu com o topo do cenário
if ball.Y < bt then
begin
//reflete a bolinha com o mesmo angulo
ball.Vy:= -ball.Vy;
//move um pouco a bolinha para evitar outras colisões
ball.Y:= bt + (bt - ball.Y);
end;

//distância da bolinha até o fundo do cenário
bt:= 77 + 366 - ball.H - 6;

//verifica se colidiu com o fundo do cenário
if ball.Y > bt then
begin
//reflete a bolinha com o mesmo ângulo
ball.Vy:= -ball.Vy;
//move um pouco a bolinha para evitar outras colisões
ball.Y:= bt - (ball.Y - bt);
end;

//distância da bolinha até a barrinha do jogador
bt:= bar_p1.X + bar_p1.W - (ball.W / 2);

//verifica se a bolinha colidiu com a barrinha do jogador
if (ball.X < bt) and ((ball.Y >= bar_p1.Y) and (ball.Y + ball.H < bar_p1.Y + bar_p1.H)) then
begin
//reflete a bolinha com o mesmo angulo
ball.Vx:= -ball.Vx;
//aumenta a velocidade da bolinha
ball.Speed:= ball.Speed + 0.5;
//move um pouco a bolinha para evitar colisões
ball.X:= bt + (bt - ball.X);
end;

//distância da bolinha até a barrinha da AI
bt:= bar_cp.X - ball.w + (ball.w / 2);

//verifica se a bolinha colidiu com a barrinha da AI
if (ball.x > bt) and ((ball.y >= bar_cp.y) and (ball.y + ball.h < bar_cp.Y + bar_cp.h)) then
begin
//reflete a bolinha com o mesmo ângulo
ball.Vx:= -ball.Vx;
//aumenta a velocidade da bolinha
ball.Speed:= ball.Speed + 0.5;
//move um pouco a bolinha para evitar colisões
ball.x:= bt - (ball.x - bt);
end;

//verifica se a bolinha saiu à esquerda
if ball.x < 37 + 6 then
begin
//ponto da AI
Inc(score_cp);
//reinicia o jogo
InitGame();
end;

//verifica se a bolinha saiu à direita
if ball.X + ball.w > 37 + 566 - 6 then
begin
//ponto do jogador
Inc(score_p1);
//reinicia o jogo
InitGame;
end;
end;

{funçao que move a bolinha de acordo com o angulo e velocidade}
procedure ball_move();
begin
//move a bolinha no eixo x (horizontal)
ball.X := ball.X + ball.Vx * ball.Speed;
//move a bolinha no eixo y (vertical)
ball.Y := ball.Y + ball.Vy * ball.Speed;
end;

{funcao que controla a AI}
procedure bar_cp_handle();
begin
//se for possível chegar à bolinha nesse frame
if abs(ball.Y - bar_cp.Y) <= bar_cp.Speed then
//move a barrinha para a posição da bolinha
bar_cp.Y:= ball.Y
else
//do contrario, move a barrinha na direcao da bolinha
//mas apenas o que a velocidade permite neste frame
bar_cp.Y:= bar_cp.Y + (bar_cp.Speed * (ball.Y - bar_cp.Y)) / abs(ball.Y - bar_cp.Y);

//verifica se abarrinha da AI passou dos limites do cenário e coloca de volta
if bar_cp.Y + bar_cp.H > 77 + 366 then
bar_cp.Y:= 77+ 366 - bar_cp.H;
if bar_cp.Y < 77 then
bar_cp.Y:= 77;
end;

{funcao que desenha os pontos dos jogadores usando a imagem dos numeros do jogo}
procedure CreateScore(x, y, Score: Integer);
Var
i,d: Integer; //variaveis de controle do laço
s: string; //string com pontuaçao a ser desenhada
begin
//transforma a pontuação em string (para percorrer os caracteres)
s:= IntToStr(Score);
//o máximo de pontos é 9999 (4 caracteres), se a string com os pontos
//tiver menos de 4 caracteres, preenche os espaços com zero
d:= 4 - Length(s);
for i:=0 to d -1 do
begin
//desenha a imagem do 0 no backbuffer
bbuffer.Canvas.Draw(x, y, bitmaps[0]);
//aumenta a posição x para o próximo caracter
Inc(x, 24);
end;
//desenha os caracteres na string dos pontos
for I:= 1 to Length(s) do
begin
//desenha o caracter no backbuffer
bbuffer.Canvas.Draw(x, y, bitmaps[StrToInt(s[i])]);
//aumenta a posicao x para o próximo caracter
Inc(X, 24);
end;
end;


procedure TForm1.FormClick(Sender: TObject);
begin
paused:= not paused;
end;

procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
//move a barrinha do jogador para a posição do mouse
bar_p1.Y:= y;

//verifica se a barrinha do jogador passou dos limites do cenário
//e coloca ela de volta nos limites do cenário
if bar_p1.Y + bar_p1.h > 77 + 366 then
bar_p1.y:= 77 + 366 - bar_p1.H;
if bar_p1.Y < 77 then
bar_p1.y:= 77;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
//quando o form for criado carregamos as imagens...
LoadGameGraphics;
//cria e inicializa o backbuffer
bbuffer:= TBitmap.Create;
bbuffer.Width:= 640;
bbuffer.Height:= 480;
bbuffer.Canvas.Brush.Color:= clBlack;
//inicializa algumas variáveis da bolinha
Ball.W:= 15;
Ball.H:= 15;
//inicializa algumas variáveis da barrinha do jogador
Bar_p1.W:= 10;
Bar_p1.H:= 80;
//inicializa algumas variáveis da barrinha da AI
Bar_cp.W:= 10;
Bar_cp.H:= 80;
Bar_cp.Speed:= 15;
//inicia o jogo
InitGame();
//inicia o som de fundo
// MediaPlayer1.FileName:= 'win.wav';
// MediaPlayer1.Open;
// MediaPlayer1.Play;

//habilita o timer do jogo
Timer1.Enabled:= true;
//habilita o timer de controle da música
// Timer2.Enabled:= True;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
//quando o form for destruído liberamos as imagens
freeBitmaps;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
{Aqui é controlado o loop principal do jogo}
{
aqui é analisada as informaçoes do jogo e mover objetos;
verificar as entradas do usuário e processá-las no jogo (mover a barrinha);
verificar colisões com a barrinha ou o cenário;
desenhar os objetos no backbuffer;
desenhar o backbuffer na tela;
}
if not paused then begin
//verifica colisoes da bolinha
ball_check_collision();
//move a bolinha
ball_move();
//controla a AI da barrinha do computador
bar_cp_handle();
end;

//limpa a tela anterior para desenharmos a nova tela
bbuffer.Canvas.FillRect(Rect(0,0,640,480));

//desenha o fundo do jogo
bbuffer.Canvas.Draw(37,77, bitmaps[14]);

//pontuação do jogador (texto)
bbuffer.Canvas.Draw(37,10, bitmaps[15]);
//chama a funçao que cria a imagem da pontuação
CreateScore(191,17, score_p1);
//pontuaçao da AI (texto)
bbuffer.canvas.Draw(424,10, bitmaps[12]);
//chama a funçao que cria a imagem da pontuação
CreateScore(507,17, score_cp);

//Desenha a barrinha do jogador
bbuffer.Canvas.Draw(Round(bar_p1.X), Round(bar_p1.Y), bitmaps[11]);
//Desenha a barrinha da AI
bbuffer.Canvas.Draw(Round(bar_cp.X), Round(bar_cp.Y), bitmaps[11]);
//Desenha a bolinha
bbuffer.Canvas.Draw(Round(ball.X), Round(ball.Y), bitmaps[10]);

//temos uma imagem para indicar que o jogo está
//parado, então, caso esteja desenhamos a imagem
if paused then
bbuffer.Canvas.Draw(156,240, bitmaps[13]);

//finalmente envia tudo isso pra tela
Canvas.Draw(0,0, bbuffer);
end;

procedure TForm1.Timer2Timer(Sender: TObject);
begin
//se nao estiver tocando a musica...
if MediaPlayer1.Mode = mpStopped then
MediaPlayer1.Play;
end;

end.

Qualquer dúvida entre em contato.

post-311052-13884954264171_thumb.jpg

post-311052-1388495426436_thumb.jpg

post-311052-13884954264504_thumb.jpg

post-311052-13884954264548_thumb.jpg

post-311052-13884954264598_thumb.jpg

Link para o comentário
Compartilhar em outros sites

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

 

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!