《C俄罗斯方块源码(完整功能版)》由会员分享,可在线阅读,更多相关《C俄罗斯方块源码(完整功能版)(18页珍藏版)》请在金锄头文库上搜索。
1、先是效果图: 主菜单:游戏:设置:错误处理:627 行,代码如下:#include #include #include #include #include #include #include #pragma comment( lib,winmm.lib )/定义/方块#define NO 0#define SQR 1/碰撞检测#define OK 0#define CANTMOVE 1/方向#define UP 0#define DOWN 1#define LEFT 2#define RIGHT 3/错误码#define no_enough_memory0#define set_no_foun
2、d1#define dat_no_found2#define error_argument 3/函数声明/模块void play();/开始游戏void sets();/设置void highscores();/排行榜void copyright();/作者/功能void mapsetup();/准备地图bool newsqr();/放置方块,返回是否游戏结束int move(int direction);/移动方块,返回定义表void movetomap();/把当前方块移动到地图上int wholeline();/检查是否组成了一层,返回层数,-1 表示没有void deleteline(
3、int which);/删除一行void endup();/结束游戏,清理内存/显示void show();/刷新画面void showmenu(char* menu);/显示菜单/文件void loadset();/加载设置void saveset();/保存设置void loadhs();/加载排行榜bool addscores(int score,char name50);/增加一个分数,返回是否是高分void savehs();/保存排行榜/坐标变换int get(int x,int y);void set(int x,int y,int date);/结构/设置structint x
4、s,ys;/屏幕大小int speed;/速度char sqr3,no3,frame3;/方块、空白处、边框的样式gameset;/排行榜structchar name50; int score;rating10;/全局变量/变量int* map=NULL;/地图bool now44;/当前方块int xnow,ynow;/当前位置int guide;/分数/常量const bool shap744=/形状 0,0,0,0,0,0,0,0,1,1,1,1,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,1,0,0,1,0,0,0,
5、0,0, 0,0,0,0,1,0,0,0,1,1,1,0,0,0,0,0, 0,0,0,0,0,0,0,1,0,1,1,1,0,0,0,0, 0,1,0,0,0,1,1,0,0,0,1,0,0,0,0,0, 0,0,1,0,0,1,1,0,0,1,0,0,0,0,0,0,;const char errword450=程序没能取得足够的内存,无法打开或找不到设置文件 set.ini,无法打开或找不到排行榜数据 highscore.dat,您设置的参数太大或者太小;/控制台HANDLEhout;/控制台句柄COORD curpos=0,0;/光标坐标/主函数int main()start1: tr
6、yhout = GetStdHandle(STD_OUTPUT_HANDLE);/获取控制台句柄,以便移动光标srand(time(0);/用当前时间初始化随机数生成器loadset();/加载loadhs();start2:while(1)showmenu(俄罗斯方块n 请选择菜单:n1.开始游戏n2.设置n3.排行榜n4.帮助n5. 保存并退出n);switch(getch()case 1:system(cls);/play 函数覆盖界面而不是清屏,所以需要先清屏play(); break; case 2:sets(); break; case 3:highscores(); break;
7、case 4:copyright(); break;case 5:savehs();/保存数据saveset();return 0;catch(int errnum)/错误处理system(cls);printf(o()o 出错啦!n 程序收到了一条错误信息,错误码是:%d(%s)n 您可以联系我们解决这个问题。n,errnum,errworderrnum);printf(n 你可以选择以下操作:n1.重启程序n2.以默认设置重启程序n3.向设置和数据文件写入默认设置然后重启n4.退出n);switch(getch()case 1:goto start1; case 2:gameset.xs=
8、20; gameset.ys=20; gameset.speed=100;strcpy(gameset.sqr,);/无法直接给数组复制数据strcpy(gameset.no, );strcpy(gameset.frame,:); int i;for(i=0;i10;i+)strcpy(ratingi.name,未命名),ratingi.score=0; goto start2;case 3:ofstream fout; fout.open(set.ini); fout20n20n100n n:n; fout.close();fout.clear(); fout.open(highscore.
9、dat); int j;for(j=0;j10;j+)fout未命名n0n; goto start1;default:return -1;/返回异常退出return 0;void play()mapsetup();/初始化/*for(int i=0;i20;i+) set(i,19,SQR);*/while(newsqr()/不断新建方块,直到返回 NOwhile(move(DOWN)!=CANTMOVE)/每次向下移动方块,直到不能移动guide+=1;/向下移动一次加 1 分show();/显示while(kbhit()/不断处理键盘,直到没有按键switch(getch()/获取按键ca
10、se w:move(UP); break;case s:move(DOWN); break;case a:move(LEFT); break;case d:move(RIGHT); break;Sleep(gameset.speed);/延时movetomap();/退出循环时无法向下移动,把当前方块移动到地图上int line;while(line=wholeline()!=-1);/不断检查是否出现整行,直到没有deleteline(line);/删除整行endup();/无法新建方块,游戏结束return;/结束/函数定义void mapsetup()map=new intgameset
11、.xs*gameset.ys;/申请内存if(!map)/如果申请到 0throw no_enough_memory;/抛出异常/初始化地图int i,j;for(i=0;igameset.xs;i+)for(j=0;jgameset.ys;j+)set(i,j,NO);guide=0;/分数清零return;int get(int x,int y)if(y=0&x=0&y=0&x=0&y0&x0&y gameset.ys)/是否在地图范围内*(map+y*gameset.xs+x)=date;/写入return;bool newsqr() int i,j;for(i=0;i4;i+)/检查下
12、一个方块要出现的地方是否有方块if(get(gameset.xs/2+i,0)=SQR)return false;/有方块,创建失败int which=rand()%7;/随机选择形状for(i=0;i4;i+)for(j=0;j0;i-)/旋转随机 0-3 次move(UP); xnow=gameset.xs/2;/设置坐标ynow=-4;return true;int move(int direction)int x,y;/储存坐标偏移量int i,j;switch(direction)case UP:/上键是旋转bool newshap44;/储存旋转后的图形for(i=0;i4;i+)for(j=0;j4;j+)newshapij=nowj3-i;/坐标变换for(i=0;i4;i+)for(j=0;j4;j+)if(newshapij=true&get(xnow+i,ynow+j)=SQR)/对新图形碰撞检测return CANTMOVE;/不能旋转for(i=0;i4;i+)