eluosi.cpp
资源名称:eluosi.zip [点击查看]
上传用户:zhengjing
上传日期:2022-08-08
资源大小:5708k
文件大小:8k
源码类别:
游戏
开发平台:
Visual C++
- #include "stdafx.h"
- #include "俄罗斯方块.h"
- #include"eluosi.h"
- #ifdef _DEBUG
- #define new DEBUG_NEW
- #undef THIS_FILE
- static char THIS_FILE[] = __FILE__;
- #endif
- Celuosi::Celuosi()
- {
- BitCover.LoadBitmap(IDB_BITMAP1);
- BitBlock.LoadBitmap(IDB_BITMAP2);
- for(int i=0;i<20;i++)
- for(int j=0;j<12;j++)
- {
- block[i][j]=0;
- }
- startflags=0;
- score=0;
- }
- void Celuosi::DrawCover(CDC*pDC)
- {
- //贴上背景图片
- CDC dc;
- dc.CreateCompatibleDC(pDC);
- dc.SelectObject(BitCover);
- pDC->BitBlt(0,0,500,500,&dc,0,0,SRCCOPY);
- //设置画刷颜色
- CRect rect(100,40,340,440);
- CBrush BruBK;
- BruBK.CreateSolidBrush(RGB(69,125,125));
- dc.FillRect(&rect,&BruBK);
- BruBK.DeleteObject();
- /*
- //设置画笔的颜色
- CPen MyPen(PS_SOLID,1,RGB(0,0,0));
- HPEN hOldpen=(HPEN)dc.SelectObject(MyPen);
- for(int i=0;i<20;i++)
- {
- dc.MoveTo(100,40+20*i);
- dc.LineTo(340,40+20*i);
- }
- for(i=0;i<13;i++)
- {
- dc.MoveTo(100+20*i,40);
- dc.LineTo(100+20*i,440);
- }
- dc.SelectObject(hOldpen);
- MyPen.DeleteObject();*/
- pDC->BitBlt(0,0,500,500,&dc,0,0,SRCCOPY);
- //画分数
- DrawScore(pDC);
- //画下一块
- DrawNext(pDC);
- for(int i=0;i<20;i++)
- for(int j=0;j<12;j++)
- {
- if(block[i][j]==1)
- {
- dc.SelectObject(BitBlock);
- pDC->BitBlt(100+20*j,40+20*i,19,19,&dc,0,0,SRCCOPY);
- }
- }
- dc.DeleteDC();
- }
- void Celuosi::DrawScore(CDC*pDC)
- {
- int nOldDC=pDC->SaveDC();
- //设置字体
- CFont font;
- if(0==font.CreatePointFont(150,"Comic Sans MS"))
- {
- AfxMessageBox("Can't Create Font");
- }
- pDC->SelectObject(&font);
- //设置字体颜色及其背景颜色
- CString str;
- pDC->SetBkMode(TRANSPARENT);
- pDC->SetTextColor(RGB(39,244,10));
- //输出分数
- pDC->TextOut(350,60,"分数:");
- pDC->TextOut(350,160,"难度:");
- pDC->TextOut(350,260,"下一块:");
- str.Format("%d",score);
- if(score>=0)
- pDC->TextOut(400,90,str);
- //画难度
- CMyApp*pApp=(CMyApp*)AfxGetApp();
- str.Format("%d",pApp->speed);
- if(score>=0)
- pDC->TextOut(400,190,str);
- pDC->RestoreDC(nOldDC);
- }
- void Celuosi::Start()
- {
- m_PosLeft.x=4;
- m_PosLeft.y=0;
- for(int i=0;i<20;i++)
- for(int j=0;j<12;j++)
- {
- block[i][j]=0;
- }
- for(i=0;i<4;i++)
- for(int j=0;j<4;j++)
- {
- now[i][j]=0;
- will[i][j]=0;
- }
- GetBlock(); //赋值will
- GetBlock(); //赋值now
- startflags=true;
- score=0;
- }
- void Celuosi::move(int dir)
- {
- switch(dir)
- {
- case 1: //上键
- {
- change(); //变形
- break;
- }
- case 2: //下键
- {
- Fall(); //下落
- break;
- }
- case 3: //左键
- {
- moveleft(); //左移
- break;
- }
- case 4: //右键
- {
- moveright(); //右移
- break;
- }
- }
- }
- void Celuosi::GetBlock()
- {
- for(int i=0;i<4;i++)
- for(int j=0;j<4;j++)
- {
- now[i][j]=will[i][j];
- will[i][j]=0;
- }
- srand(::GetTickCount());
- int shap=rand()%7;
- switch(shap)
- {
- 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[2][0]=1;
- will[1][0]=1;
- will[1][1]=1;
- break;
- case 2:
- will[0][0]=1;
- will[2][1]=1;
- will[1][0]=1;
- will[1][1]=1;
- break;
- case 3:
- will[2][0]=1;
- will[0][1]=1;
- will[1][0]=1;
- will[1][1]=1;
- break;
- case 4:
- will[0][0]=1;
- will[2][0]=1;
- will[1][0]=1;
- will[2][1]=1;
- break;
- case 5:
- will[0][1]=1;
- will[1][1]=1;
- will[2][0]=1;
- will[2][1]=1;
- break;
- case 6:
- will[0][0]=1;
- will[1][0]=1;
- will[2][0]=1;
- will[3][0]=1;
- break;
- }
- }
- void Celuosi::Fall()
- {
- //清除前一步方块
- int c=m_PosLeft.x;
- int l=m_PosLeft.y;
- for(int i=0;i<4;i++)
- for(int j=0;j<4;j++)
- {
- if(now[i][j]==1)
- block[l+i][c+j]=0;
- }
- for(i=0;i<4;i++)
- for(int j=0;j<4;j++)
- {
- if(block[i][4+j]==1)
- {
- startflags=0;
- for(int i=0;i<4;i++)
- for(int j=0;j<4;j++)
- {
- if(now[i][j]==1)
- block[i][4+j]=1;
- }
- score=0;
- MessageBox(NULL,"游戏结束","fail",MB_OK);
- return;
- }
- }
- //判断边界
- int col[4];
- for(i=0;i<4;i++)
- {
- col[i]=0;
- }
- int n=0;
- bool mark;
- for(i=0;i<4;i++)
- {
- mark=false;
- for(int j=0;j<4;j++)
- {
- if(now[j][i]==1&&j>col[i])
- col[i]=j;
- if(now[j][i]==1)
- mark=true;
- }
- if(mark)
- n++;
- }
- for(i=0;i<n;i++)
- {
- if(block[l+col[i]+1][c+i]==1||(col[i]+l+1)>19)
- goto exit;
- }
- //下落一格
- m_PosLeft.y+=1;
- l+=1;
- for(i=0;i<4;i++)
- for(int j=0;j<4;j++)
- {
- if(now[i][j]==1)
- block[l+i][c+j]=1;
- }
- return;
- exit:
- for(i=0;i<4;i++)
- for(int j=0;j<4;j++)
- {
- if(now[i][j]==1)
- block[l+i][c+j]=1;
- }
- linedelete();
- GetBlock();
- m_PosLeft.x=4;
- m_PosLeft.y=0;
- return;
- }
- void Celuosi::change()
- {
- for(int i=0;i<4;i++)
- for(int j=0;j<4;j++)
- {
- if(now[i][j]==1)
- block[m_PosLeft.y+i][m_PosLeft.x+j]=0;
- }
- int a[4][4],b[4][4];
- //变换
- for(i=0;i<4;i++)
- for(int j=0;j<4;j++)
- {
- a[i][j]=now[j][3-i];
- b[i][j]=now[i][j];
- }
- for(i=0;i<4;i++)
- for(int j=0;j<4;j++)
- now[i][j]=0;
- //找左上角
- int k=4,l=4;
- for(i=0;i<4;i++)
- for(int j=0;j<4;j++)
- {
- if(a[i][j]==1)
- {
- if(k>i) k=i;
- if(l>j) l=j;
- }
- }
- //得到变换后的形状
- for(i=k;i<4;i++)
- for(int j=l;j<4;j++)
- {
- now[i-k][j-l]=a[i][j];
- }
- //判断是否超出范围
- bool overflow=false;
- for(i=0;i<4;i++)
- for(int j=0;j<4;j++)
- {
- if(now[i][j]==1)
- {
- if(m_PosLeft.x+j>11||m_PosLeft.x+j<0||m_PosLeft.y+i>19||m_PosLeft.y+i<0||block[m_PosLeft.y+i][m_PosLeft.x+j]==1)
- overflow=true;
- }
- }
- if(overflow)
- {
- for(i=0;i<4;i++)
- for(int j=0;j<4;j++)
- now[i][j]=b[i][j];
- }
- for(i=0;i<4;i++)
- for(int j=0;j<4;j++)
- {
- if(now[i][j]==1)
- block[m_PosLeft.y+i][m_PosLeft.x+j]=1;
- }
- }
- void Celuosi::moveleft()
- {
- //清除前一次方块
- for(int i=0;i<4;i++)
- for(int j=0;j<4;j++)
- {
- if(now[i][j]==1)
- block[m_PosLeft.y+i][m_PosLeft.x+j]=0;
- }
- //左移
- if(m_PosLeft.x<=0)
- goto exit;
- int a[4];
- for(i=0;i<4;i++)
- {
- a[i]=4;
- }
- for(i=0;i<4;i++)
- for(int j=0;j<4;j++)
- {
- if(now[i][j]==1&&j<a[i])
- a[i]=j;
- }
- for(i=0;i<4;i++)
- {
- if(block[m_PosLeft.y+i][m_PosLeft.x+a[i]-1]==1)
- goto exit;
- }
- m_PosLeft.x-=1;
- //移动
- exit:
- for(i=0;i<4;i++)
- for(int j=0;j<4;j++)
- {
- if(now[i][j]==1)
- block[m_PosLeft.y+i][m_PosLeft.x+j]=1;
- }
- }
- void Celuosi::moveright()
- {
- //清除上一次方块
- for(int i=0;i<4;i++)
- for(int j=0;j<4;j++)
- {
- if(now[i][j]==1)
- block[m_PosLeft.y+i][m_PosLeft.x+j]=0;
- }
- //右移
- int a[4];
- for(i=0;i<4;i++)
- {
- a[i]=0;
- }
- for(i=0;i<4;i++)
- for(int j=0;j<4;j++)
- {
- if(now[i][j]==1&&j>a[i])
- a[i]=j;
- }
- for(i=0;i<4;i++)
- {
- if(m_PosLeft.x+a[i]>10)
- goto exit;
- if(block[m_PosLeft.y+i][m_PosLeft.x+a[i]+1]==1)
- goto exit;
- }
- m_PosLeft.x+=1;
- exit:
- //移动
- for(i=0;i<4;i++)
- for(int j=0;j<4;j++)
- {
- if(now[i][j]==1)
- block[m_PosLeft.y+i][m_PosLeft.x+j]=1;
- }
- }
- void Celuosi::linedelete()
- {
- int m=0; //本次共消去的行数
- bool flag=0;
- for(int i=0;i<20;i++)
- {
- //检查要不要消行
- flag=true;
- for(int j=0;j<12;j++)
- {
- if(block[i][j]==0)
- flag=false;
- }
- //如果要
- if(flag==true)
- {
- m++;
- for(int k=i;k>0;k--)
- {
- //上行给下行
- for(int l=0;l<12;l++)
- {
- block[k][l]=block[k-1][l];
- }
- }
- //第一行为零
- for(int l=0;l<12;l++)
- {
- block[0][l]=0;
- }
- }
- }
- switch(m)
- {
- case 1:
- score+=100;
- break;
- case 2:
- score+=200;
- break;
- case 3:
- score+=400;
- break;
- case 4:
- score+=600;
- break;
- default:
- break;
- }
- }
- void Celuosi::DrawNext(CDC*pDC)
- {
- CDC dc;
- dc.CreateCompatibleDC(pDC);
- for(int i=0;i<4;i++)
- for(int j=0;j<4;j++)
- {
- if(will[i][j]==1)
- {
- dc.SelectObject(BitBlock);
- pDC->BitBlt(390+20*j,290+20*i,19,19,&dc,0,0,SRCCOPY);
- }
- }
- }
- void Celuosi::end()
- {
- for(int i=0;i<20;i++)
- for(int j=0;j<12;j++)
- {
- block[i][j]=0;
- }
- for(i=0;i<4;i++)
- for(int j=0;j<4;j++)
- {
- now[i][j]=0;
- will[i][j]=0;
- }
- startflags=false;
- }