?? russia.cpp
字號:
// Russia.cpp: implementation of the CRussia class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "4_1.h"
#include "Russia.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CRussia::CRussia()
{
jiemian.LoadBitmap(IDB_BITMAP2);
fangkuai.LoadBitmap(IDB_BITMAP4);
}
CRussia::~CRussia()
{
}
void CRussia::Start()
{
end=false;//運行結束標志
m_Score=0; //初始分數
m_Speed=0; //初始速度
m_Level=1; //初始難度
m_RowCount=18; //行數
m_ColCount=12; //列數
Count=7; //方塊種類
for(int i=0;i<m_RowCount;i++)
for(int j=0;j<m_ColCount;j++)
{
Russia[i][j]=0;
}
for(i=0;i<4;i++)
for(int j=0;j<4;j++)
{
Now[i][j]=0;
Will[i][j]=0;
}
//Will[][]
DrawWill();
//Now[][]&Will[][]
DrawWill();
}
void CRussia::DrawJiemian(CDC*pDC)
{
CDC Dc;
if(Dc.CreateCompatibleDC(pDC)==FALSE)
AfxMessageBox("Can't create DC");
//畫背景
Dc.SelectObject(jiemian);
pDC->BitBlt(0,0,500,550,&Dc,0,0,SRCCOPY);
//畫分數,速度,難度
DrawScore(pDC);
//如果有方塊,顯示方塊
//游戲區
for(int i=0;i<m_RowCount;i++)
for(int j=0;j<m_ColCount;j++)
if(Russia[i][j]==1)
{
Dc.SelectObject(fangkuai);
pDC->BitBlt(j*30,i*30,30,30,&Dc,0,0,SRCCOPY);
}
//預先圖形
for(int n=0;n<4;n++)
for(int m=0;m<4;m++)
if(Will[n][m]==1)
{
Dc.SelectObject(fangkuai);
pDC->BitBlt(365+m*30,240+n*30,30,30,&Dc,0,0,SRCCOPY);
}
}
void CRussia::DrawWill()
{
int i,j;
int k=4,l=4;
//把將要出現的方塊給當前數組,并把將要出現數組賦值為零
for(i=0;i<4;i++)
for(j=0;j<4;j++)
{
Now[i][j]=Will[i][j];
Will[i][j]=0;
}
//初始化隨即數種子
srand(GetTickCount());
int nTemp=rand()%Count;
//各種圖形
switch(nTemp)
{
case 0:
Will[0][0]=1;
Will[0][1]=1;
Will[1][0]=1;
Will[1][1]=1;
break;
case 1:
Will[0][0]=1;
Will[0][1]=1;
Will[1][0]=1;
Will[2][0]=1;
break;
case 2:
Will[0][0]=1;
Will[0][1]=1;
Will[1][1]=1;
Will[2][1]=1;
break;
case 3:
Will[0][1]=1;
Will[1][0]=1;
Will[1][1]=1;
Will[2][0]=1;
break;
case 4:
Will[0][0]=1;
Will[1][0]=1;
Will[1][1]=1;
Will[2][1]=1;
break;
case 5:
Will[0][0]=1;
Will[1][0]=1;
Will[1][1]=1;
Will[2][0]=1;
break;
case 6:
Will[0][0]=1;
Will[1][0]=1;
Will[2][0]=1;
Will[3][0]=1;
break;
//適應于難度擴展
/* case 7:
Will[0][0]=1;
Will[1][0]=1;
Will[1][1]=1;
Will[1][2]=1;
Will[0][2]=1;
break;
case 8:
Will[0][0]=1;
Will[1][0]=1;
Will[2][0]=1;
Will[1][1]=1;
Will[1][2]=1;
break;
*/
}
int tmp[4][4];
for(i=0;i<4;i++)
for(j=0;j<4;j++)
tmp[i][j]=Will[j][3-i];
for(i=0;i<4;i++)
for(j=0;j<4;j++)
if(tmp[i][j]==1)
{
if(k>i) k=i;
if(l>j) l=j;
}
for(i=0;i<4;i++)
for(j=0;j<4;j++)
Will[i][j]=0;
//把變換后的矩陣移到左上角
for(i=k;i<4;i++)
for(j=l;j<4;j++)
Will[i-k][j-l]=tmp[i][j];
//開始位置
NowPosition.x=0;
NowPosition.y=m_ColCount/2;
}
//是否遇到了邊界或者有其他方塊檔住了
bool CRussia::Meet(int a[][4],int direction,CPoint p)
{
int i,j;
//先把原位置清0
for(i=0;i<4;i++)
for(j=0;j<4;j++)
if(a[i][j]==1)
Russia[p.x+i][p.y+j]=0;
for(i=0;i<4;i++)
for(j=0;j<4;j++)
if(a[i][j]==1)
{
switch(direction)
{
case 1: //左移
if((p.y+j-1)<0) goto exit;
if(Russia[p.x+i][p.y+j-1]==1) goto exit;
break;
case 2://右移
if((p.y+j+1)>=m_ColCount) goto exit;
if(Russia[p.x+i][p.y+j+1]==1) goto exit;
break;
case 3://下移
if((p.x+i+1)>=m_RowCount) goto exit;
if(Russia[p.x+i+1][p.y+j]==1) goto exit;
break;
case 4://變換
if(!Change(a,p,Russia)) goto exit;
for(i=0;i<4;i++)
for(j=0;j<4;j++)
{
Now[i][j]=After[i][j];
a[i][j]=Now[i][j];
}
return false;
break;
}
}
int x,y;
x=p.x;
y=p.y;
//移動位置,重新給數組賦值
switch(direction)
{
case 1:
y--;break;
case 2:
y++;break;
case 3:
x++;break;
case 4:
break;
}
for(i=0;i<4;i++)
for(j=0;j<4;j++)
if(a[i][j]==1)
Russia[x+i][y+j]=1;
return false;
exit:
for(i=0;i<4;i++)
for(j=0;j<4;j++)
if(a[i][j]==1)
Russia[p.x+i][p.y+j]=1;
return true;
}
//轉換
bool CRussia::Change(int a[][4], CPoint p,int b[][100])
{
int tmp[4][4];
int i,j;
int k=4,l=4;
for(i=0;i<4;i++)
for(j=0;j<4;j++)
{
tmp[i][j]=a[j][3-i];
After[i][j]=0; //存放變換后的方塊矩陣
}
for(i=0;i<4;i++)
for(j=0;j<4;j++)
if(tmp[i][j]==1)
{
if(k>i) k=i;
if(l>j) l=j;
}
for(i=k;i<4;i++)
for(j=l;j<4;j++)
{
After[i-k][j-l]=tmp[i][j];
} //把變換后的矩陣移到左上角
//判斷是否接觸,是:返回失敗
for(i=0;i<4;i++)
for(j=0;j<4;j++)
{
if(After[i][j]==0) continue;
if(((p.x+i)>=m_RowCount)||((p.y+j)<0)||((p.y+j)>=m_ColCount)) return false;
if(b[p.x+i][p.y+j]==1)
return false;
}
return true;
}
void CRussia::Move(int direction)
{
if(end) return;
switch(direction)
{
//左
case 1:
if(Meet(Now,1,NowPosition)) break;
NowPosition.y--;
break;
//右
case 2:
if(Meet(Now,2,NowPosition)) break;
NowPosition.y++;
break;
//下
case 3:
if(Meet(Now,3,NowPosition))
{
LineDelete();
break;
}
NowPosition.x++;
break;
//上
case 4:
Meet(Now,4,NowPosition);
break;
default:
break;
}
}
//消去行
void CRussia::LineDelete()
{
int m=0; //本次共消去的行數
bool flag=0;
for(int i=0;i<m_RowCount;i++)
{
//檢查要不要消行
flag=true;
for(int j=0;j<m_ColCount;j++)
if(Russia[i][j]==0)
flag=false;
//如果要
if(flag==true)
{
m++;
for(int k=i;k>0;k--)
{
//上行給下行
for(int l=0;l<m_ColCount;l++)
{
Russia[k][l]=Russia[k-1][l];
}
}
//第一行為零
for(int l=0;l<m_ColCount;l++)
{
Russia[0][l]=0;
}
}
}
DrawWill();
//加分
switch(m)
{
case 1:
m_Score++;
break;
case 2:
m_Score+=3;
break;
case 3:
m_Score+=6;
break;
case 4:
m_Score+=10;
break;
default:
break;
}
//速度
m_Speed=m_Score/100;
for(i=0;i<4;i++)
for(int j=0;j<4;j++)
if(Now[i][j]==1)
//到了頂點
if(Russia[i+NowPosition.x][j+NowPosition.y]==1)
{
end=true;
AfxMessageBox("游戲結束!");
return;
}
}
void CRussia::DrawScore(CDC*pDC)
{
int nOldDC=pDC->SaveDC();
//設置字體
CFont font;
if(0==font.CreatePointFont(300,"Comic Sans MS"))
{
AfxMessageBox("Can't Create Font");
}
pDC->SelectObject(&font);
//設置字體顏色及其背景顏色
CString str;
pDC->SetTextColor(RGB(39,244,10));
pDC->SetBkColor(RGB(255,255,0));
//輸出數字
str.Format("%d",m_Level);
if(m_Level>=0)
pDC->TextOut(440,120,str);
str.Format("%d",m_Speed);
if(m_Speed>=0)
pDC->TextOut(440,64,str);
str.Format("%d",m_Score);
if(m_Score>=0)
pDC->TextOut(440,2,str);
pDC->RestoreDC(nOldDC);
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -