Jump to content
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

Azoto

Snake em pascal zim

Recommended Posts

Azoto

Boas pessoal. Eu para este periodo na escola tenhu de fazer a snake em PascalZim. Eu ate sou razuavel a programar mas não estou mesmo a ver como a fasso. se alguem me puder ajudar agradecia obrigado................e gostaria e agradecia uma resposta breve. :P

Share this post


Link to post
Share on other sites
_4ndr3

Viva,

Azoto, assim ninguém ajuda-te sem mais nem menos, dá a entender que queiras que façam por ti. Sugiro que tentes começar analisar o problema apresentar quais os "entraves" e pedir ajuda nessas dificuldades específicas.

Cumprimentos,

André Freitas.

Share this post


Link to post
Share on other sites
bsntuga

tens de detalhar tudo o que precisas, as regras do jogo etc, depois pensas o que precisaras para o fazer

Share this post


Link to post
Share on other sites
Azoto

Vala pessoal por favor ajudem me la eu ja tentei de todas as formas mas não deu. Eu presiso mesmo da vossa ajuda por favor  :dontgetit:

Share this post


Link to post
Share on other sites
_4ndr3

Viva,

Lá estás com a mesma conversa xD. Tu achas que alguém ficará disponível só para ti mais do que uma hora a fazer tudo por ti?

Desculpa lá mas apelo ao senso comum.

Cumprimentos.

Share this post


Link to post
Share on other sites
Triton

Vala pessoal por favor ajudem me la eu ja tentei de todas as formas mas não deu. Eu presiso mesmo da vossa ajuda por favor  :dontgetit:

Continuar a pedir só vai fazer com que o pessoal te ignore...


<3 life

Share this post


Link to post
Share on other sites
bsntuga

Encontrei esta source, estuda-a

program snake; (* email address: nerkiator@hotmail.com *)

uses crt,graph;

const passo=19;

var coor:array[1..800,1..2]of integer;
    n:array[1..9]of char;
    
cont,driver,mode,i,j,x,y,xc,yc,totale,ultx,ulty,punteggio,primato,vel:integer;
    a,direzione,risp,tasto:char;
    oldscore,score,s:string;
    occupato,infrociamento,mangia:boolean;

procedure logo;
begin
detectgraph(driver,mode);initgraph(driver,mode,'c:\tp\bgi');
rectangle(0,0,639,479);
settextstyle(0,0,11);
outtextxy(100,3,'Snake');
settextstyle(0,0,0);
outtextxy(300,100,'v1.0');
outtextxy(275,115,'programming:');
rectangle(190,180,430,340);
bar(212,202,312,214);bar(212,202,224,272);bar(300,202,312,240);
bar(300,228,360,240);
circle(218,300,5);
outtextxy(300,370,'Keys:');
outtextxy(280,390,'Numpad 8-up');
outtextxy(280,400,'Numpad 2-down');
outtextxy(280,410,'Numpad 4-left');
outtextxy(280,420,'Numpad 6-right');
outtextxy(290,465,'Hit Enter');
(**)
n[1]:='N';
n[2]:='e';
n[3]:='r';
n[4]:='k';
n[5]:='i';
n[6]:='a';
n[7]:='t';
n[8]:='o';
n[9]:='r';
s:='Nerkiator';
repeat
if not keypressed then

for i:=1 to 9 do
begin
for x:=637 downto 265+i*8  do
begin
if not keypressed then
outtextxy(x,140,n[i]);delay(4);setcolor(black);outtextxy(x,140,n[i]);
setcolor(red)
end;
if not keypressed then
outtextxy(265+i*8,140,n[i])
end; if not keypressed then delay(1500);
if not keypressed then
for j:=273 downto 2 do
begin
if not keypressed then
outtextxy(j,140,s);setcolor(black);outtextxy(j,140,s);setcolor(red)
end
until keypressed;
(**)
setcolor(white);
end;

procedure campo;
begin
rectangle(8,8,(passo*30)-8,(passo*24)-8);
outtextxy(580,80,'Score:')
end;

procedure segmento(x,y:integer);
begin
setcolor(black);
rectangle(x-9,y-9,x+9,y+9);
setfillstyle(12,white);
bar(x-8,y-8,x+8,y+8);
setcolor(white)
end;

procedure cancsegm(x,y:integer);
begin
setfillstyle(1,black);
bar(x-9,y-9,x+9,y+9);
setfillstyle(1,white)
end;

procedure cibo(x,y:integer);
begin
x:=x*passo;
y:=y*passo;
circle(x,y,9)
end;

procedure suono;
var i:integer;
begin
for i:=1 to 30000 do
sound(100);
nosound
end;

procedure gnam;
var i:integer;
begin
for i:=1 to 5000 do
sound(1100);
nosound
end;

function punti(x:integer):string;
var
  s:string[10];
begin
  str(x,s);
  punti:=s;
end;


procedure gioco;
begin
cleardevice;
campo;
punteggio:=0;
oldscore:=punti(punteggio);
score:=oldscore;
x:=passo*15;y:=passo*23;
direzione:='6';
tasto:='6';
totale:=8;
infrociamento:=false;
mangia:=false;
coor[1,1]:=x;coor[1,2]:=y;
occupato:=false;
for i:=2 to totale do
begin
coor[i,1]:=coor[i-1,1]-passo;coor[i,2]:=y
end;
xc:=15;yc:=12;
cibo(xc,yc);
repeat
setcolor(black);
outtextxy(580,100,oldscore);
setcolor(white);
outtextxy(580,100,score);
for i:=1 to totale do
segmento(coor[i,1],coor[i,2]);
delay(270);
cancsegm(coor[totale,1],coor[totale,2]);
delay(270);
if (x=xc*passo) and (y=yc*passo) then mangia:=true;
if mangia then
begin
punteggio:=punteggio+9;
score:=punti(punteggio);
oldscore:=punti(punteggio-9);
totale:=totale+1;
coor[totale,1]:=ultx;coor[totale,2]:=ulty;
gnam;
repeat
occupato:=false;
xc:=random(29)+1;yc:=random(23)+1;
for i:=1 to totale do
if(coor[i,1]=xc*passo)and(coor[i,2]=yc*passo)then occupato:=true
until not occupato;
cibo(xc,yc);
mangia:=false
end;
if keypressed then tasto:=readkey;
case tasto of
'8':if direzione<>'5' then direzione:='8';
'2':if direzione<>'8' then direzione:='5';
'6':if direzione<>'4' then direzione:='6';
'4':if direzione<>'6' then direzione:='4'
end;
case direzione of
'8': y:=y-passo;
'5': y:=y+passo;
'6': x:=x+passo;
'4': x:=x-passo
end;
ultx:=coor[totale,1];ulty:=coor[totale,2];
for i:=totale downto 2 do
begin
coor[i,1]:=coor[i-1,1];
coor[i,2]:=coor[i-1,2]
end;
coor[1,1]:=x;coor[1,2]:=y;
for i:=2 to totale do
begin
if (coor[i,1]=x) and (coor[i,2]=y) then infrociamento:=true
end
until (x-passo<0) or (y-passo<0) or (x+passo=passo*31) or (y+passo=passo*25) 
or infrociamento;
suono
end;

procedure programma;
begin
logo;
textcolor(black);
repeat
gioco;
cleardevice;
outtextxy(280,240,'Score: ');outtextxy(330,240,punti(punteggio));
readln;
outtextxy(265,270,'New game?(Y/N)');risp:=readkey
until (risp='n') or (risp='N')
end;

begin (*p.p.*)
programma
end.

Share this post


Link to post
Share on other sites
Azoto

Eu tambem ja tinha encontrado isso mas isso não é pascalzim. Isso e o pascal normal e como eu n sei os comandos desse pascal e muito dificil para mim perceber esse programa. eu ja vi ke n me vao ajudar assim por isso eu vou tentar perceber o ke kada comando faz e depois digovos alguma coisa. Até mais logo  :(

Share this post


Link to post
Share on other sites
Triton

Eu tambem ja tinha encontrado isso mas isso não é pascalzim. Isso e o pascal normal e como eu n sei os comandos desse pascal e muito dificil para mim perceber esse programa. eu ja vi ke n me vao ajudar assim por isso eu vou tentar perceber o ke kada comando faz e depois digovos alguma coisa. Até mais logo  :(

Ja viste que não te vão ajudar ou não te vão fazer o trabalho? Tens cá uma lata pa... :)


<3 life

Share this post


Link to post
Share on other sites
Azoto

Lata? omg eu so kero e tentar perceber o ke cada comando faz e ke eu não pesco nada disto meu...... So pascal zim porque e o ke tou a dar na escola. Axo ke não custa nada ajudar o pessoal mas ok. Eu n kero ke fassam o trabalho por mim eu no inicio pedi pois pensava ke ja tinham feito algum ou assim e entao ajudavam-me. mas eu vi agoera akele programa mas como não percebo os comandos não posso fazer em pascal zim percebes? :P

Share this post


Link to post
Share on other sites
Azoto

Pessoal eu não consuigo perceber esse codigo................ Eu ja tive a ver e nao percebi xP ja tive a tentar umas coisinhas e ate agora so consuegui meter a cobra a andar com as teclas mais nd................

Share this post


Link to post
Share on other sites
bsntuga

agora mete a fruta para a cobra comer, e sempre que a cobra passar por la, ele desaparece, adiciona outro ponto aleatorio, e da bonus

Share this post


Link to post
Share on other sites
Gooden

Porque não começas por meter aqui o código que já tens e de seguida Dizeres o que tas a tentar fazer e onde te esta a dar erro?????? Axo o melhor a fazer

Share this post


Link to post
Share on other sites
GoncaloMendes

Boas, eu já fiz um jogo desses e não tem nada de dificil, não te vou dar o código (para não te tirar o prazer da descoberta  B)) mas lembra-te do uso de GotoXY's com arrays bidimensionais do tipo byte

Espero que chegue para chegares la  ;)

Cumps


I just wanna say one word to you, just one word: Plastics

Share this post


Link to post
Share on other sites
celsoreis

Alguém me pode dizer como se mete as letras a andar como as que estão no programa da snake?

As que estão a rodar dizem "Nerkiator".

Share this post


Link to post
Share on other sites
thoga31

ALGUEM ME PODE DIZER COMO SE METE AS LETRAS A ANDAR COMO AS QUE ESTAO NO PROGRAMA DA SNAKE ??????????

AS QUE ESTAO A RODAR DIZEM "Nerkiator"!!!!!!!

È URGENTE!

Mas que raio...?

Em primeiro lugar, o uso de maiúsculas numa frase indica gritos, e aqui apreciamos a boa educação.

Mais, não vale a pena usares negritos e cores garridas.

De seguida, não há dúvidas mais ou menos urgentes - daí não necessitares deste espalhafato, só estás a afastar o pessoal.

Se tens dúvidas, coloca-as como deve ser.

Edited by thoga31
  • Vote 1

Knowledge is free!

Share this post


Link to post
Share on other sites
passarito

ALGUEM ME PODE DIZER COMO SE METE AS LETRAS A ANDAR COMO AS QUE ESTAO NO PROGRAMA DA SNAKE ??????????

AS QUE ESTAO A RODAR DIZEM "Nerkiator"!!!!!!!

È URGENTE!

O QUÊ? - FALA MAIS ALTO QUE EU NÃO TE OUÇO.... É A M€RD@ DO DJ, TEM A MANIA DE PÔR A MUSICA EM ALTOS BERROS!!!!

Share this post


Link to post
Share on other sites
I-NOZex

code or didn't happen :cheesygrin:

(explica a tua duvida como deve ser, e mete o codigo que ja tens, num topico criado para a tua duvida, ou seja, cria um novo ;) )

Edited by I-NOZex

B2R » Beat2Revolution v3.0b | Regista e divulga-nos

beat2revolution.net

Share this post


Link to post
Share on other sites
passarito

Já emendei peço desculpa....

Não queria causar problemas a ninguém....

Bem, agora que já cá estamos fora da discoteca, vamos lá falar....

Alguém me pode dizer como se mete as letras a andar como as que estão no programa da snake?

As que estão a rodar dizem "Nerkiator".

Bem, aquilo é o ex-líbris do Pascal.... é o modo gráfico do pascal! Adeus modo texto, olá modo gráfico!

Aqui, alguns exemplos de programas feitos em modo gráfico: http://www.portugal-a-programar.pt/topic/54702-quantas-cores-tem-o-modo-grafico-em-pascal/page__st__60

1º Sabes alguma coisa sobre trabalhar com o modo gráfico do Pascal?

2º Não sei se nestes novos pascais (Free Pascal, Pascal Zim) isto funciona

3º Do Windows Vista para cima, esquece, que os SO's lembraram-se de tomar o controlo das aplicações da linha de comandos.

Portanto já são muitos pontos a jogar contra este tipo de programação que era um espetáculo, no entanto se ainda quizeres ajuda, chuta aí as tuas dúvidas em concreto.

Share this post


Link to post
Share on other sites
thoga31

O Free Pascal trabalha bem com o modo gráfico, mas não tem o suporte ou as funcionalidade que tinha nos anos 80 e 90. Perderam-se imensas coisas pois a actual unit graph não é a implementação antiga, e há coisas que estão apenas instanciadas por motivos de retrocompatibilidade.

Edited by thoga31

Knowledge is free!

Share this post


Link to post
Share on other sites
GRSa

Isso rodou no PascalZim (pelo menos na versão 5.2.4). =)

Se vira para explicar o código ao teu professor, no mínimo você vai ter que estudar isso um pouco.

Qualquer dúvida...

(não) me pergunte. :thumbsup:

Program Jogo_Snake;

 Uses Crt;

 Const
POSICAO_HORIZONTAL = 16;
POSICAO_VERTICAL = 5;
DIMENSAO_HORIZONTAL = 50;
DIMENSAO_VERTICAL = 15;
AREA_ESPACO = DIMENSAO_HORIZONTAL * DIMENSAO_VERTICAL;

COR_AREA = BLUE;
COR_SNAKE = YELLOW;
COR_OBSTACULO = LIGHTRED;

CARACTERE_SNAKE = #219;
CARACTERE_OBSTACULO = #219;
CARACTERE_PADRAO = #32;

TAXA_CRESCIMENTO = 4;

 Type
T_Posicao = record
			  horizontal : integer;
			  vertical : integer;
			end;
 Var
snake : record
		  segmento : array[1..AREA_ESPACO] of T_Posicao;
		  quantSegmento : integer;
		  dimensao : integer;
		  direcao : char;
		  atraso : integer;
		end;

movimentoLegal : boolean;
posicaoComida : T_Posicao;

 Procedure DesenhaCaractere (caractere : char;
						  posH, posV,
						  cor: integer);
 Begin
gotoxy(POSICAO_HORIZONTAL + posH - 1,
	   POSICAO_VERTICAL + posV - 1);
textcolor(cor);
textbackground(COR_AREA);
write(caractere);
 End;

 Function CoincideCorpo (refHorizontal,
					  refVertical : integer) : Boolean;
Var
  cont : integer;
 Begin
for cont := 1 to snake.quantSegmento do
begin
  if (snake.segmento[cont].horizontal = refHorizontal) and
	 (snake.segmento[cont].vertical = refVertical) then
  begin
	CoincideCorpo := true;
	Exit;
  end;
end;
CoincideCorpo := false;
 End;

 Function CriaComida : T_Posicao;
Var
  posicaoLivre : array[1..AREA_ESPACO] of T_Posicao;
  quantidadePosicaoLivre : integer;
  contH, contV : integer;
  posicaoSorteada : integer;
 Begin
quantidadePosicaoLivre := 0;
for contH := 1 to DIMENSAO_HORIZONTAL do
begin
  for contV := 2 to DIMENSAO_VERTICAL do
  begin

	if not(CoincideCorpo(contH, contV)) then
	begin
	  inc(quantidadePosicaoLivre);
	  posicaoLivre[quantidadePosicaoLivre].horizontal := contH;
	  posicaoLivre[quantidadePosicaoLivre].vertical := contV;
	end;

  end;
end;
randomize;
posicaoSorteada := random(quantidadePosicaoLivre + 1);
DesenhaCaractere(CARACTERE_SNAKE,
				 posicaoLivre[posicaoSorteada].horizontal,
				 posicaoLivre[posicaoSorteada].vertical,
				 COR_SNAKE);
CriaComida := posicaoLivre[posicaoSorteada];
 End;

 Function MoveSnake : Boolean;
Var
  cont : integer;
  posicaoCandidata : T_Posicao;

Function Colisao(refHorizontal,
				 refVertical : integer) : Boolean;
Begin

  if (refHorizontal = 0) or
	 (refHorizontal > DIMENSAO_HORIZONTAL) or
	 (refVertical = 0) or
	 (refVertical > DIMENSAO_VERTICAL) or
	 CoincideCorpo(refHorizontal, refVertical) then
  begin
	Colisao := true;
  end else
  begin
	Colisao := false;
  end;
End;

 Begin

posicaoCandidata := snake.segmento[1];

case snake.direcao of
  'N' : dec(posicaoCandidata.vertical);
  'S' : inc(posicaoCandidata.vertical);
  'L' : inc(posicaoCandidata.horizontal);
  'O' : dec(posicaoCandidata.horizontal);
end;

if not(Colisao(posicaoCandidata.horizontal,
			   posicaoCandidata.vertical)) then
begin

  if snake.quantSegmento < snake.dimensao then
  begin
	inc(snake.quantSegmento);
  end else
  begin
	DesenhaCaractere(CARACTERE_PADRAO,
					 snake.segmento[snake.quantSegmento].horizontal,
					 snake.segmento[snake.quantSegmento].vertical,
					 COR_AREA);
  end;

  DesenhaCaractere(CARACTERE_SNAKE,
				   posicaoCandidata.horizontal,
				   posicaoCandidata.vertical,
				   COR_SNAKE);

  for cont := snake.quantSegmento downto 1 + 1 do
  begin
	snake.segmento[cont] := snake.segmento[cont - 1];
  end;

  snake.segmento[1] := posicaoCandidata;

  if (snake.segmento[1].horizontal = posicaoComida.horizontal) and
	 (snake.segmento[1].vertical = posicaoComida.vertical) and
	 not(snake.quantSegmento = AREA_ESPACO) then
  begin
	posicaoComida := CriaComida;
	snake.dimensao := snake.dimensao + TAXA_CRESCIMENTO;
  end;

  MoveSnake := true;
end else
begin
  MoveSnake := false;
end;

 End;

 Procedure IniciaRodada;
Var
  posInicialH, posInicialV : integer;
  cont : integer;
 Begin

textbackground(COR_AREA);
clrscr;

{DESENHA AS PAREDES}
for cont := 1 to DIMENSAO_HORIZONTAL + 2 do
begin
  textcolor(COR_OBSTACULO);
  textbackground(COR_AREA);
  gotoxy(POSICAO_HORIZONTAL - 2 + cont, POSICAO_VERTICAL - 1);
  write(CARACTERE_OBSTACULO);
  gotoxy(POSICAO_HORIZONTAL - 2 + cont, POSICAO_VERTICAL + DIMENSAO_VERTICAL);
  write(CARACTERE_OBSTACULO);
end;
for cont := 1 to DIMENSAO_VERTICAL + 2 do
begin
  textcolor(COR_OBSTACULO);
  textbackground(COR_AREA);
  gotoxy(POSICAO_HORIZONTAL - 1, POSICAO_VERTICAL - 2 + cont);
  write(CARACTERE_OBSTACULO);
  gotoxy(POSICAO_HORIZONTAL + DIMENSAO_HORIZONTAL, POSICAO_VERTICAL - 2 + cont);
  write(CARACTERE_OBSTACULO);
end;

posInicialH := DIMENSAO_HORIZONTAL div 2;
posInicialV := DIMENSAO_VERTICAL div 2;

snake.quantSegmento := 1;
snake.dimensao := TAXA_CRESCIMENTO;

snake.direcao := 'L';

snake.segmento[1].horizontal := posInicialH;
snake.segmento[1].vertical := posInicialV;

DesenhaCaractere(CARACTERE_SNAKE,
				 snake.segmento[1].horizontal,
				 snake.segmento[1].vertical,
				 COR_SNAKE);

movimentoLegal := true;

posicaoComida := CriaComida;

gotoxy(1,1);
 End;

Begin
 IniciaRodada;
 snake.atraso := 60;
 CursorOff;
 repeat
delay(snake.atraso);

if (keypressed) then
begin
  case upcase(readkey) of
	 #0: begin
		   case upcase(readkey) of
			 #75: if snake.direcao <> 'L' then snake.direcao := 'O'; //ESQUERDA
			 #77: if snake.direcao <> 'O' then snake.direcao := 'L'; //DIREITA
			 #80: if snake.direcao <> 'N' then snake.direcao := 'S'; //BAIXO
			 #72: if snake.direcao <> 'S' then snake.direcao := 'N'; //CIMA
		   end;
		 end;
	#27: begin
		   Exit;
		 end;
	'R': begin
		   IniciaRodada;
		 end;
	#13: begin
		   readkey;
		 end;
  end;
end;

movimentoLegal := MoveSnake;
textcolor(WHITE); textbackground(COR_AREA);
gotoxy(POSICAO_HORIZONTAL, POSICAO_VERTICAL - 2);
write((100 * snake.quantSegmento) div AREA_ESPACO, '%');

if snake.quantSegmento = AREA_ESPACO then
begin
  textcolor(WHITE); textbackground(COR_AREA);
  gotoxy(POSICAO_HORIZONTAL, POSICAO_VERTICAL + DIMENSAO_VERTICAL + 1);
  write('JOGO ZERADO ');
  readkey;
  IniciaRodada;
end else
begin
  if not (movimentoLegal) then
  begin
	delay(1500);
	IniciaRodada;
  end;
end;

 until (false);

End.

Edited by GRSa

Share this post


Link to post
Share on other sites
thoga31

@GRSa, tens noção que no P@P não se dão trabalhos feitos, mas ajuda-se os membros a encontrar a solução das suas dúvidas. Ou não tens?

Não vens cá há séculos, e agora que voltaste foi para dar um trabalho feito? Nem no Natal nós oferecemos trabalho feito.

Cumprimentos.


Knowledge is free!

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.