我编写的俄罗斯方块源代码,支持单机对战,可定制方块数,键盘等!!! (转)[@more@]

没有UI部分,要修改玩家人数,方块数,颜色,键盘配置请看CGameController的Start函数,请大家提提意见,我想做成像上海热线的俄罗斯方块,支持网络对战。(应该不改动程序的整体结构),

//head file  Diamond.h

// Diamond.h: interface for the CDiamond class.
//
//

#if !defined(AFX_DIAMOND_H__1B1DE2E7_A3B8_4D43_9079_AF2AC021F899__INCLUDED_)
#define AFX_DIAMOND_H__1B1DE2E7_A3B8_4D43_9079_AF2AC021F899__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000

class IGame;  //inteface of game ,one mean a player
class IGameController;  //inteface of game controller,control communication of players

typedef CTypedPtrList CGames;  //all player in the game

class  IGameController
{
//construction/destruction
public:
 virtual ~IGameController(){};

//public interface
public:
 virtual void OnEraseLines(IGame*,long) = 0 ;  //when a player erase lines,call it
 virtual void OnGameOver(IGame*) = 0 ;  //when a player dies ,call it
};

//a block of a diamond
struct CBlock
{
 long  m_x ;
 long  m_y ;
};

//
class  IGame:public Cobject
{
//construction/destruction
public:
 virtual ~IGame(){};

//public interface
public:
 virtual void OnKey(long) = 0 ;  //recieve key event
 virtual void Start() = 0 ;  //recieve start event
 virtual bool IsOver()=0 ;  //if the player die?
 virtual void OnEraseLines(IGame* fromGame,long lines)=0; /* called by the game controller when other player erase lines .*/
 virtual void Draw()=0; // draw self
};

//draw inteface
class IDrawDrv
{
//construction/destruction
public:
 virtual ~IDrawDrv(){};

//public interface
public:
 virtual ShowBlocks(long x,long y,long xs,long ys)=0;  //show blocks
 virtual HideBlocks(long x,long y,long xs,long ys)=0;  //hide blocks
};

//implement of IDrawDrv of windows

class CDrawDrvWindowsImp :public IDrawDrv
{

//construction/destruction
public:
 CDrawDrvWindowsImp(POINT,COLORREF,COLORREF,long,CDC*);
 virtual ~CDrawDrvWindowsImp(){};
private:
 CDrawDrvWindowsImp(const CDrawDrvWindowsImp&);
 void operator=(const  CDrawDrvWindowsImp&);

//public interface
public:
 virtual ShowBlocks(long x,long y,long xs,long ys); 
 virtual HideBlocks(long x,long y,long xs,long ys);

//implements
private:
 POINT  m_OrgPoint ; 
 COLORREF m_BlockColor;  //block color
 COLORREF m_BgColor;   // bg color
 long  m_BlockSize;  // pts of a block
 CDC*  m_pDC; 
 
 CBrush  m_BlockBrush; 
 CBrush  m_BorderBrush;
 CBrush  m_BgBrush;
};

//
class CGameController:public IGameController
{

//construction/destruction
public :
 CGameController();
 ~CGameController();
private:
 
 CGameController(const CGameController&);
 void operator=(const  CGameController&);

//public interface
public:
 virtual void OnEraseLines(IGame*,long) ;//called by players ,when them erase lines
 virtual void OnGameOver(IGame*);  //called by players,when them die

void  Start(CDC*);  //start game!
 void  Pause();  //pause game,or restart game
 void  End();  //end game

void  OnDraw();  //paint event
 void  OnKey(long key);  //key event

//implements
private:
 CGames  m_Games;
 CDC*  m_pDC;
 enum GamesStatus
 {
 STATUS_TO_START,
  STATUS_PLAYING,
 STATUS_PAUSE,
 STATUS_END
 };
 GamesStatus m_Status;
 void  Clean();
};

class CKeyController //key config ,player can custome their key
{
//construction/destruction
public:
 CKeyController(){};
 ~CKeyController(){};
private:
 void  operator=(const CKeyController&);

//public interface
public:
 long  RIGHT;
 long  LEFT ;
 long  DOWN;
 long  NEXT;
 long  DROP;
 long  START;
  friend class CGame;
 friend class CGameController;

//implements

};

//diamond
class CDiamond
{
//construction/destruction
public:
 static CDiamond* CreateAnInstance(long x,long y);  //random create a diamond
 CDiamond(const CDiamond&);
 ~CDiamond();
private :
 CDiamond();
 void operator=(const  CDiamond&);

//public interface
public:
 long  GetBlockCount();  //get blocks count, to support other type diamonds
 CBlock* GetBlock(long);  // get a block ,by index
 void  Left();  // left a diamond
 void  Right();  // right a diamond
 void  Down();  //down a diamond
 void  Next();  //retate a diamond
 void  Draw(IDrawDrv*,bool);  //draw a diamond
 long  GetStartX(){return m_x;}; //get start x position
 long  GetStartY(){return m_y;};  // get start y position

//implements
private:
 long  m_x ;
 long  m_y ;
 long  m_index;
 long m_Blocks;
  CBlock* m_pBlocks;
};

//player of game
class CGame:public IGame
{
//construction/destruction
public:
 CGame(IGameController*,IDrawDrv*,CKeyController,long wBlocks,long hBlocks);
 virtual ~CGame();
private:
 CGame(const CGame&);
 void operator=(const CGame&);

//public interface
public:
 virtual void OnKey(long);  //recieve key event
 virtual void Start();  //recieve start event
 virtual bool IsOver();  //if is die?
 virtual void OnEraseLines(IGame* fromGame,long lines);
  void Draw();

//implements 
private:

void Init();  //init
 void LeftDiamond(); 
 void RightDiamond();
 bool CanDown();
 void DownDiamond();
 void NextDiamond();
 void DropDiamond();
 long EraseLines();
 long GetBlockInfo(long,long);  //get block info of game ,1 mean is have block,0 mean no block,
 void SetBlockInfo(long x,long y,long v);
 void OnDownADiamond();  //called when a diamond can not down more
  bool IsValidDiamond(CDiamond*);  //if the diamond is valid ?
 void Clean();  //resource clean
 void Show();//debug //debug use,to print data struct of the player
  void OnGameOver();

private:
 long  m_WidthBlocks  ;
 long  m_HeightBlocks ;
 long* m_pBlocks;
 CDiamond* m_pCurrDiamond; 
 IGameController*  m_pController;
 IDrawDrv*  m_pDraw;
 CKeyController m_KeyCtl;

enum GameStatus
 {
 STATUS_PLAYING,
 STATUS_GAMEOVER
 };
 GameStatus  m_Status ;
 
};

#endif // !defined(AFX_DIAMOND_H__1B1DE2E7_A3B8_4D43_9079_AF2AC021F899__INCLUDED_)

//implement  Diamond.cpp

// Diamond.cpp: implementation of the CDiamond class.
//
//

#include "stdafx.h"
#include "MDiamond.h"
#include "Diamond.h"

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

//block data
CBlock  g_Blocks0[] = {{0,-1},{0,-2},{1,-1},{1,-2}};

CBlock  g_Blocks1[] = {{0,-1},{1,-1},{1,-2},{1,-3}};
CBlock  g_Blocks2[] = {{0,-2},{1,-2},{2,-2},{2,-1}};
CBlock  g_Blocks3[] = {{1,-1},{1,-2},{1,-3},{2,-3}};
CBlock  g_Blocks4[] = {{0,-1},{1,-1},{2,-1},{0,-2}};

CBlock  g_Blocks5[] = {{1,-1},{1,-2},{1,-3},{2,-1}};
CBlock  g_Blocks6[] = {{0,-1},{1,-1},{2,-1},{2,-2}};
CBlock  g_Blocks7[] = {{1,-1},{1,-2},{1,-3},{0,-3}};
CBlock  g_Blocks8[] = {{0,-1},{0,-2},{1,-2},{2,-2}};

CBlock  g_Blocks9[] = {{0,-1},{1,-1},{2,-1},{1,-2}};
CBlock  g_Blocks10[] = {{0,-2},{1,-1},{1,-2},{1,-3}};
CBlock  g_Blocks11[] = {{1,-1},{0,-2},{1,-2},{2,-2}};
CBlock  g_Blocks12[] = {{1,-1},{1,-2},{1,-3},{2,-2}};

CBlock  g_Blocks13[] = {{0,-1},{0,-2},{1,-2},{1,-3}};
CBlock  g_Blocks14[] = {{0,-2},{1,-2},{1,-1},{2,-1}};

CBlock  g_Blocks15[] = {{1,-1},{1,-2},{0,-2},{0,-3}};
CBlock  g_Blocks16[] = {{0,-1},{1,-1},{1,-2},{2,-2}};

CBlock  g_Blocks17[] = {{0,-1},{1,-1},{2,-1},{3,-1}};
CBlock  g_Blocks18[] = {{2,-1},{2,-2},{2,-3},{2,-4}};

CBlock* g_Blocks[] = {g_Blocks0,
 
  g_Blocks1,
  g_Blocks2,
  g_Blocks3,
  g_Blocks4,

g_Blocks5,
  g_Blocks6,
  g_Blocks7,
  g_Blocks8,
 
  g_Blocks9,
  g_Blocks10,
  g_Blocks11,
  g_Blocks12,
 
  g_Blocks13,
  g_Blocks14,
 
  g_Blocks15,
  g_Blocks16,
 
  g_Blocks17,
  g_Blocks18};

long g_BlockNexts[] = {0,2,3,4,1,6,7,8,5,10,11,12,9,14,13,16,15,18,17};

//CDiamond
CDiamond::CDiamond()
{
}

CDiamond* CDiamond::CreateAnInstance(long x,long y)
{
 static int LastIndex = 0 ;
 CDiamond* d = new CDiamond();
 srand((unsigned)time(NULL)+LastIndex);
 long index = rand() % 19  ;
 //long index = 17;
  d->m_Blocks = 4 ;
 d->m_index = index ;
 d->m_x = x;
 d->m_y = y;
 d->m_pBlocks = g_Blocks[index] ;

LastIndex = index ;
 return d;
}

CDiamond::CDiamond(const CDiamond& d)
{
 m_x  = d.m_x ;
 m_y  = d.m_y ;
 m_index = d.m_index;
 m_Blocks = d.m_Blocks ;
  m_pBlocks = d.m_pBlocks ;
}

CDiamond::~CDiamond()
{
 
}

long CDiamond::GetBlockCount()
{
 return m_Blocks ;
}

CBlock*  CDiamond::GetBlock(long i)
{
 return &m_pBlocks[i];
}

void  CDiamond::Left()
{
 m_x -- ;
}

void CDiamond::Right()
{
 m_x ++ ;
}

void CDiamond::Next()
{
 m_index = g_BlockNexts[m_index];
 m_pBlocks = g_Blocks[m_index];
}

void CDiamond::Down()
{
 m_y -- ;
}

void CDiamond::Draw(IDrawDrv* d,bool bShow=true)
{
 long count = GetBlockCount();
 for(int i=0;i {
 CBlock* b = GetBlock(i);
 if(bShow)
 {
 d->ShowBlocks(m_x+b->m_x,m_y+b->m_y,1,1);
 }
 else
 {
 d->HideBlocks(m_x+b->m_x,m_y+b->m_y,1,1);
 }
 }
}

//CGame
CGame::CGame(IGameController* p,IDrawDrv* d,CKeyController key,long wBlocks,long hBlocks)
: m_WidthBlocks(wBlocks),m_HeightBlocks(hBlocks),m_KeyCtl(key)
{
 m_pController = p ;
 
 
 //pointers,need to be clean
 m_pBlocks = NULL;
 m_pCurrDiamond = NULL;
 m_pDraw = d ;
 Init();
}

void  CGame::OnKey(long keycode)
{
 if(keycode==-1)  //-1 mean down
 {
 DownDiamond();
 }
 if(keycode==m_KeyCtl.LEFT)
 {
 LeftDiamond();
 }
 if(keycode==m_KeyCtl.RIGHT)
 {
 RightDiamond();
 }
 if(keycode==m_KeyCtl.DOWN)
 {
 DownDiamond();
 }
 if(keycode==m_KeyCtl.NEXT)
 {
 NextDiamond();
 }
 if(keycode==m_KeyCtl.DROP)
 {
 DropDiamond();
 }
 
}

CGame::~CGame()
{
 Clean();
}

void  CGame::Init()
{
 if(NULL==m_pBlocks)
 {
 long count = m_WidthBlocks * m_HeightBlocks ;
 m_pBlocks = new long[count];
 for(int i=0 ;i {
 m_pBlocks[i] = 0;
 }
 }
 if(NULL==m_pCurrDiamond)
 {
 m_pCurrDiamond = CDiamond::CreateAnInstance(m_WidthBlocks/2,m_HeightBlocks);
 }

}

void CGame::Clean()
{
 if(m_pCurrDiamond!=NULL) delete m_pCurrDiamond;
 if(m_pBlocks!=NULL)  delete [] m_pBlocks;
 if(m_pDraw!=NULL)  delete m_pDraw ;
}

void  CGame::Start()
{
 Init();
 m_Status = STATUS_PLAYING;
}
bool CGame::IsOver()
{
 return (STATUS_GAMEOVER==m_Status) ;
}

void CGame::OnGameOver()
{
 m_Status = STATUS_GAMEOVER;
}

void CGame::OnEraseLines(IGame* fromGame,long lines)
{
 static int seed = 0 ;
 
 int i ;
 int j ;
 int AddLines = lines - 1;
 //random add lines to self

//check if die
 for(i=0;i {
 for(j=(m_HeightBlocks-AddLines);j {
 if(1==GetBlockInfo(i,j))
 {
 OnGameOver();
 return ;
 }
 }
 }
 
 //add lines
 for(i=0;i {
 for(j=m_HeightBlocks-1;j>=AddLines;j--)
 {
 SetBlockInfo(i,j,GetBlockInfo(i,j-AddLines));
 }
 }

for(i=0;i {
 srand((unsigned)time(NULL)+seed);
 long v = rand() % 2  ;
 for(j=0;j {
 SetBlockInfo(i,j,v);
 }
 seed ++ ;
 }
 
 //fixed
 for(i=0;i {
 srand((unsigned)time(NULL)+seed);
 int x = rand() % m_WidthBlocks  ;
 SetBlockInfo(x,i,1);
 seed++;
 x = m_WidthBlocks - 1 - x ;
 SetBlockInfo(x,i,0);
 }
 Draw();
}

long CGame::GetBlockInfo(long x,long y)
{
 if(y>=m_HeightBlocks) return -1 ; //out of game panel
 long pos = y * m_WidthBlocks + x ;
 return m_pBlocks[pos]  ;
}
void CGame::SetBlockInfo(long x,long y,long v)
{
 if(x>=m_WidthBlocks || y>=m_HeightBlocks) return ; //out of game panel
 long pos = y * m_WidthBlocks + x ;
 m_pBlocks[pos] = v  ;
}

bool  CGame::IsValidDiamond(CDiamond* d)
{

long x = d->GetStartX();
 long y = d->GetStartY();
 
 CBlock* b;
 for(int i=0;iGetBlockCount();i++)
 {
 b = d->GetBlock(i);
 if((x+b->m_x)<0)  return false;  //left check
 if((x+b->m_x)>=m_WidthBlocks) return false; //right check
 if((y+b->m_y)>=m_HeightBlocks) return false; //top check
 if((y+b->m_y)<0) return false; //bottom check
 if(1==GetBlockInfo(x+b->m_x,y+b->m_y)) return false;  //block check
 }
 return true;
}

void CGame::LeftDiamond()
{
 CDiamond t(*m_pCurrDiamond);
 t.Left();
 if(IsValidDiamond(&t))
 {
 m_pCurrDiamond->Draw(m_pDraw,false); 
 m_pCurrDiamond->Left();
 m_pCurrDiamond->Draw(m_pDraw); 
 }
}

void CGame::RightDiamond()
{
 CDiamond t(*m_pCurrDiamond);
 t.Right();
 if(IsValidDiamond(&t))
 {
 m_pCurrDiamond->Draw(m_pDraw,false); //hide
 m_pCurrDiamond->Right();
 m_pCurrDiamond->Draw(m_pDraw);
 }
}

void CGame::NextDiamond()
{
 CDiamond t(*m_pCurrDiamond);
 t.Next();
 if(IsValidDiamond(&t))
 {
 m_pCurrDiamond->Draw(m_pDraw,false); //
 m_pCurrDiamond->Next();
 m_pCurrDiamond->Draw(m_pDraw);
 }
}

bool CGame::CanDown()
{
 CDiamond t(*m_pCurrDiamond);
 t.Down();
 
 return IsValidDiamond(&t);
}

void CGame::DropDiamond()
{
 m_pCurrDiamond->Draw(m_pDraw,false);
 while(CanDown())
 {
 m_pCurrDiamond->Down();
 }
 OnDownADiamond();
}

void CGame::DownDiamond()
{
 if(!CanDown())
 {
 OnDownADiamond();
 }
 else
 {
 m_pCurrDiamond->Draw(m_pDraw,false);
 m_pCurrDiamond->Down();
 m_pCurrDiamond->Draw(m_pDraw);
 } 
}

void CGame::OnDownADiamond()
{

CBlock* b ;
 for(int i=0;iGetBlockCount();i++)
 {
  b = m_pCurrDiamond->GetBlock(i);
 SetBlockInfo(m_pCurrDiamond->GetStartX() + b->m_x,
  m_pCurrDiamond->GetStartY() + b->m_y,
  1);
 }
 long lines = EraseLines();
  if(lines>0)
 {
 m_pController->OnEraseLines(this,lines); 
 }
 delete m_pCurrDiamond;
 
 m_pCurrDiamond = CDiamond::CreateAnInstance(m_WidthBlocks/2,m_HeightBlocks);
 if(!IsValidDiamond(m_pCurrDiamond))
 {
 OnGameOver();
 return ;
 }
  Draw();
}

long CGame::EraseLines()
{
 long count = m_WidthBlocks * m_HeightBlocks ;
 long* pNewBlocks = new long[count];
 for(int ii=0 ;ii {
 pNewBlocks[ii] = 0;
 }

bool bErase ;
 int  lines = 0 ;
 int  fillLines = 0 ;

for(int i=0 ;i {
 bErase = true ;
 
 for(int j=0;j {
 if(0==GetBlockInfo(j,i))
 {
 bErase = false;
 break;
 }
 }
 
  if(bErase)
 {
 lines++;
 }
 else
 {
 memcpy(&pNewBlocks[m_WidthBlocks*fillLines],&m_pBlocks[m_WidthBlocks*i],sizeof(long)*m_WidthBlocks);
 fillLines ++;
 }
 }
 delete []m_pBlocks ;
 m_pBlocks = pNewBlocks ;
 
 return lines ;
}

void CGame::Show()
{
 CString s = "" ;
 CString a ;
 for(int i=0;i {
 for(int j=0;j {
 if(1==GetBlockInfo(j,i))
 {
 s += "1," ;
 }
 else
 {
 s += "0," ;
 }

}
 s += "n" ;
 }
 AfxMessageBox(s);
}

void CGame::Draw()
{
 for(int i=0;i {
 for(int j=0;j {
 if(GetBlockInfo(j,i)==1)
 {
 m_pDraw->ShowBlocks(j,i,1,1);
 }
 else
 {
 m_pDraw->HideBlocks(j,i,1,1);
 }
 }
 }
 m_pCurrDiamond->Draw(m_pDraw);
}

//=class:CDrawDrvWindowsImp=//

CDrawDrvWindowsImp::CDrawDrvWindowsImp(POINT p,COLORREF block_color,COLORREF bg_color,long block_size,CDC* pDC)
:m_OrgPoint(p),m_BlockColor(block_color),m_BgColor(bg_color),m_BlockSize(block_size),m_BlockBrush(block_color),m_BgBrush(bg_color),m_BorderBrush(RGB(255,255,255)) 
{
 m_pDC = pDC;
}

CDrawDrvWindowsImp::ShowBlocks(long x,long y,long xs,long ys)
{
 RECT rect;
 rect.left = m_OrgPoint.x + x * m_BlockSize;
 rect.top  = m_OrgPoint.y - ( y + 1) * m_BlockSize ;
 rect.right = rect.left + xs * m_BlockSize ;
 rect.bottom = rect.top + ys * m_BlockSize ;
 
 m_pDC->FillRect(&rect,&m_BorderBrush);
 rect.left ++ ;
 rect.top ++;
  m_pDC->FillRect(&rect,&m_BlockBrush);
}

CDrawDrvWindowsImp::HideBlocks(long x,long y,long xs,long ys)
{
 RECT rect;
 rect.left = m_OrgPoint.x + x * m_BlockSize;
 rect.top  = m_OrgPoint.y - ( y + 1) * m_BlockSize ;
 rect.right = rect.left + xs * m_BlockSize ;
 rect.bottom = rect.top + ys * m_BlockSize ;
  m_pDC->FillRect(&rect,&m_BgBrush);
}

//CGameController
CGameController::CGameController()
{
 m_Status = STATUS_TO_START;
}

CGameController::~CGameController()
{
 Clean();
}
void CGameController::Clean()
{
 POSITION  pos ;
 pos = m_Games.GetHeadPosition();
 IGame*  p;
 while(pos)
 {
 p = m_Games.GetNext(pos);
 delete p ;
 }
}

void CGameController::OnEraseLines(IGame* pFromGame,long lines)
{
 if(lines<2)
 {
 return ;
 }
 POSITION  pos ;
 pos = m_Games.GetHeadPosition();
 IGame*  p;
 while(pos)
 {
 p = m_Games.GetNext(pos);
 if(p!=pFromGame)
 {
 if(!p->IsOver())
 {
 p->OnEraseLines(pFromGame,lines);
 }
 }
 }
}

void CGameController::OnGameOver(IGame* pGame)
{
 POSITION  pos ;
 pos = m_Games.GetHeadPosition();
 IGame*  p;
 bool  bEnd = true;
 while(pos)
 {
 p = m_Games.GetNext(pos);
 if(p->IsOver())
 {
  bEnd = false; 
 }
 }
 if(bEnd)
 {
 End();
 }
}

void CGameController::Start(CDC* pDC)
{

IGame*  pGame;
 IDrawDrv* pDraw;
 long  BlockSize;
 long  WidthBlocks;
 long  HeightBlocks;
 COLORREF BlockColor;
 COLORREF BgColor;
 POINT StartPos ;
 CKeyController key ;

//game0
 BlockSize = 18 ;
 WidthBlocks = 14;
 HeightBlocks = 20 ;
  BlockColor = RGB(255,0,0);
 BgColor = RGB(160,0,0);
 StartPos.x = 10 ;
 StartPos.y = 60  + BlockSize * HeightBlocks ;
 key.DOWN = 'S' ;
 key.LEFT = 'A' ;
 key.RIGHT ='D';
 key.NEXT  = 'W';
 key.DROP = 'G' ;
 
 pDraw = new CDrawDrvWindowsImp(StartPos,BlockColor,BgColor,BlockSize,pDC);
 pGame = new CGame(this,pDraw,key,WidthBlocks,HeightBlocks);
 m_Games.AddTail(pGame);

//game1
 BlockSize = 18 ;
 WidthBlocks = 14;
 HeightBlocks = 20 ;
  BlockColor = RGB(255,0,0);
 BgColor = RGB(160,0,0);
 StartPos.x = 350 ;
 StartPos.y = 60  + BlockSize * HeightBlocks ;
 key.DOWN = 40 ;
 key.LEFT = 37 ;
 key.RIGHT = 39;
 key.NEXT  = 38;
 key.DROP = 'L' ;
 
 pDraw = new CDrawDrvWindowsImp(StartPos,BlockColor,BgColor,BlockSize,pDC);
 pGame = new CGame(this,pDraw,key,WidthBlocks,HeightBlocks);
 m_Games.AddTail(pGame);

m_Status = STATUS_PLAYING;
}

void CGameController::Pause()
{
 if(m_Status == STATUS_PAUSE)
 {
 m_Status = STATUS_PLAYING;
 }
 else
 {
 m_Status = STATUS_PAUSE;
 }
}

void CGameController::End()
{
 m_Status = STATUS_END;
 Clean();
}

void CGameController::OnDraw()
{
 POSITION  pos ;
 pos = m_Games.GetHeadPosition();
 IGame*  p;
 while(pos)
 {
 p = m_Games.GetNext(pos);
 if(!p->IsOver())
 {
 p->Draw();
 }
 }
}

void CGameController::OnKey(long keycode)
{
 
 if(m_Status!=STATUS_PLAYING) return ;
 POSITION  pos ;
 pos = m_Games.GetHeadPosition();
 IGame*  p;
 while(pos)
 {
 p = m_Games.GetNext(pos);
 if(!p->IsOver())
 {
 p->OnKey(keycode);
 }
 }
}

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/10752043/viewspace-996888/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/10752043/viewspace-996888/

我编写的俄罗斯方块源代码,支持单机对战,可定制方块数,键盘等!!! (转)相关推荐

  1. Android手游《》斗地主完整的源代码(支持单机和网络对战)

    Android手游<斗地主>完整的源代码(支持单机和网络对战)下载.一个很不错的源代码. 斗地主掌游是一个独特的国内社会斗地主棋牌游戏,之后玩家可以下载网上斗地主和全世界.掌游斗地主特点: ...

  2. Qt编写的CAN通信调试工具源代码支持吉阳光电CAN盒和致远周立功USB转CAN卡,带多线程接收 可完成标准和扩展CAN帧YID发送和接收

    Qt编写的CAN通信调试工具源代码支持吉阳光电CAN盒和致远周立功USB转CAN卡,带多线程接收 可完成标准和扩展CAN帧YID发送和接收,带配置参数自动保存,定时发送,帧类型选择,文本和十六进制等. ...

  3. Qt编写的CAN通信调试工具源代码支持吉阳光电CAN盒和致远周立功USB转CAN卡,带多线程接收 可完成标准和扩展CAN帧YID发送和接收,带配置参数自动保存,定时发送,帧类型选择,文本和十六进制等

    Qt编写的CAN通信调试工具源代码支持吉阳光电CAN盒和致远周立功USB转CAN卡,带多线程接收 可完成标准和扩展CAN帧YID发送和接收,带配置参数自动保存,定时发送,帧类型选择,文本和十六进制等. ...

  4. python商城源码_自学Python才几天,就成功编写出俄罗斯方块游戏,附自学教程

    人们常说,python不适合做游戏,但我偏爱玩游戏,做不了大的,做个小的也行啊. 于是,我在自己毫无基础的条件下,用两天时间学python基础理论,再用已有的俄罗斯方块游戏源码和源文件,在我的不懈努力 ...

  5. c语言编写坦克大战设计报告,c语言编写坦克大战源代码

    <c语言编写坦克大战源代码>由会员分享,可在线阅读,更多相关<c语言编写坦克大战源代码(10页珍藏版)>请在人人文库网上搜索. 1.include tank.h#include ...

  6. 俄罗斯方块源代码Github

    俄罗斯方块源代码Github 地址:https://github.com/chenjie1024/test

  7. python 代码转程序_如何用pyinstaller把自己编写的python源代码转换成可执行程序?...

    昨天慢步熬夜写了一篇干货满满的文章,不知道什么原因,文章并未被推荐. 今天再来换个方式写一次. 把自己编写的python源代码转换成可执行程序 笔者继续用自编的<货币兑换程序3.0>为例. ...

  8. 重新编译TensorFlow1.4源代码支持SSE-AVX-FMA指令集 (Python3.5版本)

    TensorFlow运行出现以下信息说明工作站支持这些指令集但编译的时候并没有加入 W tensorflow/core/platform/cpu_feature_guard.cc:45] The Te ...

  9. java俄罗斯方块程序_使用JAVA编写的俄罗斯方块程序, 具有非常全面的功能.

    Lastsong-Tetris 使用JAVA编写的俄罗斯方块程序, 具有非常全面的功能. 游戏基本规则: 1.打开游戏窗口后, 点击开始按钮进行游戏; 2.每消一行就会增加10分和1消行数,当分数累计 ...

最新文章

  1. Linux 查看文件大小
  2. Nginx 搭建图片服务器
  3. Redhat 6.2安装Oracle 11gclient及遇到的问题分析
  4. python中的range与list函数
  5. Oracle分析函数简析
  6. 正高职称 程序员_我985毕业33岁正高,职称评审哪里难?轻轻松松过职称
  7. IMEI,手机号,身份证号格式有效性校验
  8. win7下开启telnet命令
  9. linux 下令chmod 755的意思
  10. restframework序列化解析详解(番外)
  11. golang知识图谱
  12. 初步探索C++深浅拷贝
  13. Explorer.exe崩溃后自动重启任务栏托盘区图标丢失
  14. Validation 使用
  15. 阿里云ECS服务器被DDoS无解攻击,我改怎么办
  16. 使用VS编写C语言程序遇到的scanf错误
  17. 自学网络安全,一般人我劝你放弃吧!
  18. spotify歌曲下载_k表示使用Spotify歌曲功能进行聚类
  19. 最全的软件测试面试题(含答案)
  20. 【安卓-自定义布局】安卓App开发思路 一步一个脚印(十二)实现自定义左右滚动的信息块-仿蘑菇街

热门文章

  1. 【软件工程师学硬件】之 通信
  2. (捌)规划方向技能:以ArcMap为例的静态动态流线图绘制方法
  3. 三十而立技术er的进击之路
  4. kodi资源_kodi使用smb看局域网资源的几个过坑小技巧
  5. 网络渗透测试(1)—— 怎么找微信服务器的IP地址
  6. neatdm路径_trapcode tao插件下载-AE三维物体路径动画插件(Trapcode TAO) 2.1.2 官方最新版 - 河东下载站...
  7. Android 数据存储--- SharedPreferences
  8. 09年..追女生最具创意的十大表白句
  9. Android 机器人项目Pepper_Android
  10. 2021年12月券商App行情刷新及交易体验评测报告