首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

这是小弟写的一个c++控制台俄罗斯方块(有点许BUG),欢迎大家拍砖、指教!

2012-09-03 
这是小弟写的一个c++控制台俄罗斯方块(有些许BUG),欢迎大家拍砖、指教!!!编译环境:vs2010#include stdafx.

这是小弟写的一个c++控制台俄罗斯方块(有些许BUG),欢迎大家拍砖、指教!!!
编译环境:vs2010

#include "stdafx.h"
#include <iostream>
#include <Windows.h>
#include <conio.h>
#include <ctime>
using namespace std;
int map1[22][12]={0};
int map2[22][7]={0};
int level=1,score=0;
int block[7][4][4][4]=
{
{{0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0},{0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0},{0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0},{0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0}},
{{0,1,0,0,0,1,1,0,0,0,1,0,0,0,0,0},{0,0,0,0,0,1,1,0,1,1,0,0,0,0,0,0},{0,0,0,0,0,1,0,0,0,1,1,0,0,0,1,0},{0,0,0,0,0,0,1,1,0,1,1,0,0,0,0,0}},
{{0,1,0,0,0,1,0,0,0,1,1,0,0,0,0,0},{0,0,0,0,0,0,1,0,1,1,1,0,0,0,0,0},{0,0,0,0,0,1,1,0,0,0,1,0,0,0,1,0},{0,0,0,0,0,1,1,1,0,1,0,0,0,0,0,0}},
{{0,0,0,0,0,1,1,1,0,0,1,0,0,0,0,0},{0,1,0,0,0,1,1,0,0,1,0,0,0,0,0,0},{0,0,0,0,0,1,0,0,1,1,1,0,0,0,0,0},{0,0,0,0,0,0,1,0,0,1,1,0,0,0,1,0}},
{{0,0,0,0,0,1,1,0,0,1,1,0,0,0,0,0},{0,0,0,0,0,1,1,0,0,1,1,0,0,0,0,0},{0,0,0,0,0,1,1,0,0,1,1,0,0,0,0,0},{0,0,0,0,0,1,1,0,0,1,1,0,0,0,0,0}},
{{0,1,1,0,0,1,0,0,0,1,0,0,0,0,0,0},{0,0,0,0,1,0,0,0,1,1,1,0,0,0,0,0},{0,0,0,0,0,0,1,0,0,0,1,0,0,1,1,0},{0,0,0,0,0,1,1,1,0,0,0,1,0,0,0,0}},
{{0,0,1,0,0,1,1,0,0,1,0,0,0,0,0,0},{0,0,0,0,1,1,0,0,0,1,1,0,0,0,0,0},{0,0,0,0,0,0,1,0,0,1,1,0,0,1,0,0},{0,0,0,0,0,1,1,0,0,0,1,1,0,0,0,0}}
};
void draw_next();
class brick
{
public:
int x,y;
int kind1,kind2;
brick(){}
void brick_erase();
void brick_draw();
void brick_solid_draw();
void brick_change();
void brick_down();
bool check_change();
  bool check_side(int a,int b);
bool check_floor(int a,int b);
friend void setcursor(int,int);
friend void hidecursor(int ,int);
};
void brick::brick_erase()
{
int i,j;
int count=0;
for (j=y;j<y+4;j++)
{
setcursor(x,y+count);
for (i=x;i<x+4;i++)
{
if (i>0&&i<11&&j>0&&j<21)
{
if (map1[j][i]!=2)
{
map1[j][i]=0;
cout<<" ";
}
else
cout<<"■";
}
else
cout<<"□";
}
count++;
}
}
void brick::brick_solid_draw()
{
int i,j;
int num=0;
for (j=y;j<y+4;j++)
for (i=x;i<x+4;i++)
{
if (i>0&&i<11&&j>0&&j<21)
{
if (map1[j][i]!=2)
{
map1[j][i]=2*block[kind1][kind2][j-y][i-x];
}
}
}
}
void brick::brick_draw()
{
int i,j;
int num=0;
for (j=y;j<y+4;j++)
{
HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);
COORD pos;
pos.X=2*x;
pos.Y=y+num;
SetConsoleCursorPosition(hOut,pos);
for (i=x;i<x+4;i++)
{
if(i>0&&i<11&&j>0&&j<21)
{
if (map1[j][i]!=2)
{
map1[j][i]=block[kind1][kind2][j-y][i-x];
if (map1[j][i]==1)
{
cout<<"■";
}
else 
{cout<<" ";}
}
else if (map1[j][i]==2)
{
cout<<"■";
}
}
else if(map1[j][i]==2)
cout<<"□";
}
num++;
}
}
void brick::brick_change()
{
kind2=(++kind2)%4;
brick_erase();
setcursor(x,y);
brick_draw();
}
bool brick::check_change()
{
int a=(kind2+1)%4;
int i,j;
int sum=1;
for (j=y;j<y+4;j++)
{
for (i=x;i<x+4;i++)
{
if ((block[kind1][a][j-y][i-x]+map1[j][i])>2)
{
return false;
sum=0;
break;
}
}
}
if(sum)
return true;
}
void brick::brick_down()
{
brick_erase();
++y;


setcursor(x,y);
brick_draw();
}
bool brick::check_side(int a,int b)
{
int i,j;
int sum=1;
if(a>=0&&a<10)
{
for(j=b;j<b+4;j++)
{
for (i=a;i<a+4;i++)
{
if ((block[kind1][kind2][j-b][i-a]+map1[j][i])>2)
{
sum=0;
return false;
}
}
}
if(sum)
return true;
}
else
return false;
}
bool brick::check_floor(int a,int b)
{
int i,j;
int sum=1;
for (j=y;j<y+4;j++)
{
for (i=x;i<x+4;i++)
{
if (i>0&&i<11&&j>0&&j<21&&map1[j][i]!=2)
{
map1[j][i]=0;
}
}
}
if (b>=0&&b<20&&a>=0&&a<10)
{
for (j=b;j<b+4;j++)
{
for (i=a;i<a+4;i++)
{
if ((block[kind1][kind2][j-b][i-a]+map1[j][i])>2)
{
sum=0;
return false;
break;
}
}
}
if(sum)
return true;
}
else
return false;
}
////////////////////////////////////////////到此类的声明及实现工作全部完成////////////////////////////////////////////////////////////
void hidecursor()
{
HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);
CONSOLE_CURSOR_INFO cursor_info;
cursor_info.bVisible = FALSE;
cursor_info.dwSize=100;
SetConsoleCursorInfo(hOut, &cursor_info);
}
void setcursor(int x,int y)
{
HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);
COORD pos;
pos.X=2*x;
pos.Y=y;
SetConsoleCursorPosition(hOut,pos);
}
void draw_next(int a,int b)
{
setcursor(13,1);
cout<<" "<<"Next";
int i,j;
for (i=0;i<4;i++)
{
setcursor(13,2+i);
for (j=0;j<4;j++)
{
if (block[a][b][i][j]==1)
{
cout<<"■";
}
else
cout<<" ";
}
}
}
void draw_level()
{
setcursor(13,8);
cout<<" "<<"Level";
  setcursor(13,9);
  cout<<" "<<level;
}
void draw_score()
{
setcursor(13,12);
cout<<" "<<"Score";
setcursor(13,13);
cout<<" "<<score;
}
void draw_author()
{
setcursor(13,18);
cout<<" "<<"By";
setcursor(13,19);
cout<<" NWW";
}
void begin()
{
for (int i=1;i<11;i++)
{
for (int j=1;j<21;j++)
{
map1[i][j]=0;
}
}
}
void game_init()
{
setcursor(0,0);
int i,j;
for (i=0;i<22;i++)
{
for (j=0;j<12;j++)
{
if (i==0||j==0||i==21||j==11)
{
map1[i][j]=2;
cout<<"□";
}
else
{
map1[i][j]=0;
cout<<" ";
}
}
cout<<endl;
}
for (i=0;i<22;i++)
{
  setcursor(12,i);
for (j=0;j<7;j++)
{
if (i==0||j==0||i==21||j==6)
{
map2[i][j]=1;
cout<<"□";
}
else
cout<<" ";
}

}
draw_level();
draw_score();
draw_author();
setcursor(4,22);
cout<<" ";
}
void draw_map()
{
int i,j;
for (i=20;i>0;i--)
{
setcursor(1,i);
for (j=1;j<11;j++)
{
if (map1[i][j]==2)
{
cout<<"■";
}
else
cout<<" ";
}
}
}
void clear_full(int a)
{
int i,j;
for (i=a;i>1;i--)
{


for (j=1;j<11;j++)
{
map1[i][j]=map1[i-1][j];
}
}
for (j=1;j<11;j++)
{
map1[1][j]=0;
}
}
int check_full()
{
int i,j;
int sum,num=0;
for (i=20;i>0;i--)
{
sum=0;
for (j=1;j<11;j++)
{
if (map1[i][j]==2)
{
sum++;
}
}
if (sum==10)
{
num++;
clear_full(i);
i++;
}
}
return num;
}
int check_over(brick& a)
{
int i,j;
for (i=1;i<5;i++)
{
for (j=4;j<8;j++)
{
if ((map1[i][j]+block[a.kind1][a.kind2][i][j])>2)
{
i=0;
return i;
}
}
}
if(i)
return i;
}
void erase_next()
{
setcursor(13,1);
cout<<" "<<"Next";
int i,j;
for (i=0;i<4;i++)
{
setcursor(14,3+i);
for (j=0;j<4;j++)
{
cout<<" ";
}
}
}
void main()
{
hidecursor();
int decide=1;
brick fk;
int kind_1,kind_2;
do 
{
int Time = GetTickCount();
int KeyTime = GetTickCount();
if (decide==2)
{
level=1;score=0;
}
srand((unsigned int) time(NULL));
fk.kind1=rand()%7;
fk.kind2=rand()%4;
game_init();
draw_next(fk.kind1,fk.kind2);
kind_1=fk.kind1;
kind_2=fk.kind2;
fk.kind1=rand()%7;
fk.kind2=rand()%4;
int lunhui=0;
while(1)
{
if (lunhui)
{
erase_next();
fk.kind1=kind_1;
fk.kind2=kind_2;
kind_1=rand()%7;
kind_2=rand()%4;
draw_next(kind_1,kind_2);
}
if (check_over(fk)==0)
{
setcursor(13,15);
cout<<"Game Over!";
fk.brick_draw();
setcursor(4,22);
char over;
cout<<"重玩请按Y,退出请按N:";
while(decide==1)
{
over=getch();
if (over=='y'||over=='Y')
{
decide=2;
}
else if(over=='n'||over=='N')
{
decide=0;
}
}
break;
}
else
{
fk.x=4;
fk.y=0;
fk.brick_draw();
}
int recheck=1;
do
{
if (GetTickCount()-Time >= 1000 /level) 
{
Time = GetTickCount();
if(fk.check_floor(fk.x,fk.y+1))
{
fk.brick_down();
}
else
{
fk.brick_solid_draw();
recheck=0;
}
}
if (GetTickCount()-KeyTime >= 100&&kbhit())
{
KeyTime = GetTickCount();
if (GetAsyncKeyState(VK_UP))
{
if (fk.check_change())
{
fk.brick_change();
}
}
if (GetAsyncKeyState(VK_DOWN))
{
if (fk.check_floor(fk.x,fk.y+1))
{
fk.brick_down();
}
else
{
fk.brick_solid_draw();
recheck=0;
}
}
if (GetAsyncKeyState(VK_LEFT))
{
if (fk.check_side((fk.x-1),fk.y))
{
fk.brick_erase();
fk.x=fk.x-1;
fk.brick_draw();
}
}
if (GetAsyncKeyState(VK_RIGHT))
{
if (fk.check_side((fk.x+1),fk.y))
{
fk.brick_erase();
fk.x=fk.x+1;
fk.brick_draw();
}
}
}
}while(recheck);
int check=check_full();
if (check)
{
draw_map();
score=10*(score/10+check);
draw_score();
if (score%100==0)
{
level++;
draw_level();
setcursor(4,22);
cout<<"Congratulations!!!";


break;
}
}
lunhui=1;
}
}while (decide);
system("cls");
}

所有者:NWW

[解决办法]
挺好。我在08上编译的,显示有点问题,按↑翻转后,方块显示有问题

[解决办法]
我用2010编译,图形翻转有偏差,右边空框 有位移现象
至于怎么改 我是菜鸟 只能等大神指点了
[解决办法]
崩溃的时候在弹出的对话框按相应按钮进入调试,按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处。

热点排行