⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 xiugai.cpp

📁 用C++编写的俄罗斯方块 是我的课程设计报告~
💻 CPP
字号:
#include<iostream>
#include <stdlib.h>
#include<time.h>
#include<windows.h>
#include <conio.h>
using namespace std;

int change();

typedef struct shape   /*形状单一状态的记录*/
{ 
	int co[8];
}shape;

typedef struct point   /*点的坐标*/
{
	int i;//纵坐标
	int j;//横坐标
}point;


shape ps[19]={{0,1,1,0,1,1,2,1 },   
            {0,1,1,0,1,1,1,2 },
            {0,0,1,0,2,0,1,1 },
            {0,0,0,1,1,1,0,2 },
            {0,0,1,0,2,0,3,0 },
            {0,0,0,1,0,2,0,3 },
            {0,0,0,1,1,0,1,1 },
            {0,0,1,0,1,1,2,1 },
            {1,0,0,1,1,1,0,2 },
            {1,0,2,0,1,1,0,1 },
            {0,0,0,1,1,1,1,2 },
            {0,0,0,1,0,2,1,2 },
            {2,0,0,1,1,1,2,1 },
            {0,0,1,0,1,1,1,2 },
            {0,0,0,1,1,0,2,0 },
            {0,2,1,0,1,1,1,2 },
            {0,0,1,0,2,0,2,1 },
            {1,0,0,0,0,1,0,2 },
            {0,0,0,1,1,1,2,1 },
};

int back[21][15] = {0};  //背景 
int score = 0;

int check_change(point p,shape s)//判断右边是否越界
{
	if(back[s.co[0]+ p.i][s.co[1]+p.j]==1 || back[s.co[2]+ p.i][s.co[3]+p.j ] == 1 || back[s.co[4]+ p.i][s.co[5]+p.j ]==1 || back[s.co[6]+ p.i][s.co[7]+p.j]==1)
	{
		return 0;
	}
	else return 1;
}
void show(point p, shape s1,shape s2)//显示方块
{
	for(int i = 0; i <= 20; cout<<endl,i++)
	{
		for(int j = 0; j <= 14;j++)
		{
			if (s1.co[0]+p.i == i && s1.co[1]+p.j == j)
				cout<<"■";
			else if (s1.co[2]+p.i == i && s1.co[3]+p.j == j)
				cout<<"■";
			else if (s1.co[4]+p.i == i && s1.co[5]+p.j == j)
				cout<<"■";
			else if (s1.co[6]+p.i == i && s1.co[7]+p.j == j)
				cout<<"■";
			else if (back[i][j] == 1 )
				cout<<"■";
			else
				cout<<"  ";
		}
		if(i==3)		
		for(int j1 = -1; j1 <= 3;j1++)
		{
			if (s2.co[0]+2 == i && s2.co[1] +2== j1)
				cout<<"■";
			else if (s2.co[2]+2 == i && s2.co[3] +2== j1)
				cout<<"■";
			else if (s2.co[4] +2== i && s2.co[5] +2== j1)
				cout<<"■";
			else if (s2.co[6]+2 == i && s2.co[7] +2== j1)
				cout<<"■";
		//	else if (back[i][j] == 1 )
		//		cout<<"■ ";
			else
				cout<<"  ";
		}
	}
		cout<<endl<<" 分数:"<<score<<endl; 
	
}

void update(point p, shape s)//更新
{
     int i,j, count = 0;
	for(i = 0; i <= 19;i++)
		for(j = 1; j <= 13;j++)
		{
			if (s.co[0]+ p.i == i && s.co[1]+ p.j == j)
				back[i][j] = 1;
			else if (s.co[2]+ p.i == i && s.co[3]+p.j == j)
				back[i][j] = 1;
			else if (s.co[4]+p.i == i && s.co[5]+ p.j == j)
				back[i][j] = 1;
			else if (s.co[6]+ p.i == i && s.co[7]+ p.j == j)
				back[i][j] = 1;
		}
	for(i = 0;i <= 19; i++) //消行
	{
          int flag = 1;
          for(j = 1; j <=13; j++)
          {
                if(back[i][j] != 1)
                {
                    flag = 0;          
                    break;
                }
          }
        
         if(flag == 1)
         {
             int k = i;
             for(k=i;k>= 1;k--)
             {
                 for(j=1;j<=13;j++)
                 back[k][j] = back[k-1][j];
             }
             count++;
         }
    }
    if(count == 1)
         score += 1;
    else if(count == 2)
         score += 3;
    else if(count == 3)
         score += 5;
    else if(count == 4)
         score += 10;
    for(j = 1; j <=13; j++)
          if(back[0][j] == 1)
          {
              cout<<"Game over!\n";
              exit(0);
          }         
}

int check_buttom(point p, shape s)
{
	if(back[s.co[0]+ p.i +1][s.co[1]+p.j]==1 ||back[s.co[2]+ p.i +1][s.co[3]+p.j] == 1 
 ||back[s.co[4]+ p.i +1][s.co[5]+p.j]==1 ||back[s.co[6]+ p.i +1][s.co[7]+p.j]==1 )
	{
		return 0;//如果到底返回0
	}
	else return 1;//没有到底返回1
}

void move()
{
     point p = {-2, 4};
      int t1,t2;
      t1 = rand()%19;
	  t2 = rand()%19;
     while(1)
     {
         for(int i = 1; i <= 30; i++)
         {
	       if(_kbhit())//_kbhit()判断是否有键盘消息
           {
                 switch(_getch())//接收数据
                 {
                     case 0x50: // ↓向下移动
                          if(check_buttom(p, ps[t1]))
                          {
                              p.i++;
                              system("cls");
                              show(p,ps[t1],ps[t2]);
                          }
                          break;
                     case 0x4B: // ←向左移动
                          if(back[ps[t1].co[0]+ p.i][ps[t1].co[1]+p.j - 1] == 0 && back[ps[t1].co[2]+ p.i][ps[t1].co[3]+p.j - 1] == 0
							  && back[ps[t1].co[4]+ p.i][ps[t1].co[5]+p.j - 1] == 0 && back[ps[t1].co[6]+ p.i][ps[t1].co[7]+p.j - 1] == 0)
                          {
                              p.j--;
                              system("cls");
                              show(p,ps[t1],ps[t2]);
                          }
                          break;
                      case 0x4d: // →向右移动
                          if(back[ps[t1].co[0]+ p.i][ps[t1].co[1]+p.j + 1]==0 && back[ps[t1].co[2]+ p.i][ps[t1].co[3]+p.j + 1] == 0 
                          && back[ps[t1].co[4]+ p.i][ps[t1].co[5]+p.j + 1]==0 && back[ps[t1].co[6]+ p.i][ps[t1].co[7]+p.j + 1]==0)
                          {
                              p.j++;
                              system("cls");
                              show(p,ps[t1],ps[t2]);
                          }
                          break;
                      case 0x48:// ↑变换形状
                           if(t1 == 3&&check_change( p, ps[0]))       t1 = 0;
                           else if(t1 == 5&&check_change( p, ps[4]))  t1 = 4;
                           else if(t1 == 6)  t1 = 6;
                           else if(t1 == 8&&check_change(p, ps[7]))  t1 = 7;
                           else if(t1 == 10&&check_change( p, ps[9])) t1 = 9;
                           else if(t1 == 14&&check_change(p, ps[11])) t1 = 11;
                           else if(t1 == 18&&check_change( p, ps[15])) t1 = 15;
						  else if(check_change( p, ps[t1+1]))            t1++;
                           break;
                      case 32:  //空格 直接降到底端
                           while(check_buttom(p, ps[t1]))
                          {
                              p.i++;
                          }
                     default:
                             break;
                 }
          }
        }
         if(check_buttom(p, ps[t1]))
         {
               system("cls");
               p.i++;
               show(p, ps[t1],ps[t2]);
         }
         else
         {
             update(p, ps[t1]);
			 t1 = t2;
             t2 = rand()%19;
             p.i = -2;
             p.j = 4;
         }
         Sleep(500);
	}
	
}

void nint()//画方框
{
     int i, j;
    for(j=0;j<=14;j++)//画底部的边
		back[20][j]=1;
	for(i=0;i<=19;i++)//画左面的边
		back[i][0]=1;
	for(i=0;i<=19;i++)//画右面的边
		back[i][14]=1;
}

int main()
{
    srand(time(NULL));
     nint();
     move();
     
	return 0;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -