回 帖 发 新 帖 刷新版面

主题:[讨论]FC经典『90坦克大战』,感兴趣的快进!!!!!!!!!!!!!!

    好不容易,有十几天假期,这几天一味怀旧,找出了那部“落尘与童年齐飞”的电视游戏机,再战了一番。

    于是,一时冲动,决定做一个“90坦克大战”,就这样,昨晚混了两个多小时,把图像处理方面基本完成。

    不过,再过两天我就要回校,进入高三,做最后拼搏,所以,这个游戏,我不知道是否能完成。(应该不能)
                                   
    [color=FF0000][size=3]因此,有谁对这个游戏感兴趣的,想帮忙写完,麻烦一下![/size] [/color][em11]

===================================================================================================
说说我完成的吧:
    
    1,完成80%的图像处理(包括地形,7辆坦克车);
    
    2,坦克基本处理;

    3,地图编辑器;
    
    4,3张地图;

    5,移动判断;

还未完成的(需要帮忙的):
    
    1,子弹处理;

    2,敌机的低等AI(我已经想好思路,如果你需要,我可提供我的思路);

    3,细节处理;

  ===================================================================================================

    总的来说,希望我们能合作完成这个游戏。如有兴趣,请回复我。要快,因为我马上要拼命了,呵呵 ^_^
 

    最后,奉上小弟我的半成品。
   
 
[img]http://disk.8fls.cn/img.asp?src=l_tank_2_1.JPG[/img]

第一关(第一张地图,第二辆坦克)

[img]http://disk.8fls.cn/img.asp?src=l_tank_1_1.JPG[/img]

第二关(第二张地图,第三辆坦克)

回复列表 (共11个回复)

沙发

补充代码:
uses crt,graph,l_draw,key;

const
  max=44;
  x=150;
  y=80;
  up=1;
  down=2;
  left=3;
  right=4;

type
  l_img=array[1..max,1..max]of 0..256;
  l_tank=record
           x,x0:word;
           y,y0:word;
           diretion:integer;
           img:string;
           v:integer;
         end;

var
  p1_x,p1_y:word;
  tank:array[1..8]of l_tank;
  position:l_img;
  v:integer;

procedure print_map(mapname:string);
  var
    st:string;
    mapfile:file;
    numread:word;
    i,j:integer;
    recordxy:array [1..2] of integer;
  begin
    st:=concat('map/',mapname,'.map');
    assign(mapfile,st);
    reset(mapfile,1);
    blockread(mapfile,recordxy,sizeof(recordxy),numread);
    blockread(mapfile,position,sizeof(tempimg),numread);
    close(mapfile);
    for i := 1 to recordxy[1] do
      for j := 1 to recordxy[2] do
        if position[j,i]<>255 then
          begin
            case position[j,i] of
              7  : printimg('bing',x+10*i,y+10*j);
              11 : printimg('hai',x+10*i,y+10*j);
              12 : begin
                     if (j+i) mod 2 = 0 then
                       begin
                         printimg('zhuan1',x+5*i*2,y+5*j*2);
                         printimg('zhuan1',x+5*(i*2+1),y+5*(j*2+1));
                         printimg('zhuan2',x+5*(i*2),y+5*(j*2+1));
                         printimg('zhuan2',x+5*(i*2+1),y+5*(j*2));
                       end;
                     if (j+i) mod 2 = 1 then
                       begin
                        printimg('zhuan1',x+5*i*2,y+5*j*2);
                         printimg('zhuan1',x+5*(i*2+1),y+5*(j*2+1));
                         printimg('zhuan2',x+5*(i*2),y+5*(j*2+1));
                         printimg('zhuan2',x+5*(i*2+1),y+5*(j*2));
                       end;
                   end;
              10 : printimg('cao',x+10*i,y+10*j);
              15 : printimg('tie',x+10*i,y+10*j);
            end;
          end;
    printimg('dalao',x+10*13,y+10*25+2);
  end;

procedure initgame;
  begin
    setfillstyle(1,11);
    bar(x-10,y-10,x+10,y+290);
    bar(x-10,y-10,x+290,y+10);
    bar(x+270,y,x+290,y+290);
    bar(x,y+270,x+270,y+290);
    print_map('map_1');
    tank[1].x:=9;
    tank[1].y:=25;
    tank[1].x0:=9;
    tank[1].y0:=25;
    v:=14;
    tank[1].img:='player12';                                   {PLAYER1}
    printimg(tank[1].img,x+10*tank[1].x,y+10*tank[1].y);
  end;

procedure wait;
  begin
    repeat until KeyPressed2;
  end;

板凳

procedure checktank;
  var
    i,j:integer;
  begin
    for i:=1 to 8 do
      if (tank[i].x0<>tank[i].x)or(tank[i].y0<>tank[i].y) then
        begin
          l_cleanimg(tank[i].img,x+10*tank[i].x0,y+10*tank[i].y0);
          case tank[i].diretion of
            up    : for j:=1 to 10 do
                      begin
                        printimg(tank[i].img,x+10*tank[i].x0,y+10*tank[i].y0-j);
                        delay(v);
                        l_cleanimg(tank[i].img,x+10*tank[i].x0,y+10*tank[i].y0-j);
                      end;
            down  : for j:=1 to 10 do
                      begin
                        printimg(tank[i].img,x+10*tank[i].x0,y+10*tank[i].y0+j);
                        delay(v);
                        l_cleanimg(tank[i].img,x+10*tank[i].x0,y+10*tank[i].y0+j);
                      end;
            left  : for j:=1 to 10 do
                      begin
                        printimg(tank[i].img,x+10*tank[i].x0-j,y+10*tank[i].y0);
                        delay(v);
                        l_cleanimg(tank[i].img,x+10*tank[i].x0-j,y+10*tank[i].y0);
                      end;
            right : for j:=1 to 10 do
                      begin
                        printimg(tank[i].img,x+10*tank[i].x0+j,y+10*tank[i].y0);
                        delay(v);
                        l_cleanimg(tank[i].img,x+10*tank[i].x0+j,y+10*tank[i].y0);
                      end;
          end;
          printimg(tank[i].img,x+10*tank[i].x,y+10*tank[i].y);
          tank[i].x0:=tank[i].x;
          tank[i].y0:=tank[i].y;
        end;
  end;

procedure control;
  var
    keychar:char;
  begin
    if keypressed2 then
      begin
        keychar:=ReadChar;
        ClearKeyboardBuf;
        case upcase(keychar) of
          'W' : begin dec(tank[1].y);tank[1].diretion:=up;end;
          'S' : begin inc(tank[1].y);tank[1].diretion:=down;end;
          'A' : begin dec(tank[1].x);tank[1].diretion:=left;end;
          'D' : begin inc(tank[1].x);tank[1].diretion:=right;end;
        end;
      end;
  end;

begin
  initgraph_16;
  Set_Handler;
  WaitForACSReleased;
  initgame;
  while not KeyMap[sEsc] do
    begin
      control;
      checktank;
    end;
end.

3 楼

不错啊!!期待完成。。
如果能使用双缓冲绘图技术。。。屏幕坦克闪烁问题应该很好解决!
然后就是绘图貌似比较慢。。不知道能否改进!

4 楼


我试过用“切换页面”的动画原理做(不知道算不算是“双缓冲绘图技术”),在闪烁和绘图的问题上是可以得到很好的处理,但,不知道问什么,切换页面时图片总会有上下微量偏移。请问你知道是问什么吗?或者,你能教教我怎么使用“双缓冲绘图技术”吗?谢谢!

5 楼

1. 内存溢出.
2. 可以尝试:
  SetRGBPalette (procedure)     (Graph unit)
----------------------------------------------

  Modifies palette entries for the IBM 8514 and VGA drivers.

  Declaration:
  procedure SetRGBPalette(ColorNum, RedValue, GreenValue, BlueValue:
     Integer);

  Target:
 Real, Protected

在FC模拟器的查看器里面可以找到对应的颜色RGB的值.
高度仿真!

6 楼

[quote]
我试过用“切换页面”的动画原理做(不知道算不算是“双缓冲绘图技术”),在闪烁和绘图的问题上是可以得到很好的处理,但,不知道问什么,切换页面时图片总会有上下微量偏移。请问你知道是问什么吗?或者,你能教教我怎么使用“双缓冲绘图技术”吗?谢谢![/quote]

切换页面?感觉应该是。。反正就是先在看不到的地方吧图形画好(比如内存),然后再整体搬上显存显示。。。

7 楼

强悍``

8 楼

是用什么语言写的

9 楼

...
明显是pascal

10 楼

不是内存溢出,楼主的程序工作在实模式下
要用dosbox之类的东西中转一下才能运行在windows上。

我想请问一下,那个svga的图形驱动文件是否与具体的语言无关,
我最先学的是turbo c跟你那个pascal差不多dos时代dos下的东西,
我想收藏一下,你能不能把svga图形驱动的借口文件发给我

我来回复

您尚未登录,请登录后再回复。点此登录或注册