pascal語言可以編寫游戲么
① pascal編程語言 編一個魔塔游戲
http://tieba..com/p/2254936209
誰說做不出來的。。這是我寫的,暫時沒寫完,不過已經能玩到33層了
② 游戲一般用什麼編程語言開發
一般的大型游戲開發不是單一用某一種軟體語言的問題。一個大型游戲的開發需要非常大的團隊用各種各樣的語言和工具來完成。
總結一下主要有C/C++,匯編語言,著色器語言,腳本語言,高效的開發語言C#或Java。
首先一般的游戲開發架構(Windows平台)從底到頂一般是Direct X™——游戲引擎——游戲。
大型游戲開發的大部分工作其實都是在編寫游戲腳本,腳本是大型游戲得以如此高速開發和發布的主要原因。腳本化的開發讓游戲開發擺脫了硬編碼的種種弊端,讓游戲內容可以輕易的修改和調試。比如比較流行的語言。,然後編寫腳本將其組織成一個游戲,不需要什麼底層的編程語言。
Windows平台比較流行的方法是使用最新版本的Visual Studio,顯卡廠商如NVIDIA也會為VS開發一些插件來簡化顯卡編程和調試。(2)pascal語言可以編寫游戲么擴展閱讀:
匯編語言
為了克服機器語言難讀、難編、難記和易出錯的缺點,人們就用與代碼指令實際含義相近的英文縮寫詞、字母和數字等符號來取代指令代碼(如用ADD表示運算符號「+」的機器代碼),於是就產生了匯編語言。所以說,匯編語言是一種用助記符表示的仍然面向機器的計算機語言。匯編語言亦稱符號語言。
匯編語言由於是採用了助記符號來編寫程序,比用機器語言的二進制代碼編程要方便些,在一定程度上簡化了編程過程。匯編語言的特點是用符號代替了機器指令代碼。而且助記符與指令代碼一一對應,基本保留了機器語言的靈活性。使用匯編語言能面向機器並較好地發揮機器的特性,得到質量較高的程序。
匯編語言中由於使用了助記符號,用匯編語言編制的程序送入計算機,計算機不能象用機器語言編寫的程序一樣直接識別和執行,必須通過預先放入計算機的 「匯編程序「的加工和翻譯,才能變成能夠被計算機識別和處理的二進制代碼程序。
用匯編語言等非機器語言書寫好的符號程序稱源程序,運行時匯編程序要將源程序翻譯成目標程序。目標程序是機器語言程序,它一經被安置在內存的預定位置上,就能被計算機的CPU處理和執行。
匯編語言像機器指令一樣,是硬體操作的控制信息,因而仍然是面向機器的語言,使用起來還是比較繁瑣費時,通用性也差。匯編語言是低級語言。但是,匯編語言用來編制系統軟體和過程式控制制軟體,其目標程序佔用內存空間少,運行速度快,有著高級語言不可替代的用途。
高級語言
不論是機器語言還是匯編語言都是面向硬體的具體操作的,語言對機器的過分依賴,要求使用者必須對硬體結構及其工作原理都十分熟悉,這對非計算機專業人員是難以做到的,對於計算機的推廣應用是不利的。計算機事業的發展,促使人們去尋求一些與人類自然語言相接近且能為計算機所接受的語意確定、規則明確、自然直觀和通用易學的計算機語言。
這種與自然語言相近並為計算機所接受和執行的計算機語言稱高級語言。高級語言是面向用戶的語言。無論何種機型的計算機,只要配備上相應的高級語言的編譯或解釋程序,則用該高級語言編寫的程序就可以通用。
如今被廣泛使用的高級語言有BASIC、PASCAL、C、COBOL、FORTRAN、LOGO以及VC、VB等。這些語言都是屬於系統軟體。
計算機並不能直接地接受和執行用高級語言編寫的源程序,源程序在輸入計算機時,通過「翻譯程序」翻譯成機器語言形式的目標程序,計算機才能識別和執行。這種「翻譯」通常有兩種方式,即編譯方式和解釋方式。
編譯方式是:事先編好一個稱為編譯程序的機器語言程序,作為系統軟體存放在計算機內,當用戶由高級語言編寫的源程序輸入計算機後,編譯程序便把源程序整個地翻譯成用機器語言表示的與之等價的目標程序,然後計算機再執行該目標程序,以完成源程序要處理的運算並取得結果。解釋方式是:源程序進入計算機時,解釋程序邊掃描邊解釋作逐句輸入逐句翻譯,計算機一句句執行,並不產生目標程序。
PASCAL、 FORTRAN、COBOL等高級語言執行編譯方式;BASIC語言則以執行解釋方式為主;而PASCAL、C語言是能書寫編譯程序的高級程序設計語言。每一種高級(程序設計)語言,都有自己人為規定的專用符號、英文單詞、語法規則和語句結構(書寫格式)。高級語言與自然語言(英語)更接近,而與硬體功能相分離(徹底脫離了具體的指令系統),便於廣大用戶掌握和使用。高級語言的通用性強,兼容性好,便於移植
③ 用pascal怎麼做游戲啊
先送你一個猜數游戲:
program c_k;
var a,b,c:integer;
begin
randomize;
a:=random(100);
c:=0;
repeat
c:=c+1;
write('please input b:');
readln(b);
if b>a then writeln('Too big')
else if b<a then writeln('Too small')
else if b=a tehn writeln('you are right');
until (c=10) or (a=b);
if c=10 then writeln('you false,the number is:',a);
readln;readln;
end.
再送你一個坦克大戰程序:
program tanke;
uses crt,graph;
type
type1=record
h,l,f:integer;
end;
time=record
ms,s,m:integer;
end;
const fx:array[1..4,1..2] of -1..1=((-1,0),(0,-1),(1,0),(0,1));
var t:time;
tank:type1;
bomb:array[1..20]of type1;
diren:array[1..8]of type1;
fire:array[1..20]of type1;
u,d,l,r,gu,gd,gl,gr:char;
lf:boolean;
procere initg;
var gd,gm:integer;
begin
gd:=detect;
initgraph(gd,gm,'');
end;
procere pushtype1(l,h,f:integer;var a:array of type1);
var i:integer;
begin
for i:=1 to high(a) do
if a[i].f<=0 then
begin
a[i].h:=h;a[i].l:=l;a[i].f:=f;
exit;
end;
end;
procere print;
var i,j:integer;
begin
setfillstyle(white,1);
bar(0,0,600,400);
for i:=1 to high(fire) do
with fire[i] do
if f>0 then
begin
setcolor(red);
line(l*40-20,h*40-20,l*40-1,h*40-1);
line(l*40-20,h*40-20,l*40-1,h*40-10);
line(l*40-20,h*40-20,l*40-1,h*40-20);
line(l*40-20,h*40-20,l*40-1,h*40-30);
line(l*40-20,h*40-20,l*40-1,h*40-40);
line(l*40-20,h*40-20,l*40-40,h*40-1);
line(l*40-20,h*40-20,l*40-40,h*40-10);
line(l*40-20,h*40-20,l*40-40,h*40-20);
line(l*40-20,h*40-20,l*40-40,h*40-30);
line(l*40-20,h*40-20,l*40-40,h*40-40);
line(l*40-20,h*40-20,l*40-20,h*40-1);
line(l*40-20,h*40-20,l*40-30,h*40-1);
line(l*40-20,h*40-20,l*40-10,h*40-40);
line(l*40-20,h*40-20,l*40-10,h*40-1);
line(l*40-20,h*40-20,l*40-20,h*40-40);
line(l*40-20,h*40-20,l*40-30,h*40-40);
end;
for i:=1 to high(bomb) do
with bomb[i] do
if f>0 then
begin
setcolor(blue);
circle((l-1)*40+20,(h-1)*40+20,5);
end;
for i:=1 to high(diren) do
with diren[i] do
if f>0 then
begin
setcolor(11);
line((l-1)*40+5,(h-1)*40+1,(l-1)*40+15,(h-1)*40+10);
line((l-1)*40+15,(h-1)*40+10,(l-1)*40+10,(h-1)*40+15);
line((l-1)*40+10,(h-1)*40+15,(l-1)*40+1,(h-1)*40+5);
line((l-1)*40+1,(h-1)*40+5,(l-1)*40+5,(h-1)*40+1);
line((l-1)*40+35,(h-1)*40+1,(l-1)*40+25,(h-1)*40+10);
line((l-1)*40+25,(h-1)*40+10,(l-1)*40+30,(h-1)*40+15);
line((l-1)*40+30,(h-1)*40+15,(l-1)*40+40,(h-1)*40+5);
line((l-1)*40+40,(h-1)*40+5,(l-1)*40+35,(h-1)*40+1);
line((l-1)*40+5,(h-1)*40+40,(l-1)*40+15,(h-1)*40+30);
line((l-1)*40+15,(h-1)*40+30,(l-1)*40+10,(h-1)*40+25);
line((l-1)*40+10,(h-1)*40+25,(l-1)*40+1,(h-1)*40+35);
line((l-1)*40+1,(h-1)*40+35,(l-1)*40+5,(h-1)*40+40);
line((l-1)*40+35,(h-1)*40+40,(l-1)*40+25,(h-1)*40+30);
line((l-1)*40+25,(h-1)*40+30,(l-1)*40+30,(h-1)*40+25);
line((l-1)*40+30,(h-1)*40+25,(l-1)*40+40,(h-1)*40+35);
line((l-1)*40+40,(h-1)*40+35,(l-1)*40+35,(h-1)*40+40);
line((l-1)*40+15,(h-1)*40+10,(l-1)*40+25,(h-1)*40+10);
line((l-1)*40+30,(h-1)*40+15,(l-1)*40+30,(h-1)*40+25);
line((l-1)*40+10,(h-1)*40+15,(l-1)*40+15,(h-1)*40+25);
line((l-1)*40+15,(h-1)*40+30,(l-1)*40+25,(h-1)*40+30);
setcolor(red);
circle((l-1)*40+20,(h-1)*40+20,6);
end;
with tank do
begin
if f>0 then setcolor(green)
else setcolor(red);
case f of
0,1:begin
setcolor(green);
line((l-1)*40+1,(h-1)*40+10,(l-1)*40+1,(h-1)*40+40);
line((l-1)*40+10,(h-1)*40+10,(l-1)*40+10,(h-1)*40+40);
line((l-1)*40+1,(h-1)*40+10,(l-1)*40+10,(h-1)*40+10);
line((l-1)*40+1,(h-1)*40+40,(l-1)*40+10,(h-1)*40+40);
line((l-1)*40+30,(h-1)*40+10,(l-1)*40+30,(h-1)*40+40);
line((l-1)*40+40,(h-1)*40+10,(l-1)*40+40,(h-1)*40+40);
line((l-1)*40+30,(h-1)*40+10,(l-1)*40+40,(h-1)*40+10);
line((l-1)*40+30,(h-1)*40+40,(l-1)*40+40,(h-1)*40+40);
line((l-1)*40+10,(h-1)*40+15,(l-1)*40+30,(h-1)*40+15);
line((l-1)*40+10,(h-1)*40+35,(l-1)*40+30,(h-1)*40+35);
line((l-1)*40+1,(h-1)*40+20,(l-1)*40+10,(h-1)*40+20);
line((l-1)*40+1,(h-1)*40+30,(l-1)*40+10,(h-1)*40+30);
line((l-1)*40+30,(h-1)*40+20,(l-1)*40+40,(h-1)*40+20);
line((l-1)*40+30,(h-1)*40+30,(l-1)*40+40,(h-1)*40+30);
line((l-1)*40+15,(h-1)*40+1,(l-1)*40+25,(h-1)*40+1);
line((l-1)*40+15,(h-1)*40+1,(l-1)*40+15,(h-1)*40+15);
line((l-1)*40+25,(h-1)*40+1,(l-1)*40+25,(h-1)*40+15);
circle((l-1)*40+20,(h-1)*40+25,5);
end;
2:begin
line((l-1)*40+10,(h-1)*40+1,(l-1)*40+40,(h-1)*40+1);
line((l-1)*40+10,(h-1)*40+10,(l-1)*40+40,(h-1)*40+10);
line((l-1)*40+10,(h-1)*40+1,(l-1)*40+10,(h-1)*40+10);
line((l-1)*40+40,(h-1)*40+1,(l-1)*40+40,(h-1)*40+10);
line((l-1)*40+10,(h-1)*40+30,(l-1)*40+40,(h-1)*40+30);
line((l-1)*40+10,(h-1)*40+40,(l-1)*40+40,(h-1)*40+40);
line((l-1)*40+10,(h-1)*40+30,(l-1)*40+10,(h-1)*40+40);
line((l-1)*40+40,(h-1)*40+30,(l-1)*40+40,(h-1)*40+40);
line((l-1)*40+15,(h-1)*40+10,(l-1)*40+15,(h-1)*40+30);
line((l-1)*40+35,(h-1)*40+10,(l-1)*40+35,(h-1)*40+30);
line((l-1)*40+20,(h-1)*40+1,(l-1)*40+20,(h-1)*40+10);
line((l-1)*40+30,(h-1)*40+1,(l-1)*40+30,(h-1)*40+10);
line((l-1)*40+20,(h-1)*40+30,(l-1)*40+20,(h-1)*40+40);
line((l-1)*40+30,(h-1)*40+30,(l-1)*40+30,(h-1)*40+40);
line((l-1)*40+1,(h-1)*40+15,(l-1)*40+1,(h-1)*40+25);
line((l-1)*40+1,(h-1)*40+15,(l-1)*40+15,(h-1)*40+15);
line((l-1)*40+1,(h-1)*40+25,(l-1)*40+15,(h-1)*40+25);
circle((l-1)*40+25,(h-1)*40+20,5);
end;
3:begin
setcolor(green);
line((l-1)*40+40,(h-1)*40+30,(l-1)*40+40,(h-1)*40+1);
line((l-1)*40+30,(h-1)*40+30,(l-1)*40+30,(h-1)*40+1);
line((l-1)*40+40,(h-1)*40+30,(l-1)*40+30,(h-1)*40+30);
line((l-1)*40+40,(h-1)*40+1,(l-1)*40+30,(h-1)*40+1);
line((l-1)*40+40,(h-1)*40+1,(l-1)*40+30,(h-1)*40+1);
line((l-1)*40+10,(h-1)*40+30,(l-1)*40+10,(h-1)*40+1);
line((l-1)*40+1,(h-1)*40+30,(l-1)*40+1,(h-1)*40+1);
line((l-1)*40+10,(h-1)*40+30,(l-1)*40+1,(h-1)*40+30);
line((l-1)*40+10,(h-1)*40+1,(l-1)*40+1,(h-1)*40+1);
line((l-1)*40+30,(h-1)*40+25,(l-1)*40+10,(h-1)*40+25);
line((l-1)*40+30,(h-1)*40+25,(l-1)*40+10,(h-1)*40+25);
line((l-1)*40+30,(h-1)*40+5,(l-1)*40+10,(h-1)*40+5);
line((l-1)*40+40,(h-1)*40+20,(l-1)*40+30,(h-1)*40+20);
line((l-1)*40+40,(h-1)*40+10,(l-1)*40+30,(h-1)*40+10);
line((l-1)*40+10,(h-1)*40+20,(l-1)*40+1,(h-1)*40+20);
line((l-1)*40+10,(h-1)*40+10,(l-1)*40+1,(h-1)*40+10);
line((l-1)*40+25,(h-1)*40+40,(l-1)*40+15,(h-1)*40+40);
line((l-1)*40+25,(h-1)*40+40,(l-1)*40+25,(h-1)*40+25);
line((l-1)*40+15,(h-1)*40+40,(l-1)*40+15,(h-1)*40+25);
circle((l-1)*40+20,(h-1)*40+15,5);
end;
4:begin
setcolor(green);
line((l-1)*40+30,(h-1)*40+40,(l-1)*40+1,(h-1)*40+40);
line((l-1)*40+30,(h-1)*40+30,(l-1)*40+1,(h-1)*40+30);
line((l-1)*40+30,(h-1)*40+40,(l-1)*40+30,(h-1)*40+30);
line((l-1)*40+1,(h-1)*40+40,(l-1)*40+1,(h-1)*40+30);
line((l-1)*40+30,(h-1)*40+10,(l-1)*40+1,(h-1)*40+10);
line((l-1)*40+30,(h-1)*40+1,(l-1)*40+1,(h-1)*40+1);
line((l-1)*40+30,(h-1)*40+10,(l-1)*40+30,(h-1)*40+1);
line((l-1)*40+1,(h-1)*40+10,(l-1)*40+1,(h-1)*40+1);
line((l-1)*40+25,(h-1)*40+30,(l-1)*40+25,(h-1)*40+10);
line((l-1)*40+5,(h-1)*40+30,(l-1)*40+5,(h-1)*40+10);
line((l-1)*40+20,(h-1)*40+40,(l-1)*40+20,(h-1)*40+30);
line((l-1)*40+10,(h-1)*40+40,(l-1)*40+10,(h-1)*40+30);
line((l-1)*40+20,(h-1)*40+10,(l-1)*40+20,(h-1)*40+1);
line((l-1)*40+10,(h-1)*40+10,(l-1)*40+10,(h-1)*40+1);
line((l-1)*40+40,(h-1)*40+25,(l-1)*40+40,(h-1)*40+15);
line((l-1)*40+40,(h-1)*40+25,(l-1)*40+25,(h-1)*40+25);
line((l-1)*40+40,(h-1)*40+15,(l-1)*40+25,(h-1)*40+15);
circle((l-1)*40+15,(h-1)*40+20,5);
end;
end;{case}
end;{with}
end;
procere runtank(ch:char);
begin
case ch of
'i':if tank.h>1 then dec(tank.h);
'k':if tank.h<10 then inc(tank.h);
'j':if tank.l>1 then dec(tank.l);
'l':if tank.l<15 then inc(tank.l);
'8':tank.f:=1;
'4':tank.f:=2;
'5':tank.f:=3;
'6':tank.f:=4;
'0':pushtype1(tank.l,tank.h,tank.f,bomb);
'q':halt;
end;
end;
function win:boolean;
var i:integer;
begin
for i:=1 to high(diren) do
if diren[i].f>0 then begin win:=false;exit;end;
win:=true;
end;
function lost:boolean;
var i:integer;
begin
for i:=1 to high(diren) do
if (diren[i].h=tank.h) and (diren[i].l=tank.l) and (diren[i].f>0) then
begin lost:=true;exit;end;
lost:=false;
end;
procere runbomb;
var i,hh,hl:integer;
begin
for i:=1 to high(bomb) do
with bomb[i] do
if f>0 then
begin
hh:=hh+fx[f,1];
hl:=l+fx[f,2];
if(hl in [1..15])and
(hh in [1..10]) then
begin
h:=hh;
l:=hl;
end
else begin f:=0;pushtype1(l,h,5,fire);end;
end;
end;
procere runfire;
var i:integer;
begin
for i:=1 to high(fire) do
begin
if fire[i].f>0 then dec(fire[i].f);
end;
end;
procere rundiren;
var s:set of 1..4;
i,j,k,hh1,hh2,hl1,hl2:integer;
begin
for i:=1 to high(diren) do
with diren[i] do
if f>0 then
begin
if h>tank.h then dec(h)
else if h<tank.h then inc(h);
if l<tank.l then inc(l)
else if l>tank.l then dec(l);
end;
end;
procere check;
var i,j:integer;
begin
for i:=1 to high(diren) do
with diren[i] do
if f>0 then
begin
for j:=1 to high(bomb) do
if (bomb[j].h=h) and (bomb[j].l=l) and (bomb[j].f>0)
and ((bomb[j].h<>tank.h) or (bomb[j].l<>tank.l)) then
begin
bomb[j].f:=0;f:=0;break;
end;
end;
end;
procere inittank;
var y:integer;
ch:char;
begin
settextstyle(7,horizdir,6);
setcolor(white);
outtextxy(10,10,'Tank2:Crazy tank');
settextstyle(1,horizdir,1);
y:=100;
outtextxy(50,y,'Mase by WangYu');
inc(y,textheight('H')+1);
outtextxy(50,y,'Ctrl key:');
inc(y,textheight('H')+1);
outtextxy(50,y,'Up:i Left:j Right:l Down:k Exit:q');
inc(y,textheight('H')+1);
outtextxy(50,y,'GunUp:8 GunLeft:4 GunRight:6 Fire:0');
inc(y,textheight('H')+100);
outtextxy(50,y,'Pressed Enter to continue');
repeat ch:=readkey;until ch=#13;
end;
procere init(ds:integer);
var i:integer;
st:string;
begin
fillchar(t,sizeof(t),0);
fillchar(diren,sizeof(diren),0);
fillchar(fire,sizeof(fire),0);
fillchar(bomb,sizeof(bomb),0);
tank.h:=5;tank.l:=8;tank.f:=1;
with diren[1] do begin h:=1;l:=7;f:=0;end;
with diren[2] do begin h:=10;l:=7;f:=0;end;
with diren[3] do begin h:=1;l:=1;f:=0;end;
with diren[4] do begin h:=10;l:=15;f:=0;end;
with diren[5] do begin h:=1;l:=15;f:=0;end;
with diren[6] do begin h:=10;l:=1;f:=0;end;
with diren[7] do begin h:=6;l:=1;f:=0;end;
with diren[8] do begin h:=6;l:=15;f:=0;end;
for i:=1 to ds do diren[i].f:=1;
str(ds,st);
print;
setcolor(black);
outtextxy(200,200,'Level'+st);
readkey;
end;
procere main;
var ch:char;
begin
while not lost and not win do
begin
delay(50);
with t do
begin
inc(ms,50);
if ms>=1000 then
begin
ms:=0;
inc(s);
if s>=60 then
s:=0;
inc(m);
end;
end;
if keypressed then
begin
ch:=readkey;
runtank(ch);
end;
if t.ms mod 200=0 then rundiren;
if t.ms mod 100=0 then check;
if t.ms mod 100=0 then begin runbomb;lf:=true;end;
if t.ms mod 100=0 then runfire;
print;
end;
setcolor(black);
if win then outtextxy(200,200,'You win!!!')
else outtextxy(200,200,'You lost!!!');
repeat
ch:=readkey;
until ch=#13;
end;
var level:integer;
begin
initg;
inittank;
for level:=1 to 8 do
begin
init(level);
main;
if lost then dec(level);
end;
end.
④ 游戲編程的問題
紅警一類的 可以用RPGmaker軟體做,或者學習windows游戲編程大師技巧一書,不過上面的例子是C/C++的,環境是VC++6.0. VB之類的游戲,不如用flash的Action語言做.Action和C#差不多,應該很容易入門.
但是,如果你是一位象我一樣想投身游戲開發行業的程序員的話,不如一起學習C/C++,windows游戲編程大師技巧,DirectX游戲編程等內容.
以下摘自別人文章:
1、C語言
如果說FORTRAN和COBOL是第一代高級編譯語言,那麼C語言就是它們的孫子輩。C語言是Dennis Ritchie在七十年代創建的,它功能更強大且與ALGOL保持更連續的繼承性,而ALGOL則是COBOL和FORTRAN的結構化繼承者。C語言被設計成一個比它的前輩更精巧、更簡單的版本,它適於編寫系統級的程序,比如操作系統。在此之前,操作系統是使用匯編語言編寫的,而且不可移植。C語言是第一個使得系統級代碼移植成為可能的編程語言。
C語言支持結構化編程,也就是說C的程序被編寫成一些分離的函數呼叫(調用)的集合,這些呼叫是自上而下運行,而不像一個單獨的集成塊的代碼使用GOTO語句控制流程。因此,C程序比起集成性的FORTRAN及COBOL的「空心粉式代碼」代碼要簡單得多。事實上,C仍然具有GOTO語句,不過它的功能被限制了,僅當結構化方案非常復雜時才建議使用。
正由於它的系統編程根源,將C和匯編語言進行結合是相當容易的。函數調用介面非常簡單,而且匯編語言指令還能內嵌到C代碼中,所以,不需要連接獨立的匯編模塊。
優點:有益於編寫小而快的程序。很容易與匯編語言結合。具有很高的標准化,因此其他平台上的各版本非常相似。
缺點:不容易支持面向對象技術。語法有時會非常難以理解,並造成濫用。
移植性:C語言的核心以及ANSI函數調用都具有移植性,但僅限於流程式控制制、內存管理和簡單的文件處理。其他的東西都跟平台有關。比如說,為Windows和Mac開發可移植的程序,用戶界面部分就需要用到與系統相關的函數調用。這一般意味著你必須寫兩次用戶界面代碼,不過還好有一些庫可以減輕工作量。
用C語言編寫的游戲:非常非常多。
資料:C語言的經典著作是《The C Programming Language》,它經過多次修改,已經擴展到最初的三倍大,但它仍然是介紹C的優秀書本。一本極好的教程是《The Waite Group's C Primer Plus》。
2、C++
C++語言是具有面向對象特性的C語言的繼承者。面向對象編程,或稱OOP是結構化編程的下一步。OO程序由對象組成,其中的對象是數據和函數離散集合。有許多可用的對象庫存在,這使得編程簡單得只需要將一些程序「建築材料」堆在一起(至少理論上是這樣)。比如說,有很多的GUI和資料庫的庫實現為對象的集合。
C++總是辯論的主題,尤其是在游戲開發論壇里。有幾項C++的功能,比如虛擬函數,為函數呼叫的決策制定增加了一個額外層次,批評家很快指出C++程序將變得比相同功能的C程序來得大和慢。C++的擁護者則認為,用C寫出與虛擬函數等價的代碼同樣會增加開支。這將是一個還在進行,而且不可能很快得出結論的爭論。
我認為,C++的額外開支只是使用更好的語言的小付出。同樣的爭論發生在六十年代高級程序語言如COBOL和FORTRAN開始取代匯編成為語言所選的時候。批評家正確的指出使用高級語言編寫的程序天生就比手寫的匯編語言來得慢,而且必然如此。而高級語言支持者認為這么點小小的性能損失是值得的,因為COBOL和FORTRAN程序更容易編寫和維護。
優點:組織大型程序時比C語言好得多。很好的支持面向對象機制。通用數據結構,如鏈表和可增長的陣列組成的庫減輕了由於處理低層細節的負擔。
缺點:非常大而復雜。與C語言一樣存在語法濫用問題。比C慢。大多數編譯器沒有把整個語言正確的實現。
移植性:比C語言好多了,但依然不是很樂觀。因為它具有與C語言相同的缺點,大多數可移植性用戶界面庫都使用C++對象實現。
使用C++編寫的游戲:非常非常多。大多數的商業游戲是使用C或C++編寫的。
資料:最新版的《The C++ Programming Language》非常好。作為教程,有兩個陣營,一個假定你知道C,另外一個假定你不知道。到目前為止,最好的C++教程是《Who's Afraid of C++》,如果你已經熟知C,那麼試一下《Teach Yourself C++》。
3、我該學習C++或是該從C開始
我不喜歡這種說法,但它是繼「我該使用哪門語言」之後最經常被問及的問題。很不幸,不存在標准答案。你可以自學C並使用它來寫程序,從而節省一大堆的時間,不過使用這種方法有兩個弊端:
你將錯過那些面向對象的知識,因為它可能在你的游戲中使得數據建模更有效率的東西。
最大的商業游戲,包括第一人稱射擊游戲很多並沒有使用C++。但是,這些程序的作者即使使用老的C的格式,他們通常堅持使用面向對象編程技術。如果你只想學C,至少要自學OO(面向對象)編程技術。OO是模擬(游戲)的完美方法,如果你不學習OO,你將不得不「辛苦」的工作。
4、匯編語言
顯然,匯編是第一個計算機語言。匯編語言實際上是你計算機處理器實際運行的指令的命令形式表示法。這意味著你將與處理器的底層打交道,比如寄存器和堆棧。如果你要找的是類英語且有相關的自我說明的語言,這不是你想要的。
確切的說,任何你能在其他語言里做到的事情,匯編都能做,只是不那麼簡單 — 這是當然,就像說你既可以開車到某個地方,也可以走路去,只是難易之分。話雖不錯,但是新技術讓東西變得更易於使用。
總的來說,匯編語言不會在游戲中單獨應用。游戲使用匯編主要是使用它那些能提高性能的零零碎碎的部分。比如說,毀滅戰士整體使用C來編寫,有幾段繪圖程序使用匯編。這些程序每秒鍾要調用數千次,因此,盡可能的簡潔將有助於提高游戲的性能。而從C里調用匯編寫的函數是相當簡單的,因此同時使用兩種語言不成問題。
特別注意:語言的名字叫「匯編」。把匯編語言翻譯成真實的機器碼的工具叫「匯編程序」。把這門語言叫做「匯編程序」這種用詞不當相當普遍,因此,請從這門語言的正確稱呼作為起點出發。
優點:最小、最快的語言。匯編高手能編寫出比任何其他語言能實現的快得多的程序。你將是利用處理器最新功能的第一人,因為你能直接使用它們。
缺點:難學、語法晦澀、堅持效率,造成大量額外代碼 — 不適於心臟虛弱者。
移植性:接近零。因為這門語言是為一種單獨的處理器設計的,根本沒移植性可言。如果使用了某個特殊處理器的擴展功能,你的代碼甚至無法移植到其他同類型的處理器上(比如,AMD的3DNow指令是無法移植到其它奔騰系列的處理器上的)。
使用匯編編寫的游戲:我不知道有什麼商業游戲是完全用匯編開發的。不過有些游戲使用匯編完成多數對時間要求苛刻的部分。
資料:如果你正在找一門匯編語言的文檔,你主要要找晶元的文檔。網路上如Intel、AMD、Motorola等有一些關於它們的處理器的資料。對於書籍而言,《Assembly Language: Step-By-Step》是很值得學習的。
5、Pascal語言
Pascal語言是由Nicolas Wirth在七十年代早期設計的,因為他對於FORTRAN和COBOL沒有強制訓練學生的結構化編程感到很失望,「空心粉式代碼」變成了規范,而當時的語言又不反對它。Pascal被設計來強行使用結構化編程。最初的Pascal被嚴格設計成教學之用,最終,大量的擁護者促使它闖入了商業編程中。當Borland發布IBM PC上的 Turbo Pascal時,Pascal輝煌一時。集成的編輯器,閃電般的編譯器加上低廉的價格使之變得不可抵抗,Pascal編程了為MS-DOS編寫小程序的首選語言。
然而時日不久,C編譯器變得更快,並具有優秀的內置編輯器和調試器。Pascal在1990年Windows開始流行時走到了盡頭,Borland放棄了Pascal而把目光轉向了為Windows 編寫程序的C++。Turbo Pascal很快被人遺忘。
最後,在1996年,Borland發布了它的「Visual Basic殺手」— Delphi。它是一種快速的帶華麗用戶界面的 Pascal編譯器。由於不懈努力,它很快贏得了一大群愛好者。
基本上,Pascal比C簡單。雖然語法類似,它缺乏很多C有的簡潔操作符。這既是好事又是壞事。雖然很難寫出難以理解的「聰明」代碼,它同時也使得一些低級操作,如位操作變得困難起來。
優點:易學、平台相關的運行(Delphi)非常好。
缺點:「世界潮流」面向對象的Pascal繼承者(Mola、Oberon)尚未成功。語言標准不被編譯器開發者認同。專利權。
移植性:很差。語言的功能由於平台的轉變而轉變,沒有移植性工具包來處理平台相關的功能。
使用Pascal編寫的游戲:幾個。DirectX的Delphi組件使得游戲場所變大了。
資料:查找跟Delphi有關的資料,請訪問:Inprise Delphi page。
6、Visual Basic
哈,BASIC。回到八十年代的石器時代,它是程序初學者的第一個語言。最初的BASIC形式,雖然易於學習,卻是可怕的無組織化,它義無反顧的使用了GOTO充斥的「空心粉式代碼」。當回憶起BASIC的行號和GOSUB命令,沒有幾個人能止住眼角的淚水。
快速前進到九十年代早期,雖然不是蘋果公司所希望的巨人,HyperCard仍然是一個在Windows下無法比擬的吸引人的小型編程環境。Windows下的HyperCard克隆品如ToolBook又慢又笨又昂貴。為了與HyperCard一決高下,微軟取得了一個小巧的名為Thunder編程環境的許可權,並把它作為Visual Basci 1.0發布,其用戶界面在當時非常具有新意。這門語言雖然還叫做Basic(不再是全部大寫),但更加結構化了,行號也被去除。實際上,這門語言與那些內置於TRS-80、Apple II及Atari里的舊的ROM BASIC相比,更像是帶Basic風格動詞的Pascal。
經過六個版本,Visual Basic變得非常漂亮。用戶界面發生了許多變化,但依然保留著「把代碼關聯到用戶界面」的主旨。這使得它在與即時編譯結合時變成了一個快速原型的優異環境。
優點:整潔的編輯環境。易學、即時編譯導致簡單、迅速的原型。大量可用的插件。雖然有第三方的DirectX插件,DirectX 7已准備提供Visual Basic的支持。
缺點:程序很大,而且運行時需要幾個巨大的運行時動態連接庫。雖然表單型和對話框型的程序很容易完成,要編寫好的圖形程序卻比較難。調用Windows的API程序非常笨拙,因為VB的數據結構沒能很好的映射到C中。有OO功能,但卻不是完全的面向對象。專利權。
移植性:非常差。因為Visual Basic是微軟的產品,你自然就被局限在他們實現它的平台上。也就是說,你能得到的選擇是:Windows,Windows或Widnows。當然,有一些工具能將VB程序轉變成Java。
使用Visual Basic編寫的游戲:一些。有很多使用VB編寫的共享游戲,還有一些是商業性的。
資料:微軟的VB頁面有一些信息。
7、Java
Java是由Sun最初設計用於嵌入程序的可移植性「小C++」。在網頁上運行小程序的想法著實吸引了不少人的目光,於是,這門語言迅速崛起。事實證明,Java不僅僅適於在網頁上內嵌動畫 — 它是一門極好的完全的軟體編程的小語言。「虛擬機」機制、垃圾回收以及沒有指針等使它很容易實現不易崩潰且不會泄漏資源的可靠程序。
雖然不是C++的正式續篇,Java從C++ 中借用了大量的語法。它丟棄了很多C++的復雜功能,從而形成一門緊湊而易學的語言。不像C++,Java強制面向對象編程,要在Java里寫非面向對象的程序就像要在Pascal里寫「空心粉式代碼」一樣困難。
優點:二進制碼可移植到其他平台。程序可以在網頁中運行。內含的類庫非常標准且極其健壯。自動分配合垃圾回收避免程序中資源泄漏。網上數量巨大的代碼常式。
缺點:使用一個「虛擬機」來運行可移植的位元組碼而非本地機器碼,程序將比真正編譯器慢。有很多技術(例如「即時」編譯器)很大的提高了Java的速度,不過速度永遠比不過機器碼方案。早期的功能,如AWT沒經過慎重考慮,雖然被正式廢除,但為了保持向後兼容不得不保留。越高級的技術,造成處理低級的機器功能越困難,Sun為這門語言增加新的「受祝福」功能的速度實在太慢。
移植性:最好的,但仍未達到它本應達到的水平。低級代碼具有非常高的可移植性,但是,很多UI及新功能在某些平台上不穩定。
使用Java編寫的游戲:網頁上有大量小的Applet,但僅有一些是商業性的。有幾個商業游戲使用Java作為內部腳本語言。
資料:Sun的官方Java頁面有一些好的信息。IBM也有一個非常好的Java頁面。JavaLobby是一個關於Java新聞的最好去處。
8、創作工具
上面所提及的編程語言涵蓋了大多數的商業游戲。但是也有一個例外,這個大游戲由於它的缺席而變得突出。
「神秘島」。沒錯,賣得最好的商業游戲不是使用以上任何一門語言編的,雖然有人說「神秘島」99%是使用 3D建模工具製作的,其根本的編程邏輯是在HyperCard里完成的。
多數創作工具有點像Visual Basic,只是它們工作在更高的層次上。大多數工具使用一些拖拉式的流程圖來模擬流程式控制制。很多內置解釋的程序語言,但是這些語言都無法像上面所說的單獨的語言那樣健壯。
優點:快速原型 — 如果你的游戲符合工具製作的主旨,你或許能使你的游戲跑得比使用其他語言快。在很多情況下,你可以創造一個不需要任何代碼的簡單游戲。使用插件程序,如Shockware及IconAuthor播放器,你可以在網頁上發布很多創作工具生成的程序。
缺點:專利權,至於將增加什麼功能,你將受到工具製造者的支配。你必須考慮這些工具是否能滿足你游戲的需要,因為有很多事情是那些創作工具無法完成的。某些工具會產生臃腫得可怕的程序。
移植性:因為創作工具是具有專利權的,你的移植性以他們提供的功能息息相關。有些系統,如Director可以在幾種平台上創作和運行,有些工具則在某一平台上創作,在多種平台上運行,還有的是僅能在單一平台上創作和運行。
使用創作工具編寫的游戲:「神秘島」和其他一些同類型的探險游戲。所有的Shockwave游戲都在網路上。
資料:Director、HyperCard、SuperCard、IconAuthor、Authorware。
9、易語言
★全中文支持,無需跨越英語門檻。★全可視化編程,支持所見即所得程序界面設計和程序流程編碼。★中文語句快速錄入。提供多種內嵌專用輸入法,徹底解決中文語句輸入速度慢的問題。★代碼即文檔。自動規范強制代碼格式轉換,任何人編寫的任何程序源代碼格式均統一。★參數引導技術,方便程序語句參數錄入。★無定義類關鍵字。所有程序定義部分均採用表格填表方式,用戶無需記憶此類關鍵字及其使用格式。★命令格式統一。所有程序語句調用格式完全一致。★語法格式自動檢查。自動檢查並提示所輸入語句的語法格式是否正確,且可自動添加各類名稱。★全程提示與幫助。滑鼠停留立即顯示相關項目提示。編程時提示語法格式,調試時提示變數當前內容,隨時按下F1鍵可得到與當前主題相關詳細幫助等。★名稱自動管理。用戶修改任一名稱定義,其它所有包含該名稱的程序代碼均自動修正。★集成化開發環境。集界面設計、代碼編寫、調試分析、編譯打包等於一體。★學習資源豐富。詳細的幫助文件、數十兆的知識庫、數萬用戶的網上論壇、教材已出版發行……
10、結論
你可能希望得到一個關於「我該使用哪種語言」這個問題的更標準的結論。非常不幸,沒有一個對所有應用程序都最佳的解決方案。C適於快而小的程序,但不支持面向對象的編程。C++完全支持面向對象,但是非常復雜。Visual Basic與Delphi易學,但不可移植且有專利權。Java有很多簡潔的功能,但是慢。創作工具可以以最快的速度產生你的程序,但是僅對某一些類型的程序起作用。最好的方法是決定你要寫什麼樣的游戲,並選擇對你的游戲支持最好的語言。「試用三十天」的做法成為工業標準是件好事情。
⑤ 如何用Pascal語言編程模擬剪刀、石頭、布游戲
{0=S 1=P 2=R}
program srp;
var ch:char;
num:integer;
begin
write('Please input your choice(S ,R or P):');
readln(ch);
randomize;
num:=random(3);
case ch of
'S','s':if num=0 then writeln('A TIE!')
else if num=1 then writeln('YOU WIN!')
else writeln('YOU LOSE!');
'R','r':if num=0 then writeln('YOU WIN!')
else if num=1 then writeln('YOU LOSE!')
else writeln('A TIE!');
'P','p':if num=0 then writeln('YOU LOSE!')
else if num=1 then writeln('A TIE!')
else writeln('YOU WIN!');
else writeln('PLEASE INPUT CORRECT LETTER!');
end;
readln;
end.
⑥ 怎麼用free pascal編游戲
當然可以了。編程序寫到手腕酸到時候敲一個游戲進去是最好不過到啦。
用pascal有一點點麻煩,但是也是可以輕松實現的。不過用delphi更方便。
用pascal可以用面向單元的程序,但是不怎麼好看。給你一點樣本代碼吧。
俄羅斯方塊:
USES Crt;
CONST
Change:Array [0..6,0..3,0..7] Of Byte =(((0,1,1,1,2,1,3,1),(1,0,1,1,1,2,1,3),(0,1,1,1,2,1,3,1),(1,0,1,1,1,2,1,3)),
((1,0,0,1,1,1,2,1),(1,0,1,1,1,2,2,1),(0,1,1,1,2,1,1,2),(1,0,0,1,1,1,1,2)),
((1,0,2,0,1,1,2,1),(1,0,2,0,1,1,2,1),(1,0,2,0,1,1,2,1),(1,0,2,0,1,1,2,1)),
((1,0,2,0,0,1,1,1),(0,0,0,1,1,1,1,2),(1,0,2,0,0,1,1,1),(0,0,0,1,1,1,1,2)),
((0,0,1,0,1,1,2,1),(1,0,0,1,1,1,0,2),(0,0,1,0,1,1,2,1),(1,0,0,1,1,1,0,2)),
((1,0,2,0,1,1,1,2),(0,0,0,1,1,1,2,1),(1,0,0,2,1,1,1,2),(2,2,0,1,1,1,2,1)),
((0,0,1,0,1,1,1,2),(2,0,0,1,1,1,2,1),(2,2,1,0,1,1,1,2),(0,2,0,1,1,1,2,1)));
VAR
Board:Array [0..3,0..11,1..25] Of Byte;
Players,N,Nowx,Nowy,Kind,Trans,Speed:Byte;
Time,Score:Word;
Now:Array [0..7] Of Byte;
PROCEDURE Furbish;
VAR B,C:Byte;
Begin
For C:=24 Downto 2 Do Begin
Gotoxy(1,C);
For B:=1 To 10 Do
If Board[0,B,C]=0 Then Write(' ')
Else Write('壙');
End;
End;
PROCEDURE Clear;
Var A,B,C:Byte;D:Boolean;
Begin
For A:=24 Downto 1 Do
Begin
D:=True;
For B:=1 To 10 Do
If Board[0,B,A]=0 Then D:=False;
If D=True Then
Begin
Score:=Score+10;Gotoxy(1,1);Write(Score:5,'0');
For C:=A Downto 2 Do
For B:=1 To 10 Do
Board[0,B,C]:=Board[0,B,C-1];
A:=A+1;
End;
End;
Furbish;
End;
FUNCTION Canmove(X,Y:Byte):Boolean;
BEGIN
Canmove:=True;
If Board[0,X+Now[0],Y+Now[1]]>0 Then Canmove:=False;
If Board[0,X+Now[2],Y+Now[3]]>0 Then Canmove:=False;
If Board[0,X+Now[4],Y+Now[5]]>0 Then Canmove:=False;
If Board[0,X+Now[6],Y+Now[7]]>0 Then Canmove:=False;
End;
PROCEDURE Clean;
Begin
Gotoxy((Nowx+Now[0])*2-1,Nowy+Now[1]);Write(' ');
Gotoxy((Nowx+Now[2])*2-1,Nowy+Now[3]);Write(' ');
Gotoxy((Nowx+Now[4])*2-1,Nowy+Now[5]);Write(' ');
Gotoxy((Nowx+Now[6])*2-1,Nowy+Now[7]);Write(' ');
End;
PROCEDURE Show;
Begin
Gotoxy((Nowx+Now[0])*2-1,Nowy+Now[1]);Write('壙');
Gotoxy((Nowx+Now[2])*2-1,Nowy+Now[3]);Write('壙');
Gotoxy((Nowx+Now[4])*2-1,Nowy+Now[5]);Write('壙');
Gotoxy((Nowx+Now[6])*2-1,Nowy+Now[7]);Write('壙');
End;
BEGIN
Fillchar(Board,Sizeof(Board),0);
Randomize;Score:=0;
For N:=1 To 24 Do
Board[0,0,N]:=1;
For N:=1 To 24 Do
Board[0,11,N]:=1;
For N:=1 To 10 Do
Board[0,N,25]:=1;
Window(31,2,50,25);Textcolor(White);Textbackground(Blue);
Clrscr;Window(31,2,51,25);
Speed:=1;
Kind:=Random(7);Trans:=Random(4);Nowx:=4;Nowy:=1;
For N:=0 To 7 Do
Now[N]:=Change[Kind,Trans,N];
While Canmove(Nowx,Nowy) Do
Begin
Repeat
Clean;Nowy:=Nowy+1;Show;
Repeat
If Keypressed Then
Case Upcase(Readkey) Of
#0:Case Readkey Of
#75:If Canmove(Nowx-1,Nowy) Then Begin Clean;Nowx:=Nowx-1;Show;End;
#77:If Canmove(Nowx+1,Nowy) Then Begin Clean;Nowx:=Nowx+1;Show;End;
#80:Begin Clean;Repeat
If Canmove(Nowx,Nowy+1) Then Nowy:=Nowy+1;
Until Not(Canmove(Nowx,Nowy+1));Show;End;
#61:Begin Gotoxy(9,12);Write('Pause');Repeat Delay(1000);Until Keypressed;Furbish;End;
End;
#27:Exit;
' ',#13:Begin
Clean;Trans:=Trans+1;
If Trans=4 Then Trans:=0;
For N:=0 To 7 Do
Now[N]:=Change[Kind,Trans,N];
If Not(Canmove(Nowx,Nowy)) Then Begin Trans:=Trans-1;For N:=0 To 7 Do
Now[N]:=Change[Kind,Trans,N];Show;End
Else Show;
End;
End;
Until Not(Keypressed);
Delay((10-Speed)*50);
Until Not(Canmove(Nowx,Nowy+1));
Score:=Score+1;Gotoxy(1,1);Write(Score:5,'0');Speed:=(Score Div 300)+1;
Board[0,Nowx+Now[0],Nowy+Now[1]]:=1;
Board[0,Nowx+Now[2],Nowy+Now[3]]:=1;
Board[0,Nowx+Now[4],Nowy+Now[5]]:=1;
Board[0,Nowx+Now[6],Nowy+Now[7]]:=1;
Clear;
Kind:=Random(7);Trans:=Random(4);Nowx:=4;Nowy:=1;
For N:=0 To 7 Do
Now[N]:=Change[Kind,Trans,N];
End;
Gotoxy(7,12);Write('GAME OVER');Readln;
END.