Alle Beiträge und Antworten
vpascal - 10.04.2007, 20:30
Spiel-Idee
Ich hätte ne Idee.... Ich fange an, und jeder der genügend kenntnisse hat um ein Spiel zu programmieren macht mit... Das ist von mir nur ein Test!!!!!!! Bitte bescheid sagen ob's geht. Ich hab leider kein TP, denn das geht nur mit TP:
Code: program Spieletest;
uses crt, graph;
VAR treiber, modus: Integer;
begin;
DetectGraph (treiber, modus);
InitGraph (treiber, modus, 'C:\Turbo\BGI\');{<----ZUM BEISPIEL!!!----<<<}
circle (200, 300, 40);
while readkey = 'd' do
begin
clrscr;
circle (210, 300, 40);
end;
{------------------------------------------------}
while readkey = 'a' do
begin
clrscr;
circle (200, 300, 40);
end;
{------------------------------------------------}
while readkey = 'w' do
begin
clrscr;
circle (200, 310);
end;
{------------------------------------------------}
while readkey = 's' do
begin
clrscr;
circle (200, 300);
end;
{------------------------------------------------}
closegraph;
readkey;
end.
Ich weiss das das ein behämmertes Beispiel ist!!! Wenn man die taste 'd' drückt, geht ein kreis nach rechts, und so weiter...
vpascal - 10.04.2007, 21:01
doch, ich hab jetzt Tp aber das Spiel ist kacke. Ist ja nur ne Demonstration, kein richtiges Spiel. Bitte um viele, viele Verbesserungsvorschläge!!!
Dragorad - 10.04.2007, 22:04
Hab's mal soweit überarbeitet, dass man den Kreis in jede Richtung bewegen kann. Eine Geschwindigkeitskontrolle folgt ...
Code: program Spieletest;
uses crt,graph;
VAR treiber,modus,x,y:Integer;
begin DetectGraph(treiber,modus);
InitGraph(treiber,modus,'C:\Turbo\BGI\');{<----ZUM BEISPIEL!!!----<<<}
x:=200;
y:=300;
circle(x,y,40);
repeat
while readkey='d' do
begin
setcolor(black);
circle(x,y,40);
x:=x+1;
setcolor(white);
circle(x,y,40);
end;
while readkey='a' do
begin
setcolor(black);
circle(x,y,40);
x:=x-1;
setcolor(white);
circle(x,y,40);
end;
while readkey='w' do
begin
setcolor(black);
circle(x,y,40);
y:=y-1;
setcolor(white);
circle(x,y,40);
end;
while readkey='s' do
begin
setcolor(black);
circle(x,y,40);
y:=y+1;
setcolor(white);
circle(x,y,40);
end;
until (readkey<>'w') and (readkey<>'a') and (readkey<>'s') and (readkey<>'d');
closegraph;
end.
vpascal - 11.04.2007, 15:41
Cool! Vielen dank!
Dragorad - 11.04.2007, 19:12
Hier die Version mit der Geschwindigkeit (ist aber noch nicht ganz ausgefeilt), außerdem kann der Kreis nicht mehr über'n Bildschirmrand hinaus verschwinden (aber nur wenn v=1). Habe auch zwei Units dazugemacht, wegen Vereinfachung (kann man aber auch in eine zusammenschmeißen).
PS: die udata muss als uneu gespeichert werden (oder in der ugraph die uneu durch udata ersetzen)
Code: program Spieletest;
uses crt,graph,ugraph;
VAR treiber,modus:integer;
r,v,x,y:integer;
{----------------------------------------------------------------------------}
begin DetectGraph(treiber,modus);
InitGraph(treiber,modus,'BGI\');
x:=320;
y:=240;
r:=10;
v:=1;
circle(x,y,r);
{------------------------------------------------------------------}
line(0,450,640,450);
schreib(10,460,'Dies ist eine Kugelsimulation. Bitte Geben Sie die Geschwindigkeit ein:');
readln(v);
{------------------------------------------------------------------}
repeat
while readkey='d' do
begin
setcolor(black);
circle(x,y,r);
if x<629 then x:=x+v
else x:=x;
setcolor(white);
circle(x,y,r);
end;
while readkey='a' do
begin
setcolor(black);
circle(x,y,r);
if x>11 then x:=x-v
else x:=x;
setcolor(white);
circle(x,y,r);
end;
while readkey='w' do
begin
setcolor(black);
circle(x,y,r);
if y>11 then y:=y-v
else y:=y;
setcolor(white);
circle(x,y,r);
end;
while readkey='s' do
begin
setcolor(black);
circle(x,y,r);
if y<439 then y:=y+v
else y:=y;
setcolor(white);
circle(x,y,r);
end;
until (readkey<>'w') and (readkey<>'a') and (readkey<>'s') and (readkey<>'d');
closegraph;
end.
Code: unit ugraph;
{----------------------------------------------------------------------------}
interface
uses crt,graph,uneu;
procedure schreib(x,y:integer;text:string);
procedure vg(x:integer);
procedure hg(x:integer);
{----------------------------------------------------------------------------}
implementation
procedure schreib(x,y:integer;text:string);
begin
settextstyle(1,0,1);
outtextxy(x,y,text);
end;
procedure vg(x:integer);
begin
setcolor(x);
if (x<0) or (x>15) then
begin
fehler;
halt;
end;
end;
procedure hg(x:integer);
begin
setbkcolor(x);
if (x<0) or (x>7) then
begin
fehler;
halt;
end;
end;
end.
Code: unit udata;
{----------------------------------------------------------------------------}
interface
uses crt;
procedure pinn(x,y:integer);
procedure writexy(x,y:byte;text:string);
procedure writexynr(x,y:byte;zahl:integer);
procedure openwindow(xl,yl,xr,yr:integer);
procedure openwindowende;
procedure programmende;
procedure stringlesen(var lesstr:string;maxlen:byte);
procedure fehler;
procedure laden;
{----------------------------------------------------------------------------}
implementation
procedure pinn(x,y:integer);
var richtig:boolean;
a:char;
k:integer;
wort:string;
begin
clrscr;
textcolor(white);
repeat
clrscr;
wort:='';
writexy(x,y,'PIN-Nummer:');
for k:=1 to 4 do
begin
a:=readkey;
writexy(x+11+k,y,'*');
wort:=wort+a;
end;
richtig:=wort='2927';
if richtig then
begin
textcolor(red+blink);
writexy(x+17,y,'OK');
delay(3000);
end
else
begin
writexy(x+17,y,'Fehleingabe');
delay(1000);
end;
textcolor(white);
until richtig;
textcolor(white);
end;
procedure writexy(x,y:byte;text:string);
begin
gotoxy(x,y);
write(text);
end;
procedure writexynr(x,y:byte;zahl:integer);
begin
gotoxy(x,y);
write(zahl);
end;
procedure openwindow(xl,yl,xr,yr:integer);
type zaehler=array[1..4] of byte;
var zahl:zaehler;
begin
writexy(xl,yl,'É');
writexy(xl,yr,'È');
writexy(xr,yl,'»');
writexy(xr,yr,'¼');
for zahl[1]:=xl+1 to xr-1 do writexy(zahl[1],yl,'Í');
for zahl[2]:=xl+1 to xr-1 do writexy(zahl[2],yr,'Í');
for zahl[3]:=yl+1 to yr-1 do writexy(xl,zahl[3],'º');
for zahl[4]:=yl+1 to yr-1 do writexy(xr,zahl[4],'º');
window(xl+1,yl+1,xr-1,yr-1);
end;
procedure openwindowende;
type zaehler=array[1..4] of byte;
var zahl:zaehler;
x,y:integer;
begin
x:=30;y:=8;
writexy(x,y,'É');
writexy(x,y+4,'È');
writexy(x+20,y,'»');
writexy(x+20,y+4,'¼');
for zahl[1]:=x+1 to x+19 do writexy(zahl[1],y,'Í');
for zahl[2]:=x+1 to x+19 do writexy(zahl[2],y+4,'Í');
for zahl[3]:=y+1 to y+3 do writexy(x,zahl[3],'º');
for zahl[4]:=y+1 to y+3 do writexy(x+20,zahl[4],'º');
window(x+1,y+1,x+19,y+3);
end;
procedure programmende;
begin
openwindowende;
clrscr;
writexy(2,2,' Wirklich beenden?');
writexy(2,4,' Ja Nein');
end;
procedure stringlesen(var lesstr:string;maxlen:byte);
const ret=#13;
var ch:char;
i,x,y:byte;
begin
x:=wherex;
y:=wherey;
lesstr:='';
repeat
gotoxy(x,y);
write(lesstr);
for i:=length(lesstr)+1 to maxlen do write('_');
gotoxy(x+length(lesstr),y);
ch:=readkey;
if (length(lesstr)<maxlen) and (ch<>ret) then lesstr:=lesstr+ch;
until ch=ret;
writeln;
end;
procedure fehler;
begin
sound(440);
delay(250);
nosound;
end;
procedure laden;
var vg,hg,x:integer;
begin
vg:=15;hg:=0;
textcolor(vg);
textbackground(hg);
clrscr;
writexy(30,14,'Daten werden geladen ...');
for x:=11 to 30 do
begin
textcolor(red);
writexy(x,12,'²');
delay(250);
end;
for x:=31 to 50 do
begin
textcolor(yellow);
writexy(x,12,'²');
delay(250);
end;
for x:= 51 to 70 do
begin
textcolor(green);
writexy(x,12,'²');
delay(250);
end;
textcolor(15);
end;
end.
vpascal - 11.04.2007, 20:17
Cool Danke, aber wie macht man Gegner? die sich frei bewegen und auch angreifen können? Das dürfte sehr schwierig sein, aber mit Pascal nicht unmöglich, denn Gegner gab es auch mit BASIC.
Dragorad - 11.04.2007, 20:19
Werd' mich mal ransetzen. Die Geschwindigkeit nehm' ich erstmal wieder raus.
vpascal - 11.04.2007, 20:27
wie kann man units mit tp tp-freundlich machen? Mit VP muss man die nur ausführen aber bei tp?
Dragorad - 11.04.2007, 21:07
äh, wie meinst du "tp-freundlich"? Wie man sie einbindet oder wie man sie erstellt?
Die .tpu-Datei musss im Verzeichnis von TP sein, sonst funzt's net.
vpascal - 13.04.2007, 10:00
Muss man die unit nur compilieren???
Dragorad - 13.04.2007, 22:03
Ganz genau. Es muss außerdem so eingestellt sein, wie man bei der Erstellung einer .exe das einstellt.
vpascal - 14.04.2007, 08:50
achso, ok. Wie kann man den gegner machen? while readkey ='s' do circle (???,???,??); circle (???,???,??) oder so?
das wenn man eine bewegung macht dder gegner auch eine macht???
Dragorad - 14.04.2007, 08:57
Ich hab' angefangen, einen Multiplayermodus zu erstellen, dass man mit WASD den Spieler steuert und ein zweiter mit PLÖÄ den Gegner (klappt aber noch nicht ganz richtig). Eine Möglichkeit wäre dann noch eine Art rundenbasierendes Spiel (erst macht der Speier eine best. Anzahl von Schritten, dann der Gegner, dann der Spieler,...).
vpascal - 14.04.2007, 13:04
Achso, das wäre gut. Aber ich will wissen wie man KI's macht... geht das mit Pascal???
Dragorad - 14.04.2007, 22:24
Kann man sicherlich Über'n Zufall machen, oder mit Wahrscheinlichkeitsberechnungen - muss ich mal ausprobieren.
vpascal - 15.04.2007, 11:40
aha
Mit folgendem Code, können Sie den Beitrag ganz bequem auf ihrer Homepage verlinken