这篇文章主要介绍linux环境下C++实现俄罗斯方块的案例,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!
创新互联建站是少有的成都网站制作、成都网站设计、外贸营销网站建设、营销型企业网站、微信小程序定制开发、手机APP,开发、制作、设计、友情链接、推广优化一站式服务网络公司,于2013年开始,坚持透明化,价格低,无套路经营理念。让网页惊喜每一位访客多年来深受用户好评具体内容如下
本程序的运行环境是linux,用到了多线程。创建了一个用来绘图的线程和一个获取按键的线程。程序中有一些需要改善的地方,比如336-338行定义的全局变量以及声明的对象。本来声明的Block和Table对象应该在main函数里面,然后将这两个对象作为参数传递给线程函数getkey。但是好像只能传递一个对象参数给线程函数。希望高手能够对程序进行改进。
ps:由于用到了多线程,而pthread不是linux的默认库,所以编译的时候需要指定线程库。即:g++ -o block -lpthread block.cpp
#include#include #include #include #include #include #define TABLE_SIZE 20 #define BLOCK_SIZE 4 #define SLEEP_TIME 500 using namespace std; struct grid{int x; int y;}; //坐标 /////////////////////Block 类////////////////////// class Block { public: enum direct{UP, DOWN, LEFT, RIGHT}; //定义方向 grid g[BLOCK_SIZE]; //方块的坐标信息 void def_block(grid g1, grid g2, grid g3, grid g4); //定义方块 void rotate(); //旋转方块 void move(int dir); //移动方块 void set_cen(grid g); //设置方块旋转中心 grid get_cen(); //获取方块旋转中心 void set_type(int t); //设置方块种类 int get_type(); //获取方块种类 void back(); //旋转还原 void creat_block(int x, int y); //随机生成方块 private: grid center; //方块旋转中心 int type; //方块类型 }; void Block::def_block(grid g1, grid g2, grid g3, grid g4) { g[0]=g1; g[1]=g2; g[2]=g3; g[3]=g4; } void Block::rotate() { int x, y, i=0; for(i; i<=3; i++) { x=g[i].x-center.x; y=g[i].y-center.y; g[i].x=center.x+y; g[i].y=center.y-x; } } void Block::move(int dir) { int d=dir, i=0; switch(d) { case UP: { for(i; i<=3; i++) g[i].y++; center.y++; break; } case DOWN: { for(i; i<=3; i++) g[i].y--; center.y--; break; } case LEFT: { for(i; i<=3; i++) g[i].x--; center.x--; break; } case RIGHT: { for(i; i<=3; i++) g[i].x++; center.x++; break; } } } void Block::set_cen(grid g) { center=g; } grid Block::get_cen() { return center; } void Block::set_type(int t) { type=t; } int Block::get_type() { return type; } void Block::back() { int x, y, i=0; for(i; i<=3; i++) { x=g[i].x-center.x; y=g[i].y-center.y; g[i].x=center.x-y; g[i].y=center.y+x; } } void Block::creat_block(int x, int y) { //随机创建方块 int ran; grid g[BLOCK_SIZE]; ran=1+rand()%7; switch(ran) { //L case 1: { g[0].x=x/2; g[0].y=y-3; g[1].x=g[0].x; g[1].y=g[0].y+1; g[2].x=g[0].x; g[2].y=g[0].y+2; g[3].x=g[0].x+1; g[3].y=g[0].y; set_cen(g[0]); set_type(1); break; } //反L case 2: { g[0].x=x/2; g[0].y=y-3; g[1].x=g[0].x; g[1].y=g[0].y+1; g[2].x=g[0].x; g[2].y=g[0].y+2; g[3].x=g[0].x-1; g[3].y=g[0].y; set_cen(g[0]); set_type(2); break; } //Z case 3: { g[0].x=x/2; g[0].y=y-2; g[1].x=g[0].x; g[1].y=g[0].y+1; g[2].x=g[0].x+1; g[2].y=g[0].y+1; g[3].x=g[0].x-1; g[3].y=g[0].y; set_cen(g[0]); set_type(3); break; } //反Z case 4: { g[0].x=x/2; g[0].y=y-2; g[1].x=g[0].x; g[1].y=g[0].y+1; g[2].x=g[0].x+1; g[2].y=g[0].y+1; g[3].x=g[0].x-1; g[3].y=g[0].y; set_cen(g[0]); set_type(4); break; } //田 case 5: { g[0].x=x/2; g[0].y=y-2; g[1].x=g[0].x; g[1].y=g[0].y+1; g[2].x=g[0].x+1; g[2].y=g[0].y+1; g[3].x=g[0].x+1; g[3].y=g[0].y; set_cen(g[0]); set_type(5); break; } //1 case 6: { g[0].x=x/2; g[0].y=y-3; g[1].x=g[0].x; g[1].y=g[0].y+1; g[2].x=g[0].x; g[2].y=g[0].y+2; g[3].x=g[0].x; g[3].y=g[0].y-1; set_cen(g[0]); set_type(6); break; } //山 case 7: { g[0].x=x/2; g[0].y=y-2; g[1].x=g[0].x; g[1].y=g[0].y+1; g[2].x=g[0].x-1; g[2].y=g[0].y; g[3].x=g[0].x+1; g[3].y=g[0].y; set_cen(g[0]); set_type(7); break; } default: ; } def_block(g[0], g[1], g[2], g[3]); } ///////////////////////////////////////// ////////////////////Table 类////////////////////// class Table { public: Table() { //构造棋盘 height=20; width=10; count=0; init_table(); } Table(int x, int y); int set_block(Block bl); //安设方块 void clr_block(Block bl); //清除方块 int clr_line(int y); //消行 int get_h(); //获取棋盘高度 int get_w(); //获取棋盘宽度 int if_full(int y); //判定是否满行 int get_table(int x, int y); //获取棋盘上点信息 void paint(); //绘制棋盘 void move_line(int y); //整行下移 void set_count(int c); //记录得分 int get_count(); //获取得分 private: int table[TABLE_SIZE][TABLE_SIZE];//棋盘 int height, width; //棋盘的高和宽 int count; //得分 void init_table(); //棋盘初始化 }; void Table::init_table() { int i=0, j=0; for(i; i =width || x<0 || y>=height || y<0) { return 0; } } for(i=0; i<=3; i++) { x=bl.g[i].x; y=bl.g[i].y; table[x][y]=1; } return 1; } void Table::clr_block(Block bl) { int x, y; for(int i=0; i<=3; i++) { x=bl.g[i].x; y=bl.g[i].y; table[x][y]=0; } } int Table::clr_line(int y) { if(y<0 || y>=height) return 0; for(int i=0; i =0; i--) { cout<<"|"< =65) flag=0;//如果按的键是方向键,则将标志位置0并执行相应的处理. if(flag==0) { if(buf[0]==65) { //if(dir!=0) { if(bl.get_type()==5) continue; //如果出现田字形则不作旋转 tab.clr_block(bl); //清空方块上一次位置 bl.rotate(); //开始旋转 if(!tab.set_block(bl)) { //将旋转后的方块写在棋盘上 bl.back(); //如果写失败(例如到边线了,或卡住了)则还原旋转前位置 continue; tab.set_block(bl); } } //下(加速下落) //dir=GetAsyncKeyState(VK_DOWN); //获取向下 if(buf[0]==66) { tab.clr_block(bl); //清空方块上一次位置 bl.move(bl.DOWN); //向下移动一步 if(!tab.set_block(bl)) { //将移动后的方块写在棋盘上 bl.move(bl.UP); //如果失败,则还原到移动前的位置(即上移一步) tab.set_block(bl); } } //左(左移) //dir=GetAsyncKeyState(VK_LEFT); if(buf[0]==68) { tab.clr_block(bl); bl.move(bl.LEFT); if(!tab.set_block(bl)) { bl.move(bl.RIGHT); tab.set_block(bl); } } //右(右移) //dir=GetAsyncKeyState(VK_RIGHT); if(buf[0]==67) { tab.clr_block(bl); bl.move(bl.RIGHT); if(!tab.set_block(bl)) { bl.move(bl.LEFT); tab.set_block(bl); } } flag=1; } } tcsetattr(0,TCSANOW,&saveterm); } ////////////主函数部分/////////////////////// int main() { //Table tab(15, 20); //构造一个15,20的棋盘 //Block bl; //构造一个落下方块 Mythread thread; thread.init(); int dir,i,c; while(true) { //生成方块 srand(time(0)); bl.creat_block(tab.get_w(), tab.get_h()); //判断游戏是否结束 if( !tab.set_block(bl) ) { system("clear"); cout<<"GAME OVER!"< 以上是“linux环境下C++实现俄罗斯方块的案例”这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注创新互联网站建设公司行业资讯频道!
另外有需要云服务器可以了解下创新互联建站www.cdcxhl.com,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。
网站栏目:linux环境下C++实现俄罗斯方块的案例-创新互联
文章网址:http://cdweb.net/article/idggo.html