俄罗斯方块
还记得俄罗斯方块吗?相信这是小时候我们每个人都喜欢玩的一个小游戏。顾名思义,俄罗斯方块自然是俄罗斯人发明的。这人叫阿列克谢·帕基特诺夫。他设置这个游戏的规则是:由小方块组成的不同形状的板块陆续从屏幕上方落下来,玩家通过调整板块的位置和方向,使它们在屏幕底部拼出完整的一条或几条。这些完整的横条会随即消失,给新落下来的板块腾出空间,与此同时,玩家得到分数奖励。没有被消除掉的方块不断堆积起来,一旦堆到屏幕顶端,玩家便告输,游戏结束。
实现思路
那么问题就来了,如何用我们学过的C++去实现这个游戏呢?其实在写代码的时候,我们遵循的一个策略就是“拆分法”,从大的框架去一步步拆解成每个小的部分,然后这每个小的部分你都能用C++去实现它;要是拆分的小部分你还是实现不了,那就继续拆分,知道你能实现为止。比如这个俄罗斯方块的游戏,你的思路应该是这样:
1、画出游戏地图,并留出下一图形和分数显示的位置
2、图形的建立和颜色
3、图形下落的实现以及上一图形的清除
4、是否能继续下落或变形的检测
5、某一行是否已满需清除以及清除功能与分数更新
实现代码如下
#include#include#include#include#include#include#includeusingnamespacestd;classTetris{private:intrank;//游戏难度等级intscore;//得分intid;//图形IDintpoint[2];//两基点inttop;//最高点高度public:Tetris;voidWelocme;//首界面voidDrawMap;//游戏界面voidSetColor(int);//控制颜色voidDraw(int,int,int);//画图形voidRun;//运行游戏voidReDraw(int,int,int);//清除图形boolJudge(int,int,int);voidTurn(int);//旋转voidUpdata;//更新界面voidPause;//游戏暂停voidInput_score;};constintsharp[15][8]=//组成图形的各个点的各个坐标,先纵后横{{0,0,1,0,2,0,3,0},{0,0,0,1,0,2,0,3},{0,0,1,0,0,1,1,1},{0,0,1,0,1,1,1,2},{0,1,1,1,2,0,2,1},{0,0,0,1,0,2,1,2},{0,0,0,1,1,0,2,0},{1,0,1,1,1,2,0,2},{0,0,0,1,1,1,2,1},{0,0,0,1,0,2,1,0},{0,0,1,0,2,0,2,1},{0,0,0,1,1,1,1,2},{0,1,1,0,1,1,2,0},{0,1,0,2,1,0,1,1},{0,0,1,0,1,1,2,1}};constinthigh[15]={4,1,2,2,3,2,3,2,3,2,3,2,3,2,3};intmap[28][16];#definea10//条形#definea21#defineb2//方块#definec13//L形#definec24#definec35#definec46#defined17//T形#defined28#defined39#defined410#definee111//闪电1形#definee212#definef113//闪电2形#definef214Tetris::Tetris//构造函数,初始化各个值{point[0]=0;point[1]=5;score=0;top=25;}voidTetris::Turn(intnum)//旋转函数{switch(num){casea1:id=a2;break;//条形互换casea2:id=a1;break;caseb:id=b;break;//方块无法旋转casec1:id=c2;break;//各种L形互换casec2:id=c3;break;casec3:id=c4;break;casec4:id=c1;break;cased1:id=d2;break;//各种T形互换cased2:id=d3;break;cased3:id=d4;break;cased4:id=d1;break;casee1:id=e2;break;//两种闪电形互换casee2:id=e1;break;casef1:id=f2;break;casef2:id=f1;break;}}voidSetPos(inti,intj)//控制光标位置,列,行{COORDpos={i,j};SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),pos);}voidTetris::Pause//暂停函数{SetPos(32,10);cout<<"游戏暂停!"<=top;k--){for(intp=0;p<13;p++){map[k][p]=map[k-1][p];SetPos((p+1)*2,k+1);if(map[k][p]==1)cout<<"■";elsecout<<"";}}score+=10;Input_score;}}}voidTetris::Input_score{SetColor(3);SetPos(30,19);cout<<"得分:"<='0'){rank=x-'0';break;}}}voidTetris::SetColor(intcolor_num)//设置颜色{intn;switch(color_num){case0:n=0x08;break;case1:n=0x0C;break;case2:n=0x0D;break;case3:n=0x0E;break;case4:n=0x0A;break;}SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),n);}voidTetris::DrawMap//画游戏时界面{inti;SetColor(0);for(i=0;i<24;i++)//宽24格{SetPos(i*2,0);cout<<"■";SetPos(i*2,26);cout<<"■";}for(i=0;i<26;i++)//高26格{SetPos(0,i);cout<<"■";SetPos(28,i);cout<<"■";SetPos(46,i);cout<<"■";}for(i=14;i<24;i++){SetPos(i*2,16);cout<<"■";}SetColor(3);Input_score;SetPos(30,21);cout<<"难度等级:"<=0&&ny<13&&ny>=0&&!map[nx][ny]))returntrue;}returnfalse;}voidTetris::Run//运行游戏{intnext_id;srand((int)time(0));id=rand%15;next_id=rand%15;Draw(point[0],point[1],id);Draw(5,16,next_id);intcount;if(rank==1)count=150;elseif(rank==2)count=100;elseif(rank==3)count=50;elsecount=5;inti=0;//不同等级对应不同countwhile(1){if(!(i运行效果如下图所示出现的问题这个代码还是有一点问题的,如上图所示,需要后续不断改进。粉丝中有看了之后改进好了的,欢迎和我一起交流
运行效果如下图所示
出现的问题
这个代码还是有一点问题的,如上图所示,需要后续不断改进。粉丝中有看了之后改进好了的,欢迎和我一起交流
上一篇:[情报站]LCK官宣:春季赛1月18日开赛,揭幕战DK对阵DRX
下一篇:未来的国产顶尖选手再添一人, 继UZI后Letme晒出儿子和妻子合照!
哈哈哈 子弹越打越多了
.
《刺客信条: 黑旗 记忆重置》回应DLC比本体贵: DLC非必须
当臭猫扶贫神秘嘉豪号主!
原神: 7.0奥黛塔定位反转! 并非木偶专属, 冰神设计成最大悬念
哪辆车能不被28吨钢卷压成废铁? 哪辆车能不被28吨钢卷压成废铁?
原神: 新超导木偶队顶配配装攻略! 告别刮痧与充能卡顿