A. 游戲編程裡面有哪些經典或者很酷的演算法
我挑一些有趣的演算法,希望盡量提及相關演算法在游戲中的應用。
1、光柵化
Bresenham's line algorithm [1]:經典的繪畫直線演算法,後來還可以稍作修改用於繪畫圓弧[2],都不用三角函數或除數,只需用整數加法、減法和乘法。
Perspective-Correct Texture Mapping [3]:透視正確的光柵化紋理貼圖演算法是1980才出現的。第一代Quake引擎引入後,才開始支持不垂直的牆、不水平的地面天花。
Polygon Rasterization with Edge Function [4]:Bresenham演算法如果用來畫多邊形,兩個多邊形的共邊會被重繪。後來發明了使用簡單的edge function去解決這個問題,而且適合並行的硬體實現。現在的GPU都是使用這個演算法。
2、全局光照
Precomputed Radiance Transfer (PRT) with Spherical Harmonics(SH)[5]:儲存靜態環境對於各個方向光源的漫反射數據,可以實現動態低頻光源的全局光照效果。這種表示方式非常神奇。Halo 3也使用到這種技術[6]。
Screen-space Ambient Occlusion (SSAO)[7]:Crytek提出的首個屏幕空間環境光遮蔽演算法,之後引來大量的研究及改進演算法。也有用類似的概念去做近距離的反射,如SSDO[8]。
Light Propagation Volume (LPV)[9]:Crytek提出的首個動態全局光照演算法,不需要預計算。但要在體積數據中計算傳播,性能較慢,所以之後再優化成 Cascaded LPV [10]。
Voxel Cone Tracing [11]:也是不需要預計算的動態全局光照演算法。把場景動態生成層階式的體素數據(像mipmap那樣的pre-filtering),從光源視角計算直接光照,然後逐像素追蹤這組數據獲取非直接光照。結果比LPV精確,也可以做到光澤反射(glossy reflection)。
3、陰影
Shadow Volume [12]:陰影體積是1977年發表的陰影技術,在屏幕空間光柵化陰影體積,可准確判斷每個屏幕像素是否在陰影之內。可以處理平行光源和點光源的陰影。1991年[13]講述如何用stencil buffer來實現此演算法,適合在圖形加速硬體(當時還沒有所謂GPU)上使用。但很多人發現,如果攝像機在陰影體積內,就會出錯。在1998至2000年有多人發現一種解決方法,需要把John Carmack在2000年的電郵[14]中提及這個想法,後來成為2004年《毀滅戰士3(Doom 3)》引擎的重要特徵,因他把這項技術發揚光大,即使他非首個發明人,此項技術通常被稱為Carmack's Reverse。
Parallel Split Shadow Map (PSSM) [15][16] / Cascaded Shadow Map(CSM)[17]:雖然Shadow Volume很吸引,但它需要大量的內存頻寬,而且通常不能實現軟陰影。後來大部分游戲改為使用Shadow Map(陰影貼圖),這更適合GPU,並且可以通過多次采樣(Percentage Closer Filtering, PCF)來實現軟陰影。然而,陰影貼圖也有許多問題,例如遠近景物都採用同一張紋理,就會令到近景的精度不足,出現鋸齒。2006年香港中文大學的博士生Fan Zhang等人發表了一種 PSSM 演算法 [15],為不同距離的場景渲染多張陰影貼圖,在采樣的時候按距離決定使用那一張。這個方法的變種CSM,在切割上和PSSM有點差異,被廣泛使用於現時大部分游戲引擎中。
Variance Shadow Map(VSM)[18]:之前談到用PCF做軟陰影,它的壞處就是要做多次采樣。那麼可否把陰影貼圖直接模糊化來實現軟陰影?答案是否定的。但是在2006年有學者發表了VSM,它是一種用統計方式來逼近軟陰影的效果。
B. 有沒有什麼免費的編程游戲
不知道你是喜歡編程還是喜歡游戲。如果你只是對這一行為感興趣,倒不如去嘗試研究一下游戲引擎,比如rpg maker,簡單輕松就可以自己動手做一個rpg游戲了。另外國內還有一款paws3d,是不需要編程就可以開發3d高品質游戲的。unity也不錯,不過需要一些編程基礎,你可以看完前面兩個之後再去了解
C. 我想學游戲編程要怎麼學呢~(我一點都不會...)
先送你一個猜數游戲:
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.
這是每個游戲編程FAQ里都有的問題。這個問題每星期都會在游戲開發論壇上被問上好幾次。這是個很好的問題,但是,沒人能給出簡單的答案。在某些應用程序中,總有一些計算機語言優於其他語言。下面是幾種用於編寫游戲的主要編程語言的介紹及其優缺點。希望這篇文章能幫助你做出決定。
可以編一個最簡單的猜數游戲
我這有一個俄羅斯方塊源碼:
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.
D. 3款免費兒童編程游戲:讓孩子學編程,你准備好了嗎
大部分的家長可能都會讓自己的孩子至少學習樂器,運動或棋類中的一項甚至幾項。但你有沒有想過讓你的孩子盡早(5-7歲)開始學習編程呢?讓孩子學編程,你准備好了嗎?
學習編程可以盡早提升孩子的邏輯思維與創造力。
首先,學習編程能夠培養孩子的體系化思維、邏輯思維和抽象思維!其次,學習編程也能規范孩子的許多學習習慣,包括專注細心、提高耐性、歸納整理,更能增強孩子主動解決問題的能力。最重要的是,編程將成為人工智慧時代的一個非常重要的基礎技能,也將成為孩子在未來的核心競爭力。妙小程少兒編程希望可以幫助到你。
E. 我會C語言,我想製作游戲,繪圖要用什麼軟體好最好是免費的,我是學生。
3DMax是Discreet公司的主要產品.Discreet公司在全球范圍提供先進的製作工具並主要應用於4個平行的市場:後期製作;廣播電視;游戲動畫開發;Web內容製作.
3d max將廣泛應用於視覺效果,角色動畫及下一代的游戲開發領域;3d max支持大多數現有的3D軟體,並擁有大量第三方的內置程序.
Discreet開發的character studio是一個提供高級角色動畫及群組動畫理想的擴展方案;
3d max同時與discreet的3D影視特效合成軟體combustion完美結合,從而提供了理想的視覺效果,動畫及3D合成方案.
PS3D瑪雅鄙視~高手都用 記事本 http://www.dearbook.com.cn/book/211547網路游戲客戶端編程《網路游戲客戶端編程》全書介紹了網路游戲客戶端編程的基本知識,全書的內容可以分為三個部分:第一部分為基礎部分,主要介紹3D圖形編程的基礎知識,包括計算機圖形學基礎、Direct3D圖形開發包基本API學習、DirectInput開發包API學習、DirectAudio、DirectShow開發包API學習。讀者學習本部分後能熟練使用DirectX開發包進行3D圖形編程。第二部分為提升部分,主要介紹如何靈活應用Direct3D的基本知識點,實現游戲中的某些特殊效果,同時深入學習HLSL的知識,適應顯卡技術的高速發展。第三部分:演算法階段,對游戲中的一些常用的演算法進行研究,包括物理模擬、人工智慧、碰撞檢測以及場景劃分,讀者學後能熟悉游戲中的常用演算法,對引擎的底層部分也能有所了解。
F. 我想下載1款可以製作3D游戲編程的好用的軟體
3D游戲編程是一個很繁瑣的工作,需要相當的耐心和毅力,相比來說專回業知識都不算什答么了。而且你說的這樣的軟體現在還沒有。
你需要學習VB(編出來的程序運行速度較慢,但好學)或VC++,DirectX Sdk中包含了對以上兩個開發工具的函數庫。
G. 高等數學在編程中有什麼應用
如果做程序員,用處不是很大,真是在一些壓縮,圖像處理,數據採集等高難度技術攻關的特殊團隊中使用,游戲開發中使用的比較多。
H. 高手們,請簡述一下數學在編程和游戲開發方面的應用或幫助。
我給你舉幾個例子吧,
首先,在設計一些繪圖,游戲編程中,數學用的很多。如你回要變換某個圖形,答圖形本質上是點集,2Dim中用x,y軸坐標表示,3Dim中還得添加z軸坐標, rotate(旋轉),伸縮(scale),平移(translate)等,需要對圖形的每個點做變換,其實就是乘以一個變換矩陣。在重力感應游戲開發中,有可能,應用平台只給你提供手持設備的坐標系相對於標准空間坐標系的旋轉系數,yaw,pitch,roll,你需要用這三個參數構造一個從手持設備坐標繫到標准坐標系的正交的過多矩陣,用該矩陣可以分解重力到手持設備坐標系。
一些圖形處理,如bmp圖形壓縮成jpeg格式以及圖像水印,需要做一些變換,如小波變換,傅里葉變換,離散餘弦變換等。這個你需要了解一些數學知識。
游戲中一些角色的移動,動做的逼真性需要用數學知識建立物理模型。
數值計算和分析類的應用。
如果你是單純的應用開發,其實了解即可,別人有可能已經做好了一起,你只要使用別人封裝好的類或函數。
I. 游戲編程需要那些數學
計算機數學
高等數學(可學可不學)
基本運算的數學
大概是這些
對數學要求不是很高
J. 有哪些軟體可以學習游戲編程
我推薦Notepad,所見即所得功能、語法高亮、字詞自動完成功能;支持同時編輯多重版文檔、自權定義語言;對於HTML網頁編程代碼,可直接選擇在不同的瀏覽器中打開查看,以方便進行調試;自動檢測文件類型,根據關鍵字顯示節點,節點可自由折疊/打開,可顯示縮進引導線,使代碼富有層次感。