首页 > 编程语言 >通过MapEdit源程序的学习MAP文件 3, 改编程序,没有编辑功能,只显示MAP

通过MapEdit源程序的学习MAP文件 3, 改编程序,没有编辑功能,只显示MAP

时间:2023-03-31 16:58:03浏览次数:43  
标签:MAP begin wil end BaseDir Zoom Caption MapEdit 源程序

unit showmap;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, StdCtrls, WIL, ComCtrls;

const
  UNITX = 48;
  UNITY = 32;
type

  TMapInfo = packed record             //这个好像不需要PACKED
    BkImg: Word;
    MidImg: Word;
    FrImg: Word;
    DoorIndex: byte;
    DoorOffset: byte;
    AniFrame: byte;
    AniTick: byte;
    Area: byte;
    Light: byte;
    end;
  

  TMapHeader = packed record          // MPA的头文件,需要PACKED,否则错误
    Width: Word;
    Height: word;
    Title: string[15];
    UpdateDate: TDateTime;
    Reserved: array[0..23] of Char;
  end;


  TForm1 = class(TForm)
    scrlbx1: TScrollBox;
    pnl1: TPanel;
    btnOpenMap: TButton;
    pb1: TPaintBox;
    dlgOpen1: TOpenDialog;
    lbl1: TLabel;
    lbl2: TLabel;
    chkTiles: TCheckBox;
    chkSmTiles: TCheckBox;
    chkObjects: TCheckBox;
    btnSaveTobmp: TButton;
    lbl3: TLabel;
    lbl4: TLabel;
    lbl5: TLabel;
    lbl6: TLabel;
    trckbr1: TTrackBar;
    lbl7: TLabel;
    pbar1: TProgressBar;
    lbl8: TLabel;
    btnRefresh: TButton;
    lbloj1: TLabel;
    lbloj2: TLabel;
    lbloj3: TLabel;
    lbloj4: TLabel;
    lbloj5: TLabel;
    lbloj6: TLabel;
    lbloj7: TLabel;
    lbloj8: TLabel;
    lbloj9: TLabel;
    lbloj10: TLabel;
    lbloj11: TLabel;
    lbloj12: TLabel;
    lbloj13: TLabel;
    lbloj14: TLabel;
    lbloj15: TLabel;
    lbloj16: TLabel;
    lbloj17: TLabel;
    lblTil: TLabel;
    lblSmT: TLabel;
    procedure FormCreate(Sender: TObject);
    procedure btnOpenMapClick(Sender: TObject);
    procedure pb1Paint(Sender: TObject);

    procedure btnSaveTobmpClick(Sender: TObject);
    procedure trckbr1Change(Sender: TObject);
    procedure btnRefreshClick(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
  private
    { Private declarations }

    function LoadMapFile(flname: string): Boolean;
    procedure ShowTiles(Canvas: TCanvas; x, y: Integer);
    procedure ShowSmTiles(Canvas: TCanvas; x, y: Integer);
    procedure ShowObjects(Canvas: TCanvas; x, y: Integer);
    procedure clslbloj;
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  MArr : array[0..1000, 0..1000] of TMapInfo;
  MapWidth, MapHeight : Integer;
  BaseDir: string;
  Zoom: Real;
  wilTiles, wilSmTiles: TWMImages;
  wil1, wil2, wil3, wil4, wil5, wil6,wil7, wil8, wil9, wil10 : TWMImages;
  wil13, wil14, wil15: TWMImages;

implementation

{$R *.dfm}



procedure TForm1.FormCreate(Sender: TObject);
begin
  MapWidth := 1;
  MapHeight := 1;
  trckbr1Change(Sender);
  BaseDir := GetCurrentDir + '\';
  form1.Caption := BaseDir;
  clslbloj;
  if FileExists(BaseDir + 'Tiles.wil') then
  begin
    wilTiles := TWMImages.Create(Self);
    wilTiles.FileName :=BaseDir + 'Tiles.wil';
    wilTiles.Initialize;
    lblTil.Caption := 'Tiles';
    lblTil.Color := clGreen;
  end;

  if FileExists(BaseDir + 'SmTiles.wil') then
  begin
    wilSmTiles := TWMImages.Create(Self);
    wilSmTiles.FileName :=BaseDir + 'SmTiles.wil';
    wilSmTiles.Initialize;
    lblSmT.Caption := 'SmTiles';
    lblSmT.Color := clGreen;
  end;


  if FileExists(BaseDir + 'objects.wil') then
  begin
    wil1 := TWMImages.Create(Self);
    wil1.FileName :=BaseDir + 'objects.wil';
    wil1.Initialize;
    lbloj1.Color := clGreen;
  end;

 if FileExists(BaseDir + 'objects2.wil') then
  begin
    wil2 := TWMImages.Create(Self);
    wil2.FileName :=BaseDir + 'objects2.wil';
    wil2.Initialize;
    lbloj2.Color := clGreen;
  end;

  if FileExists(BaseDir + 'objects3.wil') then
  begin
    wil3 := TWMImages.Create(Self);
    wil3.FileName :=BaseDir + 'objects3.wil';
    wil3.Initialize;
    lbloj3.Color := clGreen;
  end;

  if FileExists(BaseDir + 'objects4.wil') then
  begin
    wil4 := TWMImages.Create(Self);
    wil4.FileName :=BaseDir + 'objects4.wil';
    wil4.Initialize;
    lbloj4.Color := clGreen;
  end;

  if FileExists(BaseDir + 'objects5.wil') then
  begin
    wil5 := TWMImages.Create(Self);
    wil5.FileName :=BaseDir + 'objects5.wil';
    wil5.Initialize;
    lbloj5.Color := clGreen;
  end;

  if FileExists(BaseDir + 'objects6.wil') then
  begin
    wil6 := TWMImages.Create(Self);
    wil6.FileName :=BaseDir + 'objects6.wil';
    wil6.Initialize;
    lbloj6.Color := clGreen;
  end;

  if FileExists(BaseDir + 'objects7.wil') then
  begin
    wil7 := TWMImages.Create(Self);
    wil7.FileName :=BaseDir + 'objects7.wil';
    wil7.Initialize;
    lbloj7.Color := clGreen;
  end;

  if FileExists(BaseDir + 'objects8.wil') then
  begin
    wil8 := TWMImages.Create(Self);
    wil8.FileName :=BaseDir + 'objects8.wil';
    wil8.Initialize;
    lbloj8.Color := clGreen;
  end;

  if FileExists(BaseDir + 'objects9.wil') then
  begin
    wil9 := TWMImages.Create(Self);
    wil9.FileName :=BaseDir + 'objects9.wil';
    wil9.Initialize;
    lbloj9.Color := clGreen;
  end;

  if FileExists(BaseDir + 'objects10.wil') then
  begin
    wil10 := TWMImages.Create(Self);
    wil10.FileName :=BaseDir + 'objects.wil';
    wil10.Initialize;
    lbloj10.Color := clGreen;
  end;

  if FileExists(BaseDir + 'objects13.wil') then
  begin
    wil13 := TWMImages.Create(Self);
    wil13.FileName :=BaseDir + 'objects13.wil';
    wil13.Initialize;
    lbloj13.Color := clGreen;
  end;

  if FileExists(BaseDir + 'objects14.wil') then
  begin
    wil14 := TWMImages.Create(Self);
    wil14.FileName :=BaseDir + 'objects14.wil';
    wil14.Initialize;
    lbloj14.Color := clGreen;
  end;

  if FileExists(BaseDir + 'objects15.wil') then
  begin
    wil15 := TWMImages.Create(Self);
    wil15.FileName :=BaseDir + 'objects15.wil';
    wil15.Initialize;
    lbloj15.Color := clGreen;
  end;




end;


function TForm1.LoadMapFile(flname: string): Boolean;
var
  i, fhandle: Integer;
  header: TMapHeader;

begin
  Result := False;
  if not FileExists(flname) then Exit;
  fhandle := FileOpen(flname, fmOpenRead or fmShareDenyNone);

  if fhandle > 0 then
  begin
    FillChar(MArr, SizeOf(MArr), #0);
    FileRead(fhandle, header, SizeOf(TMapHeader));

    lbl2.Caption := IntToStr(header.Width) + ' * ' + IntToStr(header.Height);
    lbl3.Caption := header.Title;
    lbl4.Caption := DateTimeToStr(header.UpdateDate);
    lbl5.Caption := header.Reserved;

    if (header.Width > 0) and (header.Height > 0) then
    begin
      MapWidth := header.Width;
      MapHeight := header.Height;
      for i := 0 to header.Width - 1 do
        FileRead(fhandle, MArr[i, 0], SizeOf(TMapInfo) * MapHeight);
      Result := True;
    end;
    FileClose(fhandle);
  end;
end;

procedure TForm1.btnOpenMapClick(Sender: TObject);

begin
  with dlgOpen1 do
  begin
    if Execute then
    begin
      if LoadMapFile(FileName) then
      begin

        lbl1.Caption := ExtractFileName(FileName);
        lbl6.Caption := 'Img not draw.';
        clslbloj;
        trckbr1.Position := 9;
        pb1.Refresh;

      end;
    end;
  end;

end;

procedure TForm1.pb1Paint(Sender: TObject);
var
  i, j, lcorner, tcorner: Integer;
begin
  pb1.Width := Round(MapWidth  * UNITX * Zoom);
  pb1.Height := Round(MapHeight * UNITY * Zoom);
  lbl8.Caption := IntToStr(pb1.Width) + ' * ' + IntToStr(pb1.Height);
  //ShowBackgroundTile
  lcorner := Trunc(scrlbx1.HorzScrollBar.Position div UNITX / Zoom) ;    //水平线
  tcorner := Trunc(scrlbx1.VertScrollBar.Position div UNITY / Zoom);    //垂直线

   for j := 0 to MapHeight - 1  do
    for i := 0 to MapWidth - 1  do
    begin
      Application.ProcessMessages;


      if (i >=  lcorner - 1)  and (i <= lcorner +  Round(scrlbx1.Width div UNITX / Zoom) + 2)  and
        (j >= tcorner - 1) and (j <= tcorner +  Round(scrlbx1.Height div UNITY / Zoom) + 10) then
      begin
      if chkTiles.Checked then
        ShowTiles(pb1.Canvas, i, j);
      if chkSmTiles.Checked then
        ShowSmTiles(pb1.Canvas, i, j);
      if chkObjects.Checked then
        ShowObjects(pb1.Canvas, i, j);
      end;

      end;


end;

// 大瓦片tiles 96 * 64
procedure TForm1.ShowTiles(Canvas: TCanvas; x, y: Integer);
var
  idx, xx, yy: Integer;
begin
  if (x mod 2 = 0) and (y mod 2 = 0) then
  begin
    idx :=  (MArr[x, y].BkImg and $7fff ) - 1;
    if idx >=  0 then
    begin
     lblTil.Caption := 'useTiles';
     xx := Round(x * UNITX * Zoom);
     yy := Round(y * UNITY * Zoom);
     wilTiles.DrawZoom(Canvas, xx, yy, idx, Zoom);
    end;

  end;
end;

procedure TForm1.ShowSmTiles(Canvas: TCanvas; x, y: Integer);
var
  idx, xx, yy : Integer;
begin
  idx :=  (MArr[x, y].MidImg and $7fff) - 1;
   if idx >= 0 then
   begin
     lblSmT.Caption := 'useSmTil';
     xx := Round(x * UNITX * Zoom);
     yy := Round(y * UNITY * Zoom);
     wilSmTiles.DrawZoomEx(Canvas, xx, yy, idx, Zoom, True);
   end;

end;

procedure TForm1.ShowObjects(Canvas: TCanvas; x, y: Integer);
var
  idx, xx, yy: Integer;
begin
  idx := (MArr[x, y].FrImg and $7fff) - 1 ;   // objects 48 * n
                                         //需要 +1位置放置
        if idx > 0 then
        begin

          xx := Round(x* UNITX * Zoom);
          yy := Round((y + 1)  * UNITY * Zoom);

          case (MArr[x, y].Area) of
          0: begin
            lbloj1.Caption := 'use01';
            wil1.DrawZoomEx(Canvas, xx, yy, idx, Zoom, False);
          end;
          1: begin
             lbloj2.Caption := 'use02';
            wil2.DrawZoomEx(Canvas, xx, yy, idx, Zoom, False);
          end;
          2: begin
            lbloj3.Caption := 'use03';
            wil3.DrawZoomEx(Canvas, xx, yy, idx, Zoom, False);
          end;
          3: begin
             lbloj4.Caption := 'use04';
            wil4.DrawZoomEx(Canvas, xx, yy, idx, Zoom, False);
          end;
          4: begin
             lbloj5.Caption := 'use05';
            wil5.DrawZoomEx(Canvas, xx, yy, idx, Zoom, False);
          end;
          5: begin
             lbloj6.Caption := 'use06';
            wil6.DrawZoomEx(Canvas, xx, yy, idx, Zoom, False);
          end;
          6: begin
             lbloj7.Caption := 'use07';
            wil7.DrawZoomEx(Canvas, xx, yy, idx, Zoom, False);
          end;
          7: begin
            lbloj8.Caption := 'use08';
            wil8.DrawZoomEx(Canvas, xx, yy, idx, Zoom, False);
          end;
          8: begin
            lbloj9.Caption := 'use09';
            wil9.DrawZoomEx(Canvas, xx, yy, idx, Zoom, False);
          end;
          9: begin
            lbloj10.Caption := 'use10';
            wil10.DrawZoomEx(Canvas, xx, yy, idx, Zoom, False);
          end;
          10: begin
            lbloj11.Caption := 'use*11';
          end;
          11: begin
            lbloj12.Caption := 'use*12';
          end;
          12: begin
            lbloj13.Caption := 'use13';
            wil13.DrawZoomEx(Canvas, xx, yy, idx, Zoom, False);
          end;
          13: begin
             lbloj14.Caption := 'use14';
            wil14.DrawZoomEx(Canvas, xx, yy, idx, Zoom, False);
          end;
          14: begin
            lbloj15.Caption := 'use15';
            wil15.DrawZoomEx(Canvas, xx, yy, idx, Zoom, False);
          end;
          15: begin
             lbloj16.Caption := 'use*16';
          end;
          16..255: begin
           lbloj17.Caption :='use*' +  IntToStr(MArr[x, y].Area);
          end;
        end;


      end;
end;



procedure TForm1.btnSaveTobmpClick(Sender: TObject);
var
  i, j: Integer;
  str: string;
  Bitmap: TBitmap;
begin
   if dlgOpen1.FileName <> '' then
   begin
     str := dlgOpen1.FileName + '.bmp';
     i := Round(MapWidth * UNITX * Zoom);
     j := Round(MapHeight * UNITY * Zoom);
     if (i <= 3000) and (j <= 3000) then
     begin
       Bitmap := TBitmap.Create;
       Bitmap.Width := i;
       Bitmap.Height := j;
       pbar1.Position := 0;
       pbar1.Max := MapHeight;
      for j := 0 to MapHeight - 1  do
        begin
          for i := 0 to MapWidth - 1  do
          begin
           Application.ProcessMessages;
           if chkTiles.Checked then
            ShowTiles(Bitmap.Canvas, i, j);
           if chkSmTiles.Checked then
             ShowSmTiles(Bitmap.Canvas, i, j);
           if chkObjects.Checked then
             ShowObjects(Bitmap.Canvas, i, j);
          end;
          pbar1.StepIt;
        end;


       Bitmap.SaveToFile(str);
       lbl6.Caption := 'Bmp have drawed.';
       pbar1.Position := 0;
       Bitmap.Free;
     end else
       lbl6.Caption := 'Bmp is to large.';
   end;

end;

procedure TForm1.trckbr1Change(Sender: TObject);
begin

  case trckbr1.Position of
    1:  Zoom := 0.015625;  
    2:  Zoom := 0.03125;
    3:  Zoom := 0.0625;
    4:  Zoom := 0.09375;
    5:  Zoom := 0.125;
    6:  Zoom := 0.25;
    7:  Zoom := 0.5;
    8:  Zoom := 0.75;
    9:  Zoom := 1.0;

  end;


  lbl7.Caption := FloatToStr(Zoom);

  
end;

procedure TForm1.btnRefreshClick(Sender: TObject);
begin
  pb1.Refresh;
end;

procedure TForm1.clslbloj;
begin
  lblTil.Caption := 'Tiles';
  lblSmT.Caption := 'smTiles';
  lbloj1.Caption := '1';
  lbloj2.Caption := '2';
  lbloj3.Caption := '3';
  lbloj4.Caption := '4';
  lbloj5.Caption := '5';
  lbloj6.Caption := '6';
  lbloj7.Caption := '7';
  lbloj8.Caption := '8';
  lbloj9.Caption := '9';
  lbloj10.Caption := '10';
  lbloj11.Caption := '*11';
  lbloj12.Caption := '*12';
  lbloj13.Caption := '13';
  lbloj14.Caption := '14';
  lbloj15.Caption := '15';
  lbloj16.Caption := '*16';
  lbloj17.Caption := '*17-255';
end;


procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
    if wilTiles <> nil then wilTiles.Free;
    if wilSmTiles <> nil then wilSmTiles.Free;
    if wil1 <> nil then wil1.Free;
    if wil2 <> nil then wil2.Free;
    if wil3 <> nil then wil3.Free;
    if wil4 <> nil then wil4.Free;
    if wil5 <> nil then wil5.Free;
    if wil6 <> nil then wil6.Free;
    if wil7 <> nil then wil7.Free;
    if wil8 <> nil then wil8.Free;
    if wil9 <> nil then wil9.Free;
    if wil10 <> nil then wil10.Free;
    if wil13 <> nil then wil13.Free;
    if wil14 <> nil then wil14.Free;
    if wil15 <> nil then wil15.Free;



end;

end.

 

重点:

MAP文件机构

TMapHeader = packed record
Width: Word;
Height: word;
Title: string[15];
UpdateDate: TDateTime;
Reserved: array[0..23] of Char;
end;

 

TMapInfo = packed record
BkImg: Word;
MidImg: Word;
FrImg: Word;
DoorIndex: byte;
DoorOffset: byte;
AniFrame: byte;
AniTick: byte;
Area: byte;
Light: byte;
end;

 重点文件

控件 WIL,

 

思路:

2023-3-27

1,显示头文件信息
TMapHeader = packed record
Width: Word;
Height: word;
Title: string[15];
UpdateDate: TDateTime;
Reserved: array[0..23] of Char;
end;
已经完成

3,可以放大缩小

2,加入图像控件可以保存大图片的。
GDIPLUS
'E:\mirClient\Mir1.76\Map\0125.map.bmp'

这个GDI+ 用了下,看起来并不是封装好的控件,也并不是图像控件。
而是对于一些函数的封装和应用。。。

我来试下 PAINTBOX.
PAINTBOX的CANVAS 没有保存到文件的函数。

测试得BITMAP的WIDTH HEIGHT 在3060 再大了就错误了

用IMAGE的CANVAS 画布可以装的下,
但是这个画布保存不了文件,
要保存到文件还是得进过BITMAP 于是又到了BITMAP大小限制的地方。
用了JPEG 不行, 其根子 是读取的图片文件的。

可以扫描CANVAS 写流数据直接到图片文件中,
这个难了我现在搞不定,需要用到太多的函数。

那我现在先缩小图片,最大限制到3060不就可以了吗,总比大图片显示不出来要强些。


3,可以放大缩小

delphi 常用函数(数学函数)round、trunc、ceil和floor
delphi 常用函数(数学)


2023年3月27日星期一16:44:03
加入缩小放大功能
17:48:08
放大缩小功能成功,发现按照2的倍数 不会出现白线,于是设置固定 倍数。


4, 显示使用的objects 文件序号。
DATA
1.5 ,1.76 : OBJECTS 2-7
1.8 , OBJECTS 2- 10

sf,ip ,通用版 2-10, 13-15;

 

2023年3月28日星期二
上午 8:50:26

1,只用1个objects wil.

这个没有成功,WIL控件里面的对象似乎不能很好被释放掉,
对于大地图需要多达几万次的对 WMIMAGEL类构建,析构,结果程序就崩掉了
只有使用多个WMIMAGE类了的对象了。。。最后程序关闭的时候析构掉。


还有些想法,比如使用自己编辑的MYWIL 单元,
按理说可以,但是发现自己编写的 MYWIL 单元里面的DRAWZOOM 函数是被彻底的改编了,需要的参数都不一样,
需要重新写,放弃了,
基本原理已经知道了,

感觉继续深入下去还是会放弃 DXD7这个控件,
会重新编写WIL单元,直接上 DX 的API 了。
这个里面就需要剔除掉DIB单元,是直接读取数据到BMP了。

下一步,带DXD7客户端了。。。

标签:MAP,begin,wil,end,BaseDir,Zoom,Caption,MapEdit,源程序
From: https://www.cnblogs.com/D7mir/p/17276714.html

相关文章

  • 通过MapEdit源程序的学习MAP文件 2, 极度简化的程序,只有显示MAP
      1,地图编辑器。主界面EdMainin'EdMain.pas'{FrmMain},2,大号地砖?有界面mpalettin'mpalett.pas'{FrmMainPal},3,素材数据有界面FObjin'FObj.pas'{FrmObj},4,数据合成编辑器,有界面,ObjEditin'ObjEdit.pas'{FrmObjEdit},5,提取数据,有界面,ObjSet......
  • HashMap
    HashMap变化HashMap1.7在JDK1.7到JDK1.8的时候,对HashMap做了优化首先JDK1.7的HashMap当出现Hash碰撞的时候,最后插入的元素会放在前面,这个称为“头插法”JDK7用头插是考虑到了一个所谓的热点数据的点(新插入的数据可能会更早用到),但这其实是个伪命题,因为JDK7中rehash的时......
  • Vue整合EsMap
    一、EsMap地图1.1.生成EsMap本地文件1.1.1.进入EsMap数字孪生三维可视化云平台打开链接https://www.esmap.cn/esmapv/content/cn/member/index.html1.1.1.新建三维场景点击新增三维场景,输入信息,点击下一步即可。其中三维场景ID和建筑token在web端需要使用ID为项目工程......
  • 过亿云资源运维管控难?华为云CloudMap带你喝着咖啡做运维
    摘要:华为云站点数字化平台CloudMap携手华为云图引擎GES打造云服务全栈拓扑,网络流量路径和云服务动态依赖等空间关系数据,支撑现网运行态风险识别和分钟级定位定界,构建业界领先的数字化能力。本文分享自华为云社区《构建站点数字孪生,支撑确定性运维:华为云九洲云图CloudMap》,作者:HWC......
  • 关于Bitmap 导致的OOM 解决方案
    相机越来越好,相片也越来越大,而手机应用程序所分配的内存有限, 所以在读相片的时候,如果代码写得不好,经常导致OOM.信息如下:基本上要注意几个地方:1bitmap如果不用了,回收掉voidonDestroy(){super.onDestroy();if(bmp1!=null){bmp1.recyc......
  • sqlmap工具学习
    tryhackme:sqlmapgithub:https://github.com/sqlmapproject/sqlmapkali集成参数介绍sqlmap-h_____H________[(]___________{1.7.2#stable}|_-|.["]|.'|.||___|_[']_|_|_|__,|_||_|V...|_|https://s......
  • 3.30App端地铁查询 设计思路 源程序代码、运行结果截图、编程总结分析。
    App端地铁查询设计思路源程序代码、运行结果截图、编程总结分析。 关于地铁查询App的设计思路。设计思路:我们沿用pc端的数据库设计结构,减少了我们的工作量。查询方法以及设计思路都很javaweb设计的大同小异。在设计中我们遇到的主要问题就是安卓Studio中的mysql数据库的......
  • App端地铁查询 设计思路 源程序代码、运行结果截图、编程总结分析。
    关于地铁查询App的设计思路。设计思路:我们沿用pc端的数据库设计结构,减少了我们的工作量。查询方法以及设计思路都很javaweb设计的大同小异。在设计中我们遇到的主要问题就是安卓Studio中的mysql数据库的连接。(查询数据库时主线程与子线程冲突的问题解决)查询大致分为三大类:一:线......
  • Android图片转换类 1. Bitmap去色,…
    publicclassImageTools{publicstaticBitmaptoGrayscale(BitmapbmpOriginal){intwidth,height;height=bmpOriginal.getHeight();width=bmpOriginal.getWidth();BitmapbmpGrayscale=Bitmap.createBitmap(width,height......
  • 大数据经典论文解读 - MapReduce
    MapReduce使用MapReduce框架只要实现一个Map函数和一个Reduce函数,Map函数实现映射,接受一个key-value并转换为多个键值对;Reduce是一个化简函数,接收一个key和对应的vallue,然后组成一组新的value输出出去。map(k1,v1)->list(k2,v2)reduce(k2,list(v2))->list(v3)Map函数的......