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网页编程代码,可直接选择在不同的浏览器中打开查看,以方便进行调试;自动检测文件类型,根据关键字显示节点,节点可自由折叠/打开,可显示缩进引导线,使代码富有层次感。