第一个MT5EA源码

Discussion in 'MetaTrader' started by bcsunwww, May 27, 2009.

  1. //+------------------------------------------------------------------+
    //| MT5 Tetris.mq5 |
    //| Copyright ?2009, MetaQuotes Software Corp. |
    //| http://www.metaquotes.net |
    //+------------------------------------------------------------------+
    #property copyright "Copyright ?2009, MetaQuotes Software Corp."
    #property link "http://www.metaquotes.net"

    #include "MT5_TetrisField.mqh"
    //---
    #define KEY_NUMPAD_5 12
    #define KEY_LEFT 37
    #define KEY_UP 38
    #define KEY_RIGHT 39
    #define KEY_DOWN 40
    #define KEY_NUMLOCK_DOWN 98
    #define KEY_NUMLOCK_LEFT 100
    #define KEY_NUMLOCK_5 101
    #define KEY_NUMLOCK_RIGHT 102
    #define KEY_NUMLOCK_UP 104
    //---
    CTetrisField ExtField;
    //+------------------------------------------------------------------+
    //| |
    //+------------------------------------------------------------------+
    void OnInit()
    {
    //---
    ExtField.Init();
    ChartRedraw();
    //---
    EventSetTimer(1);
    }
    //+------------------------------------------------------------------+
    //| |
    //+------------------------------------------------------------------+
    void OnDeinit()
    {
    EventKillTimer();
    ExtField.Deinit();
    ChartRedraw();
    }
    //+------------------------------------------------------------------+
    //| |
    //+------------------------------------------------------------------+
    void OnChartEvent(int id, long& lparam, double& dparam, string& sparam)
    {
    long ldparam=dparam;
    // printf("id=%d lparam=%I64d dparam=%I64d",id,lparam,ldparam);
    if(id==CHARTEVENT_KEYDOWN)
    {
    //printf("%I64d",lparam);
    switch(lparam)
    {
    case KEY_NUMLOCK_LEFT:
    case KEY_LEFT: ExtField.Left(); break;
    case KEY_NUMLOCK_UP:
    case KEY_UP: ExtField.Rotate(); break;
    case KEY_NUMLOCK_RIGHT:
    case KEY_RIGHT: ExtField.Right(); break;
    case KEY_NUMLOCK_DOWN:
    case KEY_DOWN: ExtField.Down(); break;
    case KEY_NUMPAD_5:
    case KEY_NUMLOCK_5: ExtField.Drop(); break;
    }
    ChartRedraw();
    }
    }
    //+------------------------------------------------------------------+
    //| |
    //+------------------------------------------------------------------+
    int OnTimer()
    {
    ExtField.Down();
    ChartRedraw();
    //----
    return(0);
    }
    //+------------------------------------------------------------------+



    //+------------------------------------------------------------------+
    //| MT5_TetrisShape.mqh |
    //| Copyright ?2009, MetaQuotes Software Corp. |
    //| http://www.metaquotes.net |
    //+------------------------------------------------------------------+
    #property copyright "Copyright ?2009, MetaQuotes Software Corp."
    #property link "http://www.metaquotes.net"

    #include "MT5_TetrisShape.mqh"

    #define WIDTH_IN_PIXELS 256
    #define HEIGHT_IN_PIXELS 512
    #define FIELD_WIDTH 16
    #define FIELD_HEIGHT 32
    #define HORZ_BORDER 6
    #define VERT_BORDER 6

    #define FIELD_NAME "MT5TetrisField"
    #define BACKGROUND_NAME "MT5TetrisBackGround"
    #define SCORE_NAME "MT5TetrisScore"
    #define LABELOVER_NAME "MT5TetrisOver"

    //+------------------------------------------------------------------+
    //| 吾牝 - 耱嚓囗 |
    //+------------------------------------------------------------------+
    class CTetrisField
    {
    private:
    int m_score; // 聍蛤
    int m_ypos; // 蝈牦?镱腩驽龛?翳泱瘥 镱 忮痱桕嚯??镨犟咫圊
    int m_field[FIELD_HEIGHT][FIELD_WIDTH]; // 爨蝠桷?耱嚓囗?
    int m_rows[FIELD_HEIGHT]; // 眢戾疣鲨 ?漕?耱嚓囗?潆 桁屙钼囗? 狃铠屙睇?犭铌钼
    int m_last_row; // 镱耠邃龛?疋钺钿睇?眍戾??溧
    CTetrisShape *m_shape; // 蝈蝠桉磬 翳泱疣
    bool m_bover; // 桡疣 玎觐眵屙?
    public:
    void CTetrisField() { m_shape=NULL; m_bover=false; }
    void Init();
    void Deinit();
    void Down();
    void Left();
    void Right();
    void Rotate();
    void Drop();
    private:
    void NewShape();
    void CheckAndDeleteRows();
    void LabelOver();
    };
    //+------------------------------------------------------------------+
    //| 袜?潴 ?觐眈蝠箨蝾痤?桉镱朦珞弪? 趔黻鲨 桧桷栲腓玎鲨? |
    //+------------------------------------------------------------------+
    void CTetrisField::Init()
    {
    int i;
    //--- 耱囵蝮屐 疣礓铎嚅珏?铗 镱耠邃礤泐 桤忮耱眍泐 屐屙?皴疴屦?
    srand((uint)TimeCurrent());
    //--- 桧桷栲腓玷痼屐 爨耨桠?
    ArrayInitialize(m_field,0);
    for(i=0; i<FIELD_HEIGHT; i++)
    m_rows=FIELD_HEIGHT-i-1;
    m_last_row=FIELD_HEIGHT;
    //--- 耦玟喔?钺牝 耱嚓囗?
    ObjectCreate(0,BACKGROUND_NAME,OBJ_BITMAP_LABEL,0,0,0,0,0);
    ObjectSetInteger(0,BACKGROUND_NAME,OBJPROP_XDISTANCE,2);
    ObjectSetInteger(0,BACKGROUND_NAME,OBJPROP_YDISTANCE,2);
    ObjectSetInteger(0,BACKGROUND_NAME,OBJPROP_BACK,true);
    ObjectSetString(0,BACKGROUND_NAME,OBJPROP_BMPFILE,"Tetris\\background.bmp");
    //--- ?钺牝?翳泱?
    for(i=0; i<4; i++)
    {
    string name=SHAPE_NAME+(string)i;
    ObjectCreate(0,name,OBJ_BITMAP_LABEL,0,0,0,0,0);
    ObjectSetInteger(0,name,OBJPROP_BACK,false);
    ObjectSetString(0,name,OBJPROP_BMPFILE,"Tetris\\blue_block.bmp");
    }
    //--- 耦玟喔?蝈犟蝾怏?戾蜿?潆 恹忸溧 铟觐?
    m_score=0;
    //--- 蝈睃 耔礤泐 鲡弪?
    ObjectCreate(0,SCORE_NAME+"1",OBJ_LABEL,0,0,0,0,0);
    ObjectSetInteger(0,SCORE_NAME+"1",OBJPROP_XDISTANCE,WIDTH_IN_PIXELS/2+VERT_BORDER+3);
    ObjectSetInteger(0,SCORE_NAME+"1",OBJPROP_YDISTANCE,HEIGHT_IN_PIXELS+24+HORZ_BORDER+3);
    ObjectSetInteger(0,SCORE_NAME+"1",OBJPROP_BACK,false);
    ObjectSetInteger(0,SCORE_NAME+"1",OBJPROP_COLOR,Blue);
    ObjectSetString(0, SCORE_NAME+"1",OBJPROP_FONT,"Arial");
    ObjectSetInteger(0,SCORE_NAME+"1",OBJPROP_FONTSIZE,24);
    ObjectSetInteger(0,SCORE_NAME+"1",OBJPROP_ANCHOR,ANCHOR_TOP);
    ObjectSetDouble(0,SCORE_NAME+"1",OBJPROP_ANGLE,0.0);
    ObjectSetString(0,SCORE_NAME+"1",OBJPROP_TEXT,"0");
    //--- 磬滹桉?娓腧钽?鲡弪?
    ObjectCreate(0,SCORE_NAME,OBJ_LABEL,0,0,0,0,0);
    ObjectSetInteger(0,SCORE_NAME,OBJPROP_XDISTANCE,WIDTH_IN_PIXELS/2+VERT_BORDER);
    ObjectSetInteger(0,SCORE_NAME,OBJPROP_YDISTANCE,HEIGHT_IN_PIXELS+24+HORZ_BORDER);
    ObjectSetInteger(0,SCORE_NAME,OBJPROP_BACK,false);
    ObjectSetInteger(0,SCORE_NAME,OBJPROP_COLOR,Yellow);
    ObjectSetString(0, SCORE_NAME,OBJPROP_FONT,"Arial");
    ObjectSetInteger(0,SCORE_NAME,OBJPROP_FONTSIZE,24);
    ObjectSetInteger(0,SCORE_NAME,OBJPROP_ANCHOR,ANCHOR_TOP);
    ObjectSetDouble(0,SCORE_NAME,OBJPROP_ANGLE,0.0);
    ObjectSetString(0,SCORE_NAME,OBJPROP_TEXT,"0");
    //--- 沐礤痂痼屐 镥疴簋 翳泱痼
    NewShape();
    }
    //+------------------------------------------------------------------+
    //| 阻耱桁 玎 耦犷? |
    //+------------------------------------------------------------------+
    void CTetrisField::Deinit()
    {
    int i,j,row;
    string name;
    //--- 箐嚯屐 耱嚓囗
    ObjectDelete(0,BACKGROUND_NAME);
    ObjectDelete(0,SCORE_NAME);
    ObjectDelete(0,SCORE_NAME+"1");
    if(m_bover)
    {
    ObjectDelete(0,LABELOVER_NAME);
    ObjectDelete(0,LABELOVER_NAME+"1");
    }
    //--- 箐嚯屐 翳泱瘥
    for(i=0; i<4; i++)
    {
    name=SHAPE_NAME+(string)i;
    ObjectDelete(0,name);
    }
    //--- 铟棂噱?耱嚓囗
    for(i=0; i<FIELD_HEIGHT; i++)
    {
    row=m_rows;
    for(j=0; j<FIELD_WIDTH; j++)
    {
    if(m_field[j]!=0)
    {
    name=FIELD_NAME+(string)row+"-"+(string)j;
    ObjectDelete(0,name);
    }
    }
    }
    //---
    }
    //+------------------------------------------------------------------+
    //| 杨玟囗桢 翳泱瘥 |
    //+------------------------------------------------------------------+
    void CTetrisField::NewShape()
    {
    m_ypos=HORZ_BORDER;
    //--- 耠篦嚅睇?钺疣珙?耦玟喔?钿眢 桤 7 忸珈铈睇?翳泱?
    int nshape=rand()%7;
    switch(nshape)
    {
    case 0: m_shape=new CTetrisShape1; break;
    case 1: m_shape=new CTetrisShape2; break;
    case 2: m_shape=new CTetrisShape3; break;
    case 3: m_shape=new CTetrisShape4; break;
    case 4: m_shape=new CTetrisShape5; break;
    case 5: m_shape=new CTetrisShape6; break;
    case 6: m_shape=new CTetrisShape7; break;
    }
    //--- 铗痂耦恹忄屐
    if(m_shape!=NULL)
    {
    //--- 磬鬣朦睇?篑蜞眍怅?
    m_shape.SetRightBorder(WIDTH_IN_PIXELS+VERT_BORDER);
    m_shape.SetYPos(m_ypos);
    m_shape.SetXPos(VERT_BORDER+SHAPE_SIZE*8);
    //--- 铗痂耋屐
    m_shape.Draw();
    }
    //---
    }
    //+------------------------------------------------------------------+
    //| 拟桄屙桢 忭桤 |
    //+------------------------------------------------------------------+
    void CTetrisField::Down()
    {
    if(m_shape==NULL || m_bover) return;
    //---
    int i,j,row,ypos,xpos;
    int x=(m_shape.GetXPos()-VERT_BORDER)/SHAPE_SIZE;
    int y=(m_shape.GetYPos()-HORZ_BORDER)/SHAPE_SIZE;
    int xsize=m_shape.GetXSize()/SHAPE_SIZE;
    //--- 龛骓栝 疱朦弭
    int bottom[4];
    for(i=0; i<4; i++) bottom=HEIGHT_IN_PIXELS+HORZ_BORDER;
    //--- 玎镨?龛骓栝 疱朦弭 镱?翳泱痤?
    for(i=FIELD_HEIGHT-1; i>y; i--)
    {
    for(j=0; j<xsize; j++)
    {
    if(m_field[j+x]!=0) bottom[j]=i*SHAPE_SIZE;
    }
    }
    //--- 镳钼屦桁, 祛骓?腓 妁?溻桡囹 忭桤
    if(!m_shape.CheckDown(bottom))
    {
    //--- 怦?玎镱腠屙? 溻桡囹 礤牦溧
    if(m_ypos==HORZ_BORDER)
    {
    m_bover=true;
    LabelOver();
    }
    //---
    int type=m_shape.GetType();
    string name=SHAPE_NAME+"0";
    string bmp=ObjectGetString(0,name,OBJPROP_BMPFILE);
    string field_name;
    //--- 耦玟噤桁 4 眍恹?犭铌??耱嚓囗?忡囔屙 翳泱瘥
    for(i=0; i<4; i++)
    {
    name=SHAPE_NAME+(string)i;
    x=ObjectGetInteger(0,name,OBJPROP_XDISTANCE);
    y=ObjectGetInteger(0,name,OBJPROP_YDISTANCE);
    xpos=(x-VERT_BORDER)/SHAPE_SIZE;
    ypos=(y-HORZ_BORDER)/SHAPE_SIZE;
    row=m_rows[ypos];
    field_name=FIELD_NAME+(string)row+"-"+(string)xpos;
    //--- 镱戾蜩?玎?蝾?戾耱?
    m_field[ypos][xpos]=type;
    //--- 耦玟喔?犭铌 ?镟疣戾蝠囔?犭铌?翳泱瘥
    ObjectCreate(0,field_name,OBJ_BITMAP_LABEL,0,0,0,0,0);
    ObjectSetInteger(0,field_name,OBJPROP_BACK,false);
    ObjectSetString(0,field_name,OBJPROP_BMPFILE,bmp);
    ObjectSetInteger(0,field_name,OBJPROP_XDISTANCE,x);
    ObjectSetInteger(0,field_name,OBJPROP_YDISTANCE,y);
    }
    //--- 箐嚯屐 箅铈屙眢?翳泱矬
    delete m_shape;
    m_shape=NULL;
    //--- 耦玟喔?眍怏?翳泱痼
    NewShape();
    //--- 镳钼屦屐 ?潲 ?箐嚯屐, 羼腓 眢骓?
    CheckAndDeleteRows();
    }
    else
    {
    //--- 镳钿铍驵屐 溻桄屙桢 忭桤
    m_ypos+=SHAPE_SIZE;
    m_shape.SetYPos(m_ypos);
    m_shape.Draw();
    }
    //---
    }
    //+------------------------------------------------------------------+
    //| 拟桄屙桢 怆邂? |
    //+------------------------------------------------------------------+
    void CTetrisField::Left()
    {
    if(m_shape==NULL || m_bover) return;
    //---
    int i,j;
    int y=(m_shape.GetYPos()-HORZ_BORDER)/SHAPE_SIZE;
    int x=(m_shape.GetXPos()+m_shape.GetXSize()-VERT_BORDER)/SHAPE_SIZE;
    int ysize=m_shape.GetYSize()/SHAPE_SIZE;
    //--- 疱朦弭 耠邂?铗 翳泱瘥
    int left[4]={VERT_BORDER,VERT_BORDER,VERT_BORDER,VERT_BORDER};
    //--- 忸琰旄?脲恹?铗 翳泱瘥 疱朦弭
    for(i=0; i<ysize; i++)
    {
    for(j=0; j<x; j++)
    {
    if(m_field[y+i][j]!=0)
    left=(j+1)*SHAPE_SIZE;
    }
    }
    //--- 羼腓 羼螯 牦溧 怆邂? 蝾 溻桡噱?
    if(m_shape.CheckLeft(left))
    {
    m_shape.Left();
    m_shape.Draw();
    }
    //---
    }
    //+------------------------------------------------------------------+
    //| 拟桄屙桢 怙疣忸 |
    //+------------------------------------------------------------------+
    void CTetrisField::Right()
    {
    if(m_shape==NULL || m_bover) return;
    //---
    int i,j;
    int y=(m_shape.GetYPos()-HORZ_BORDER)/SHAPE_SIZE;
    int x=(m_shape.GetXPos()-VERT_BORDER)/SHAPE_SIZE;
    int ysize=m_shape.GetYSize()/SHAPE_SIZE;
    //--- 疱朦弭 耧疣忄 铗 翳泱瘥
    int right[4];
    for(i=0; i<4; i++) right=WIDTH_IN_PIXELS+VERT_BORDER;
    //--- 忸琰旄?镳噔 铗 翳泱瘥 疱朦弭
    for(i=0; i<ysize; i++)
    {
    for(j=FIELD_WIDTH-1; j>=x; j--)
    {
    if(m_field[y+i][j]!=0)
    right=j*SHAPE_SIZE;
    }
    }
    //--- 篷腓 羼螯 牦溧 怙疣忸, 蝾 溻桡噱?
    if(m_shape.CheckRight(right))
    {
    m_shape.Right();
    m_shape.Draw();
    }
    //---
    }
    //+------------------------------------------------------------------+
    //| 项忸痤?翳泱瘥 |
    //+------------------------------------------------------------------+
    void CTetrisField::Rotate()
    {
    if(m_shape==NULL || m_bover) return;
    //---
    m_shape.Rotate();
    m_shape.Draw();
    }
    //+------------------------------------------------------------------+
    //| 琉铖囗桢 忭桤 |
    //+------------------------------------------------------------------+
    void CTetrisField::Drop()
    {
    if(m_shape==NULL || m_bover) return;
    //---
    int i,j;
    int x=(m_shape.GetXPos()-VERT_BORDER)/SHAPE_SIZE;
    int y=(m_shape.GetYPos()-HORZ_BORDER)/SHAPE_SIZE;
    int xsize=m_shape.GetXSize()/SHAPE_SIZE;
    //--- 龛骓栝 疱朦弭
    int bottom[4];
    for(i=0; i<4; i++) bottom=HEIGHT_IN_PIXELS+HORZ_BORDER;
    //--- 玎镨?龛骓栝 疱朦弭 镱?翳泱痤?
    for(i=FIELD_HEIGHT-1; i>=0; i--)
    {
    for(j=0; j<xsize; j++)
    {
    if(m_field[j+x]!=0)
    bottom[j]=i*SHAPE_SIZE;
    }
    }
    //--- 镳钼屦桁, 祛骓?腓 妁?溻桡囹 忭桤
    while(m_shape.CheckDown(bottom))
    {
    m_ypos+=SHAPE_SIZE;
    m_shape.SetYPos(m_ypos);
    m_shape.Draw();
    }
    //--- 耧痤忸鲨痼屐 镱怆屙桢 眍忸?翳泱瘥
    Down();
    //---
    }
    //+------------------------------------------------------------------+
    //| 橡钼屦赅 ?铟桉蜿??漕? |
    //+------------------------------------------------------------------+
    void CTetrisField::CheckAndDeleteRows()
    {
    int i,j,x,y,score,row,to_delete=0;
    int deleted[FIELD_HEIGHT];
    string name;
    //---
    for(i=0; i<FIELD_HEIGHT; i++)
    {
    for(j=0; j<FIELD_WIDTH; j++)
    {
    if(m_field[j]==0) break;
    }
    //--- 怦?麇殛?玎?螓, 礤?龛 钿眍?眢脲忸?
    if(j==FIELD_WIDTH)
    deleted[to_delete++]=i;
    }
    //--- 羼螯 黩?箐嚯螯
    if(to_delete>0)
    {
    score=10;
    if(to_delete==2) score=30;
    if(to_delete==3) score=70;
    if(to_delete>3) score*=to_delete*5;
    //--- 筢屦胳 赅痱桧觇
    for(i=0; i<to_delete; i++)
    {
    row=m_rows[deleted];
    for(j=0; j<FIELD_WIDTH; j++)
    {
    name=FIELD_NAME+(string)row+"-"+(string)j;
    x=ObjectGetInteger(0,name,OBJPROP_XDISTANCE);
    y=ObjectGetInteger(0,name,OBJPROP_YDISTANCE);
    ObjectSetString(0,name,OBJPROP_BMPFILE,"Tetris\\delete_block.bmp");
    ObjectSetInteger(0,name,OBJPROP_XDISTANCE,x+3);
    ObjectSetInteger(0,name,OBJPROP_YDISTANCE,y+3);
    }
    }
    ChartRedraw();
    Sleep(500);
    //--- 箐嚯桁 钺牝?
    for(i=0; i<to_delete; i++)
    {
    row=m_rows[deleted];
    for(j=0; j<FIELD_WIDTH; j++)
    {
    name=FIELD_NAME+(string)row+"-"+(string)j;
    ObjectDelete(0,name);
    }
    }
    ChartRedraw();
    //--- 箐嚯桁 ???镥疱戾耱桁 忮瘐龛?狃铠屙睇?犭铌?忭桤
    for(int d=0; d<to_delete; d++)
    {
    for(i=deleted[d]; i>0; i--)
    {
    row=m_rows[i-1];
    y=i*SHAPE_SIZE;
    for(j=0; j<FIELD_WIDTH; j++)
    {
    m_field[j]=m_field[i-1][j];
    name=FIELD_NAME+(string)row+"-"+(string)j;
    ObjectSetInteger(0,name,OBJPROP_YDISTANCE,y+HORZ_BORDER);
    }
    //--- ??箐嚯疙, 邈?眍戾?犷朦 礤 桉镱朦珞弪?
    m_rows=m_rows[i-1];
    }
    //--- 镳桫鸽 眍恹???
    for(j=0; j<FIELD_WIDTH; j++) m_field[0][j]=0;
    m_rows[0]=m_last_row++;
    }
    //--- 磬镨?眍恹?聍蛤
    m_score+=score;
    string strscore=string(m_score);
    ObjectSetString(0,SCORE_NAME+"1",OBJPROP_TEXT,strscore);
    ObjectSetString(0,SCORE_NAME,OBJPROP_TEXT,strscore);
    }
    //---
    }
    //+------------------------------------------------------------------+
    //| 袜滹桉?Game Over |
    //+------------------------------------------------------------------+
    void CTetrisField::LabelOver()
    {
    //--- 耥圜嚯?蝈睃
    ObjectCreate(0,LABELOVER_NAME+"1",OBJ_LABEL,0,0,0,0,0);
    ObjectSetInteger(0,LABELOVER_NAME+"1",OBJPROP_XDISTANCE,36+VERT_BORDER);
    ObjectSetInteger(0,LABELOVER_NAME+"1",OBJPROP_YDISTANCE,HEIGHT_IN_PIXELS/2+HORZ_BORDER);
    ObjectSetInteger(0,LABELOVER_NAME+"1",OBJPROP_BACK,false);
    ObjectSetInteger(0,LABELOVER_NAME+"1",OBJPROP_COLOR,Blue);
    ObjectSetString(0, LABELOVER_NAME+"1",OBJPROP_FONT,"Arial");
    ObjectSetInteger(0,LABELOVER_NAME+"1",OBJPROP_FONTSIZE,32);
    ObjectSetInteger(0,LABELOVER_NAME+"1",OBJPROP_ANCHOR,ANCHOR_LEFT_UPPER);
    ObjectSetDouble(0,LABELOVER_NAME+"1",OBJPROP_ANGLE,45.0);
    ObjectSetString(0,LABELOVER_NAME+"1",OBJPROP_TEXT,"Game Over");
    //--- 玎蝈?- 襦?蝈犟?
    ObjectCreate(0,LABELOVER_NAME,OBJ_LABEL,0,0,0,0,0);
    ObjectSetInteger(0,LABELOVER_NAME,OBJPROP_XDISTANCE,30+VERT_BORDER);
    ObjectSetInteger(0,LABELOVER_NAME,OBJPROP_YDISTANCE,HEIGHT_IN_PIXELS/2+HORZ_BORDER);
    ObjectSetInteger(0,LABELOVER_NAME,OBJPROP_BACK,false);
    ObjectSetInteger(0,LABELOVER_NAME,OBJPROP_COLOR,Yellow);
    ObjectSetString(0, LABELOVER_NAME,OBJPROP_FONT,"Arial");
    ObjectSetInteger(0,LABELOVER_NAME,OBJPROP_FONTSIZE,32);
    ObjectSetInteger(0,LABELOVER_NAME,OBJPROP_ANCHOR,ANCHOR_LEFT_UPPER);
    ObjectSetDouble(0,LABELOVER_NAME,OBJPROP_ANGLE,45.0);
    ObjectSetString(0,LABELOVER_NAME,OBJPROP_TEXT,"Game Over");
    //---
    }
    //+------------------------------------------------------------------+


    //+------------------------------------------------------------------+
    //| MT5_TetrisShape.mqh |
    //| Copyright ?2009, MetaQuotes Software Corp. |
    //| http://www.metaquotes.net |
    //+------------------------------------------------------------------+
    #property copyright "Copyright ?2009, MetaQuotes Software Corp."
    #property link "http://www.metaquotes.net"

    #define SHAPE_NAME "MT5TetrisShape"
    #define SHAPE_SIZE 16

    //+------------------------------------------------------------------+
    //| 拎珙恹?觌囫?翳泱瘥 蝈蝠桉? |
    //+------------------------------------------------------------------+
    class CTetrisShape
    {
    protected:
    int m_type;
    int m_xpos;
    int m_ypos;
    int m_xsize;
    int m_ysize;
    int m_prev_turn;
    int m_turn;
    int m_right_border;
    public:
    void CTetrisShape();
    void SetRightBorder(int border) { m_right_border=border; }
    void SetYPos(int ypos) { m_ypos=ypos; }
    void SetXPos(int xpos) { m_xpos=xpos; }
    int GetYPos() { return(m_ypos); }
    int GetXPos() { return(m_xpos); }
    int GetYSize() { return(m_ysize); }
    int GetXSize() { return(m_xsize); }
    int GetType() { return(m_type); }
    void Left() { m_xpos-=SHAPE_SIZE; }
    void Right() { m_xpos+=SHAPE_SIZE; }
    void Rotate() { m_prev_turn=m_turn; if(++m_turn>3) m_turn=0; }
    virtual void Draw() { return; }
    virtual bool CheckDown(int& pad_array[]);
    virtual bool CheckLeft(int& side_row[]);
    virtual bool CheckRight(int& side_row[]);
    };
    //+------------------------------------------------------------------+
    //| 暑眈蝠箨蝾?徉珙忸泐 觌囫襦 |
    //+------------------------------------------------------------------+
    void CTetrisShape::CTetrisShape()
    {
    m_type=0;
    m_ypos=0;
    m_xpos=0;
    m_xsize=SHAPE_SIZE;
    m_ysize=SHAPE_SIZE;
    m_prev_turn=0;
    m_turn=0;
    m_right_border=0;
    }
    //+------------------------------------------------------------------+
    //| 橡钼屦赅 忸珈铈眍耱?溻桡囹 忭桤 (潆 镟腙??牦徉) |
    //+------------------------------------------------------------------+
    bool CTetrisShape::CheckDown(int& pad_array[])
    {
    int i,xsize=m_xsize/SHAPE_SIZE;
    //---
    for(i=0; i<xsize; i++)
    {
    if(m_ypos+m_ysize>=pad_array) return(false);
    }
    //---
    return(true);
    }
    //+------------------------------------------------------------------+
    //| 橡钼屦赅 忸珈铈眍耱?溻桡囹 怆邂?(潆 镟腙??牦徉) |
    //+------------------------------------------------------------------+
    bool CTetrisShape::CheckLeft(int& side_row[])
    {
    int i,ysize=m_ysize/SHAPE_SIZE;
    //---
    for(i=0; i<ysize; i++)
    {
    if(m_xpos<=side_row) return(false);
    }
    //---
    return(true);
    }
    //+------------------------------------------------------------------+
    //| 橡钼屦赅 忸珈铈眍耱?溻桡囹 怙疣忸 (潆 镟腙??牦徉) |
    //+------------------------------------------------------------------+
    bool CTetrisShape::CheckRight(int& side_row[])
    {
    int i,ysize=m_ysize/SHAPE_SIZE;
    //---
    for(i=0; i<ysize; i++)
    {
    if(m_xpos+m_xsize>=side_row) return(false);
    }
    //---
    return(true);
    }
    //+------------------------------------------------------------------+
    //| 埋?翳泱瘥 磬耠邃簋蝰 铗 徉珙忸泐 觌囫襦 |
    //+------------------------------------------------------------------+
    //+------------------------------------------------------------------+
    //| 相腙?桤 4 牦徼觐? **** |
    //+------------------------------------------------------------------+
    class CTetrisShape1 : public CTetrisShape
    {
    public:
    //--- 觐眈蝠箨蝾?
    void CTetrisShape1()
    {
    int i;
    string name;
    //---
    for(i=0; i<4; i++)
    {
    name=SHAPE_NAME+(string)i;
    ObjectSetString(0,name,OBJPROP_BMPFILE,"Tetris\\red_block.bmp");
    }
    //--- 泐痂珙眚嚯? 镟腙?
    m_xsize=SHAPE_SIZE*4;
    m_ysize=SHAPE_SIZE;
    m_type=1;
    }
    //--- 铗痂耦怅?翳泱瘥
    virtual void Draw()
    {
    int i;
    string name;
    //---
    if(m_prev_turn!=m_turn)
    {
    //--- 猁豚 泐痂珙眚嚯? 镟腙?
    if(m_prev_turn==0 || m_prev_turn==2)
    {
    m_xsize=SHAPE_SIZE;
    m_ysize=SHAPE_SIZE*4;
    m_xpos+=SHAPE_SIZE;
    m_ypos-=SHAPE_SIZE;
    if(m_ypos<0) m_ypos=0;
    }
    else
    {
    m_xpos-=SHAPE_SIZE;
    if(m_xpos<0) m_xpos=0;
    m_ypos+=SHAPE_SIZE;
    m_xsize=SHAPE_SIZE*4;
    m_ysize=SHAPE_SIZE;
    }
    if(m_xpos+m_xsize>=m_right_border) m_xpos=m_right_border-m_xsize;
    m_prev_turn=m_turn;
    }
    if(m_turn==0 || m_turn==2)
    {
    //--- 泐痂珙眚嚯? 镟腙?
    for(i=0; i<4; i++)
    {
    name=SHAPE_NAME+(string)i;
    ObjectSetInteger(0,name,OBJPROP_XDISTANCE,m_xpos+i*SHAPE_SIZE);
    ObjectSetInteger(0,name,OBJPROP_YDISTANCE,m_ypos);
    }
    }
    else
    {
    //--- 忮痱桕嚯? 镟腙?
    for(i=0; i<4; i++)
    {
    name=SHAPE_NAME+(string)i;
    ObjectSetInteger(0,name,OBJPROP_XDISTANCE,m_xpos);
    ObjectSetInteger(0,name,OBJPROP_YDISTANCE,m_ypos+i*SHAPE_SIZE);
    }
    }
    }
    };
    //+------------------------------------------------------------------+
    //| 馏赈?? *** |
    //| * |
    //+------------------------------------------------------------------+
    class CTetrisShape2 : public CTetrisShape
    {
    public:
    //--- 觐眈蝠箨蝾?
    void CTetrisShape2()
    {
    int i;
    string name;
    //---
    for(i=0; i<4; i++)
    {
    name=SHAPE_NAME+(string)i;
    ObjectSetString(0,name,OBJPROP_BMPFILE,"Tetris\\blue_block.bmp");
    }
    //--- 泐痂珙眚嚯? 狍赈??
    m_xsize=SHAPE_SIZE*3;
    m_ysize=SHAPE_SIZE*2;
    m_type=2;
    }
    //--- 疣聍蛤 铒桉帼泐 镳祛筱铍桕?镱耠?镱忸痤蜞
    void CalculateTurn()
    {
    if(m_prev_turn!=m_turn)
    {
    switch(m_prev_turn)
    {
    case 0:
    case 2:
    m_xsize=SHAPE_SIZE*2;
    m_ysize=SHAPE_SIZE*3;
    break;
    case 1:
    case 3:
    m_xsize=SHAPE_SIZE*3;
    m_ysize=SHAPE_SIZE*2;
    break;
    }
    if(m_xpos+m_xsize>=m_right_border) m_xpos=m_right_border-m_xsize;
    m_prev_turn=m_turn;
    }
    }
    //--- 疣聍蛤 龛骓彘 沭囗桷?翳泱瘥
    virtual void CalculateBottom(int& bottom[])
    {
    switch(m_turn)
    {
    case 0:
    bottom[0]=m_ypos+SHAPE_SIZE;
    bottom[1]=m_ypos+SHAPE_SIZE;
    bottom[2]=m_ypos+2*SHAPE_SIZE;
    break;
    case 1:
    bottom[0]=m_ypos+3*SHAPE_SIZE;
    bottom[1]=m_ypos+3*SHAPE_SIZE;
    break;
    case 2:
    bottom[0]=m_ypos+2*SHAPE_SIZE;
    bottom[1]=m_ypos+2*SHAPE_SIZE;
    bottom[2]=m_ypos+2*SHAPE_SIZE;
    break;
    case 3:
    bottom[0]=m_ypos+3*SHAPE_SIZE;
    bottom[1]=m_ypos+SHAPE_SIZE;
    break;
    }
    }
    //--- 疣聍蛤 脲忸?沭囗桷?翳泱瘥
    virtual void CalculateLeft(int& left[])
    {
    switch(m_turn)
    {
    case 0:
    left[0]=m_xpos; // ***
    left[1]=m_xpos+2*SHAPE_SIZE; // *
    break;
    case 1:
    left[0]=m_xpos+SHAPE_SIZE; // *
    left[1]=m_xpos+SHAPE_SIZE; // *
    left[2]=m_xpos; // **
    break;
    case 2:
    left[0]=m_xpos; // *
    left[1]=m_xpos; // ***
    break;
    case 3:
    left[0]=m_xpos; // **
    left[1]=m_xpos; // *
    left[2]=m_xpos; // *
    break;
    }
    }
    //--- 疣聍蛤 镳噔铋 沭囗桷?翳泱瘥
    virtual void CalculateRight(int& right[])
    {
    switch(m_turn)
    {
    case 0:
    right[0]=m_xpos+3*SHAPE_SIZE; // ***
    right[1]=m_xpos+3*SHAPE_SIZE; // *
    break;
    case 1:
    right[0]=m_xpos+2*SHAPE_SIZE; // *
    right[1]=m_xpos+2*SHAPE_SIZE; // *
    right[2]=m_xpos+2*SHAPE_SIZE; // **
    break;
    case 2:
    right[0]=m_xpos+SHAPE_SIZE; // *
    right[1]=m_xpos+3*SHAPE_SIZE; // ***
    break;
    case 3:
    right[0]=m_xpos+2*SHAPE_SIZE; // **
    right[1]=m_xpos+SHAPE_SIZE; // *
    right[2]=m_xpos+SHAPE_SIZE; // *
    break;
    }
    }
    //--- 铗痂耦怅?翳泱瘥
    virtual void Draw()
    {
    int i;
    string name;
    //---
    CalculateTurn();
    switch(m_turn)
    {
    case 0:
    for(i=0; i<3; i++)
    {
    name=SHAPE_NAME+(string)i;
    ObjectSetInteger(0,name,OBJPROP_XDISTANCE,m_xpos+i*SHAPE_SIZE);
    ObjectSetInteger(0,name,OBJPROP_YDISTANCE,m_ypos);
    }
    name=SHAPE_NAME+"3";
    ObjectSetInteger(0,name,OBJPROP_XDISTANCE,m_xpos+2*SHAPE_SIZE);
    ObjectSetInteger(0,name,OBJPROP_YDISTANCE,m_ypos+SHAPE_SIZE);
    break;
    case 1:
    for(i=0; i<3; i++)
    {
    name=SHAPE_NAME+(string)i;
    ObjectSetInteger(0,name,OBJPROP_XDISTANCE,m_xpos+SHAPE_SIZE);
    ObjectSetInteger(0,name,OBJPROP_YDISTANCE,m_ypos+i*SHAPE_SIZE);
    }
    name=SHAPE_NAME+"3";
    ObjectSetInteger(0,name,OBJPROP_XDISTANCE,m_xpos);
    ObjectSetInteger(0,name,OBJPROP_YDISTANCE,m_ypos+2*SHAPE_SIZE);
    break;
    case 2:
    for(i=0; i<3; i++)
    {
    name=SHAPE_NAME+(string)i;
    ObjectSetInteger(0,name,OBJPROP_XDISTANCE,m_xpos+i*SHAPE_SIZE);
    ObjectSetInteger(0,name,OBJPROP_YDISTANCE,m_ypos+SHAPE_SIZE);
    }
    name=SHAPE_NAME+"3";
    ObjectSetInteger(0,name,OBJPROP_XDISTANCE,m_xpos);
    ObjectSetInteger(0,name,OBJPROP_YDISTANCE,m_ypos);
    break;
    case 3:
    for(i=0; i<3; i++)
    {
    name=SHAPE_NAME+(string)i;
    ObjectSetInteger(0,name,OBJPROP_XDISTANCE,m_xpos);
    ObjectSetInteger(0,name,OBJPROP_YDISTANCE,m_ypos+i*SHAPE_SIZE);
    }
    name=SHAPE_NAME+"3";
    ObjectSetInteger(0,name,OBJPROP_XDISTANCE,m_xpos+SHAPE_SIZE);
    ObjectSetInteger(0,name,OBJPROP_YDISTANCE,m_ypos);
    break;
    }
    }
    //--- 镳钼屦赅 忸珈铈眍耱?溻桡囹 忭桤
    virtual bool CheckDown(int& pad_array[])
    {
    int i,xsize=m_xsize/SHAPE_SIZE;
    int bottom[4];
    //--- 耥圜嚯?疣耨麒蜞屐 龛骓 沭囗桷?翳泱瘥
    CalculateBottom(bottom);
    //--- 玎蝈?耩噔龛??龛骓桁 疱朦弭铎
    for(i=0; i<xsize; i++)
    {
    if(bottom>=pad_array) return(false);
    }
    //---
    return(true);
    }
    //--- 镳钼屦赅 忸珈铈眍耱?溻桡囹 怆邂?
    virtual bool CheckLeft(int& side_row[])
    {
    int i,ysize=m_ysize/SHAPE_SIZE;
    int left[4];
    //--- 耥圜嚯?疣耨麒蜞屐 脲怏?沭囗桷?翳泱瘥
    CalculateLeft(left);
    //--- 玎蝈?耩噔龛??脲恹?疱朦弭铎
    for(i=0; i<ysize; i++)
    {
    if(left[i]<=side_row[i]) return(false);
    }
    //---
    return(true);
    }
    //--- 镳钼屦赅 忸珈铈眍耱?溻桡囹 怙疣忸
    virtual bool CheckRight(int& side_row[])
    {
    int i,ysize=m_ysize/SHAPE_SIZE;
    int right[4];
    //--- 耥圜嚯?疣耨麒蜞屐 镳噔簋 沭囗桷?翳泱瘥
    CalculateRight(right);
    //--- 玎蝈?耩噔龛??镳噔 疱朦弭铎
    for(i=0; i<ysize; i++)
    {
    if(right[i]>=side_row[i]) return(false);
    }
    //---
    return(true);
    }
    };
    //+------------------------------------------------------------------+
    //| 馏赈?T *** |
    //| * |
    //+------------------------------------------------------------------+
    class CTetrisShape3 : public CTetrisShape2
    {
    public:
    //--- 觐眈蝠箨蝾?
    void CTetrisShape3()
    {
    int i;
    string name;
    //---
    for(i=0; i<4; i++)
    {
    name=SHAPE_NAME+(string)i;
    ObjectSetString(0,name,OBJPROP_BMPFILE,"Tetris\\yellow_block.bmp");
    }
    //---
    m_type=3;
    }
    //--- 疣聍蛤 龛骓彘 沭囗桷?翳泱瘥
    virtual void CalculateBottom(int& bottom[])
    {
    switch(m_turn)
    {
    case 0:
    bottom[0]=m_ypos+SHAPE_SIZE;
    bottom[1]=m_ypos+2*SHAPE_SIZE;
    bottom[2]=m_ypos+SHAPE_SIZE;
    break;
    case 1:
    bottom[0]=m_ypos+2*SHAPE_SIZE;
    bottom[1]=m_ypos+3*SHAPE_SIZE;
    break;
    case 2:
    bottom[0]=m_ypos+2*SHAPE_SIZE;
    bottom[1]=m_ypos+2*SHAPE_SIZE;
    bottom[2]=m_ypos+2*SHAPE_SIZE;
    break;
    case 3:
    bottom[0]=m_ypos+3*SHAPE_SIZE;
    bottom[1]=m_ypos+2*SHAPE_SIZE;
    break;
    }
    }
    //--- 疣聍蛤 脲忸?沭囗桷?翳泱瘥
    virtual void CalculateLeft(int& left[])
    {
    switch(m_turn)
    {
    case 0:
    left[0]=m_xpos; // ***
    left[1]=m_xpos+SHAPE_SIZE; // *
    break;
    case 1:
    left[0]=m_xpos+SHAPE_SIZE; // *
    left[1]=m_xpos; // **
    left[2]=m_xpos+SHAPE_SIZE; // *
    break;
    case 2:
    left[0]=m_xpos+SHAPE_SIZE; // *
    left[1]=m_xpos; // ***
    break;
    case 3:
    left[0]=m_xpos; // *
    left[1]=m_xpos; // **
    left[2]=m_xpos; // *
    break;
    }
    }
    //--- 疣聍蛤 镳噔铋 沭囗桷?翳泱瘥
    virtual void CalculateRight(int& right[])
    {
    switch(m_turn)
    {
    case 0:
    right[0]=m_xpos+3*SHAPE_SIZE; // ***
    right[1]=m_xpos+2*SHAPE_SIZE; // *
    break;
    case 1:
    right[0]=m_xpos+2*SHAPE_SIZE; // *
    right[1]=m_xpos+2*SHAPE_SIZE; // **
    right[2]=m_xpos+2*SHAPE_SIZE; // *
    break;
    case 2:
    right[0]=m_xpos+2*SHAPE_SIZE; // *
    right[1]=m_xpos+3*SHAPE_SIZE; // ***
    break;
    case 3:
    right[0]=m_xpos+SHAPE_SIZE; // *
    right[1]=m_xpos+2*SHAPE_SIZE; // **
    right[2]=m_xpos+SHAPE_SIZE; // *
    break;
    }
    }
    //--- 铗痂耦怅?翳泱瘥
    virtual void Draw()
    {
    int i;
    string name;
    //---
    CalculateTurn();
    switch(m_turn)
    {
    case 0:
    for(i=0; i<3; i++)
    {
    name=SHAPE_NAME+(string)i;
    ObjectSetInteger(0,name,OBJPROP_XDISTANCE,m_xpos+i*SHAPE_SIZE);
    ObjectSetInteger(0,name,OBJPROP_YDISTANCE,m_ypos);
    }
    name=SHAPE_NAME+"3";
    ObjectSetInteger(0,name,OBJPROP_XDISTANCE,m_xpos+SHAPE_SIZE);
    ObjectSetInteger(0,name,OBJPROP_YDISTANCE,m_ypos+SHAPE_SIZE);
    break;
    case 1:
    for(i=0; i<3; i++)
    {
    name=SHAPE_NAME+(string)i;
    ObjectSetInteger(0,name,OBJPROP_XDISTANCE,m_xpos+SHAPE_SIZE);
    ObjectSetInteger(0,name,OBJPROP_YDISTANCE,m_ypos+i*SHAPE_SIZE);
    }
    name=SHAPE_NAME+"3";
    ObjectSetInteger(0,name,OBJPROP_XDISTANCE,m_xpos);
    ObjectSetInteger(0,name,OBJPROP_YDISTANCE,m_ypos+SHAPE_SIZE);
    break;
    case 2:
    for(i=0; i<3; i++)
    {
    name=SHAPE_NAME+(string)i;
    ObjectSetInteger(0,name,OBJPROP_XDISTANCE,m_xpos+i*SHAPE_SIZE);
    ObjectSetInteger(0,name,OBJPROP_YDISTANCE,m_ypos+SHAPE_SIZE);
    }
    name=SHAPE_NAME+"3";
    ObjectSetInteger(0,name,OBJPROP_XDISTANCE,m_xpos+SHAPE_SIZE);
    ObjectSetInteger(0,name,OBJPROP_YDISTANCE,m_ypos);
    break;
    case 3:
    for(i=0; i<3; i++)
    {
    name=SHAPE_NAME+(string)i;
    ObjectSetInteger(0,name,OBJPROP_XDISTANCE,m_xpos);
    ObjectSetInteger(0,name,OBJPROP_YDISTANCE,m_ypos+i*SHAPE_SIZE);
    }
    name=SHAPE_NAME+"3";
    ObjectSetInteger(0,name,OBJPROP_XDISTANCE,m_xpos+SHAPE_SIZE);
    ObjectSetInteger(0,name,OBJPROP_YDISTANCE,m_ypos+SHAPE_SIZE);
    break;
    }
    }
    };
    //+------------------------------------------------------------------+
    //| 馏赈?L *** |
    //| * |
    //+------------------------------------------------------------------+
    class CTetrisShape4 : public CTetrisShape2
    {
    public:
    //--- 觐眈蝠箨蝾?
    void CTetrisShape4()
    {
    int i;
    string name;
    //---
    for(i=0; i<4; i++)
    {
    name=SHAPE_NAME+(string)i;
    ObjectSetString(0,name,OBJPROP_BMPFILE,"Tetris\\green_block.bmp");
    }
    ChartRedraw();
    //---
    m_type=4;
    }
    //--- 疣聍蛤 龛骓彘 沭囗桷?翳泱瘥
    virtual void CalculateBottom(int& bottom[])
    {
    switch(m_turn)
    {
    case 0:
    bottom[0]=m_ypos+2*SHAPE_SIZE;
    bottom[1]=m_ypos+SHAPE_SIZE;
    bottom[2]=m_ypos+SHAPE_SIZE;
    break;
    case 1:
    bottom[0]=m_ypos+SHAPE_SIZE;
    bottom[1]=m_ypos+3*SHAPE_SIZE;
    break;
    case 2:
    bottom[0]=m_ypos+2*SHAPE_SIZE;
    bottom[1]=m_ypos+2*SHAPE_SIZE;
    bottom[2]=m_ypos+2*SHAPE_SIZE;
    break;
    case 3:
    bottom[0]=m_ypos+3*SHAPE_SIZE;
    bottom[1]=m_ypos+3*SHAPE_SIZE;
    break;
    }
    }
    //--- 疣聍蛤 脲忸?沭囗桷?翳泱瘥
    virtual void CalculateLeft(int& left[])
    {
    switch(m_turn)
    {
    case 0:
    left[0]=m_xpos; // ***
    left[1]=m_xpos; // *
    break;
    case 1:
    left[0]=m_xpos; // **
    left[1]=m_xpos+SHAPE_SIZE; // *
    left[2]=m_xpos+SHAPE_SIZE; // *
    break;
    case 2:
    left[0]=m_xpos+2*SHAPE_SIZE; // *
    left[1]=m_xpos; // ***
    break;
    case 3:
    left[0]=m_xpos; // *
    left[1]=m_xpos; // *
    left[2]=m_xpos; // **
    break;
    }
    }
    //--- 疣聍蛤 镳噔铋 沭囗桷?翳泱瘥
    virtual void CalculateRight(int& right[])
    {
    switch(m_turn)
    {
    case 0:
    right[0]=m_xpos+3*SHAPE_SIZE; // ***
    right[1]=m_xpos+SHAPE_SIZE; // *
    break;
    case 1:
    right[0]=m_xpos+2*SHAPE_SIZE; // **
    right[1]=m_xpos+2*SHAPE_SIZE; // *
    right[2]=m_xpos+2*SHAPE_SIZE; // *
    break;
    case 2:
    right[0]=m_xpos+3*SHAPE_SIZE; // *
    right[1]=m_xpos+3*SHAPE_SIZE; // ***
    break;
    case 3:
    right[0]=m_xpos+SHAPE_SIZE; // *
    right[1]=m_xpos+SHAPE_SIZE; // *
    right[2]=m_xpos+2*SHAPE_SIZE; // **
    break;
    }
    }
    //--- 铗痂耦怅?翳泱瘥
    virtual void Draw()
    {
    int i;
    string name;
    //---
    CalculateTurn();
    switch(m_turn)
    {
    case 0:
    for(i=0; i<3; i++)
    {
    name=SHAPE_NAME+(string)i;
    ObjectSetInteger(0,name,OBJPROP_XDISTANCE,m_xpos+i*SHAPE_SIZE);
    ObjectSetInteger(0,name,OBJPROP_YDISTANCE,m_ypos);
    }
    name=SHAPE_NAME+"3";
    ObjectSetInteger(0,name,OBJPROP_XDISTANCE,m_xpos);
    ObjectSetInteger(0,name,OBJPROP_YDISTANCE,m_ypos+SHAPE_SIZE);
    break;
    case 1:
    for(i=0; i<3; i++)
    {
    name=SHAPE_NAME+(string)i;
    ObjectSetInteger(0,name,OBJPROP_XDISTANCE,m_xpos+SHAPE_SIZE);
    ObjectSetInteger(0,name,OBJPROP_YDISTANCE,m_ypos+i*SHAPE_SIZE);
    }
    name=SHAPE_NAME+"3";
    ObjectSetInteger(0,name,OBJPROP_XDISTANCE,m_xpos);
    ObjectSetInteger(0,name,OBJPROP_YDISTANCE,m_ypos);
    break;
    case 2:
    for(i=0; i<3; i++)
    {
    name=SHAPE_NAME+(string)i;
    ObjectSetInteger(0,name,OBJPROP_XDISTANCE,m_xpos+i*SHAPE_SIZE);
    ObjectSetInteger(0,name,OBJPROP_YDISTANCE,m_ypos+SHAPE_SIZE);
    }
    name=SHAPE_NAME+"3";
    ObjectSetInteger(0,name,OBJPROP_XDISTANCE,m_xpos+2*SHAPE_SIZE);
    ObjectSetInteger(0,name,OBJPROP_YDISTANCE,m_ypos);
    break;
    case 3:
    for(i=0; i<3; i++)
    {
    name=SHAPE_NAME+(string)i;
    ObjectSetInteger(0,name,OBJPROP_XDISTANCE,m_xpos);
    ObjectSetInteger(0,name,OBJPROP_YDISTANCE,m_ypos+i*SHAPE_SIZE);
    }
    name=SHAPE_NAME+"3";
    ObjectSetInteger(0,name,OBJPROP_XDISTANCE,m_xpos+SHAPE_SIZE);
    ObjectSetInteger(0,name,OBJPROP_YDISTANCE,m_ypos+2*SHAPE_SIZE);
    break;
    }
    }
    };
    //+------------------------------------------------------------------+
    //| 馏赈?寝 ** |
    //| ** |
    //+------------------------------------------------------------------+
    class CTetrisShape5 : public CTetrisShape2
    {
    public:
    //--- 觐眈蝠箨蝾?
    void CTetrisShape5()
    {
    int i;
    string name;
    //---
    for(i=0; i<4; i++)
    {
    name=SHAPE_NAME+(string)i;
    ObjectSetString(0,name,OBJPROP_BMPFILE,"Tetris\\magenta_block.bmp");
    }
    //---
    m_type=5;
    }
    //--- 疣聍蛤 龛骓彘 沭囗桷?翳泱瘥
    virtual void CalculateBottom(int& bottom[])
    {
    switch(m_turn)
    {
    case 0:
    case 2:
    bottom[0]=m_ypos+SHAPE_SIZE;
    bottom[1]=m_ypos+2*SHAPE_SIZE;
    bottom[2]=m_ypos+2*SHAPE_SIZE;
    break;
    case 1:
    case 3:
    bottom[0]=m_ypos+3*SHAPE_SIZE;
    bottom[1]=m_ypos+2*SHAPE_SIZE;
    break;
    }
    }
    //--- 疣聍蛤 脲忸?沭囗桷?翳泱瘥
    virtual void CalculateLeft(int& left[])
    {
    switch(m_turn)
    {
    case 0:
    case 2:
    left[0]=m_xpos; // **
    left[1]=m_xpos+SHAPE_SIZE; // **
    break;
    case 1:
    case 3:
    left[0]=m_xpos+SHAPE_SIZE; // *
    left[1]=m_xpos; // **
    left[2]=m_xpos; // *
    break;
    }
    }
    //--- 疣聍蛤 镳噔铋 沭囗桷?翳泱瘥
    virtual void CalculateRight(int& right[])
    {
    switch(m_turn)
    {
    case 0:
    case 2:
    right[0]=m_xpos+2*SHAPE_SIZE; // **
    right[1]=m_xpos+3*SHAPE_SIZE; // **
    break;
    case 1:
    case 3:
    right[0]=m_xpos+2*SHAPE_SIZE; // *
    right[1]=m_xpos+2*SHAPE_SIZE; // **
    right[2]=m_xpos+SHAPE_SIZE; // *
    break;
    }
    }
    //--- 铗痂耦怅?翳泱瘥
    virtual void Draw()
    {
    int i;
    string name;
    //---
    CalculateTurn();
    switch(m_turn)
    {
    case 0:
    case 2:
    for(i=0; i<2; i++)
    {
    name=SHAPE_NAME+(string)i;
    ObjectSetInteger(0,name,OBJPROP_XDISTANCE,m_xpos+i*SHAPE_SIZE);
    ObjectSetInteger(0,name,OBJPROP_YDISTANCE,m_ypos);
    }
    for(i=2; i<4; i++)
    {
    name=SHAPE_NAME+(string)i;
    ObjectSetInteger(0,name,OBJPROP_XDISTANCE,m_xpos+(i-1)*SHAPE_SIZE);
    ObjectSetInteger(0,name,OBJPROP_YDISTANCE,m_ypos+SHAPE_SIZE);
    }
    break;
    case 1:
    case 3:
    for(i=0; i<2; i++)
    {
    name=SHAPE_NAME+(string)i;
    ObjectSetInteger(0,name,OBJPROP_XDISTANCE,m_xpos);
    ObjectSetInteger(0,name,OBJPROP_YDISTANCE,m_ypos+(i+1)*SHAPE_SIZE);
    }
    for(i=2; i<4; i++)
    {
    name=SHAPE_NAME+(string)i;
    ObjectSetInteger(0,name,OBJPROP_XDISTANCE,m_xpos+SHAPE_SIZE);
    ObjectSetInteger(0,name,OBJPROP_YDISTANCE,m_ypos+(i-2)*SHAPE_SIZE);
    }
    break;
    }
    }
    };
    //+------------------------------------------------------------------+
    //| 鼠徼?桤 4 牦徼觐? ** |
    //| ** |
    //+------------------------------------------------------------------+
    class CTetrisShape6 : public CTetrisShape
    {
    public:
    //--- 觐眈蝠箨蝾?
    void CTetrisShape6()
    {
    int i;
    string name;
    //---
    for(i=0; i<4; i++)
    {
    name=SHAPE_NAME+(string)i;
    ObjectSetString(0,name,OBJPROP_BMPFILE,"Tetris\\orange_block.bmp");
    }
    //--- 泐痂珙眚嚯? 镟腙?
    m_xsize=SHAPE_SIZE*2;
    m_ysize=SHAPE_SIZE*2;
    m_type=6;
    }
    //--- 铗痂耦怅?翳泱瘥
    virtual void Draw()
    {
    int i;
    string name;
    //---
    for(i=0; i<2; i++)
    {
    name=SHAPE_NAME+(string)i;
    ObjectSetInteger(0,name,OBJPROP_XDISTANCE,m_xpos+i*SHAPE_SIZE);
    ObjectSetInteger(0,name,OBJPROP_YDISTANCE,m_ypos);
    }
    for(i=2; i<4; i++)
    {
    name=SHAPE_NAME+(string)i;
    ObjectSetInteger(0,name,OBJPROP_XDISTANCE,m_xpos+(i-2)*SHAPE_SIZE);
    ObjectSetInteger(0,name,OBJPROP_YDISTANCE,m_ypos+SHAPE_SIZE);
    }
    }
    };
    //+------------------------------------------------------------------+
    //| 馏赈?寝 ** |
    //| ** |
    //+------------------------------------------------------------------+
    class CTetrisShape7 : public CTetrisShape2
    {
    public:
    //--- 觐眈蝠箨蝾?
    void CTetrisShape7()
    {
    int i;
    string name;
    //---
    for(i=0; i<4; i++)
    {
    name=SHAPE_NAME+(string)i;
    ObjectSetString(0,name,OBJPROP_BMPFILE,"Tetris\\brown_block.bmp");
    }
    //---
    m_type=7;
    }
    //--- 疣聍蛤 龛骓彘 沭囗桷?翳泱瘥
    virtual void CalculateBottom(int& bottom[])
    {
    switch(m_turn)
    {
    case 0:
    case 2:
    bottom[0]=m_ypos+2*SHAPE_SIZE;
    bottom[1]=m_ypos+2*SHAPE_SIZE;
    bottom[2]=m_ypos+SHAPE_SIZE;
    break;
    case 1:
    case 3:
    bottom[0]=m_ypos+2*SHAPE_SIZE;
    bottom[1]=m_ypos+3*SHAPE_SIZE;
    break;
    }
    }
    //--- 疣聍蛤 脲忸?沭囗桷?翳泱瘥
    virtual void CalculateLeft(int& left[])
    {
    switch(m_turn)
    {
    case 0:
    case 2:
    left[0]=m_xpos+SHAPE_SIZE; // **
    left[1]=m_xpos; // **
    break;
    case 1:
    case 3:
    left[0]=m_xpos; // *
    left[1]=m_xpos; // **
    left[2]=m_xpos+SHAPE_SIZE; // *
    break;
    }
    }
    //--- 疣聍蛤 镳噔铋 沭囗桷?翳泱瘥
    virtual void CalculateRight(int& right[])
    {
    switch(m_turn)
    {
    case 0:
    case 2:
    right[0]=m_xpos+3*SHAPE_SIZE; // **
    right[1]=m_xpos+2*SHAPE_SIZE; // **
    break;
    case 1:
    case 3:
    right[0]=m_xpos+SHAPE_SIZE; // *
    right[1]=m_xpos+2*SHAPE_SIZE; // **
    right[2]=m_xpos+2*SHAPE_SIZE; // *
    break;
    }
    }
    //--- 铗痂耦怅?翳泱瘥
    virtual void Draw()
    {
    int i;
    string name;
    //---
    CalculateTurn();
    switch(m_turn)
    {
    case 0:
    case 2:
    for(i=0; i<2; i++)
    {
    name=SHAPE_NAME+(string)i;
    ObjectSetInteger(0,name,OBJPROP_XDISTANCE,m_xpos+(i+1)*SHAPE_SIZE);
    ObjectSetInteger(0,name,OBJPROP_YDISTANCE,m_ypos);
    }
    for(i=2; i<4; i++)
    {
    name=SHAPE_NAME+(string)i;
    ObjectSetInteger(0,name,OBJPROP_XDISTANCE,m_xpos+(i-2)*SHAPE_SIZE);
    ObjectSetInteger(0,name,OBJPROP_YDISTANCE,m_ypos+SHAPE_SIZE);
    }
    break;
    case 1:
    case 3:
    for(i=0; i<2; i++)
    {
    name=SHAPE_NAME+(string)i;
    ObjectSetInteger(0,name,OBJPROP_XDISTANCE,m_xpos);
    ObjectSetInteger(0,name,OBJPROP_YDISTANCE,m_ypos+i*SHAPE_SIZE);
    }
    for(i=2; i<4; i++)
    {
    name=SHAPE_NAME+(string)i;
    ObjectSetInteger(0,name,OBJPROP_XDISTANCE,m_xpos+SHAPE_SIZE);
    ObjectSetInteger(0,name,OBJPROP_YDISTANCE,m_ypos+(i-1)*SHAPE_SIZE);
    }
    break;
    }
    }
    };
    //+------------------------------------------------------------------+[/i][/i][/i][/i]
     
  2. 那些乱码可以变正常吗
     
  3. 那些乱码应该是俄文的关系,mt5有下载了吗?
     
  4. MT5还没有提供下载。这是一个提前公布的一个EA源码,是一个运行于MT5上的俄罗斯方块游戏,以显示MT5优异的面向对象的编程能力。
     
  5. 那么以前mt4的代码要大改了吧?
     
  6. 肯定要大改,不过,两种软件可以并用!
     
  7. 这样的mt5简直变态了。。
     
  8. nix

    nix

    瞄了一眼,貌似写的是俄罗斯方块,刚开始看,不要看那么“复杂”的好不好
     
  9. 是c++写的,switch(lparam)象是win32里的东西,学过win32,现在忘了。

    前年看到介绍说采用了面对对象技术的mt5(mt4采用了部分如缺省形参,地址引用)没有指针,没有三元运算符,现在看全有,只是继承像c#那样采用的单继承。基本上就是完全的c++。
    提供了了15种类型的函数。用string和date time甚至可以开发基于基本面的交易策略和基本技术混合型的交易策略。
    一系列array函数和accoutinfo可以开发多帐号,多品种,多周期的模型。以针对各个国家不同交易政策制策略。
    在arrays还添加了list,tree,treenode,等数据结构让你写算法,有把每个交易员变成程序艺术家的打算。
    不过估计学习周期的很长。因为每个函数里还有大量的参数需要记忆。