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