C俄罗斯方块源码完整功能版.docx
- 文档编号:277480
- 上传时间:2022-10-08
- 格式:DOCX
- 页数:23
- 大小:216.45KB
C俄罗斯方块源码完整功能版.docx
《C俄罗斯方块源码完整功能版.docx》由会员分享,可在线阅读,更多相关《C俄罗斯方块源码完整功能版.docx(23页珍藏版)》请在冰豆网上搜索。
C俄罗斯方块源码完整功能版
先是效果图:
主菜单:
游戏:
设置:
错误处理:
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_memory 0
#define set_no_found 1
#define dat_no_found 2
#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(int which);//删除一行
void endup();//结束游戏,清理内存
//显示
void show();//刷新画面
void showmenu(char* menu);//显示菜单
//文件
void loadset();//加载设置
void saveset();//保存设置
void loadhs();//加载排行榜
bool addscores(int score,char name[50]);//增加一个分数,返回是否是高分
void savehs();//保存排行榜
//坐标变换
int get(int x,int y);
void set(int x,int y,int date);
//结构
//设置
struct{
int xs,ys;//屏幕大小
int speed;//速度
char sqr[3],no[3],frame[3];//方块、空白处、边框的样式
}gameset;
//排行榜
struct{
char name[50];
int score;
}rating[10];
//全局变量
//变量
int* map=NULL;//地图
bool now[4][4];//当前方块
int xnow,ynow;//当前位置
int guide;//分数
//常量
const bool shap[7][4][4]={//形状
{\
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,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 errword[4][50]={"程序没能取得足够的内存","无法打开或找不到设置文件set.ini","无法打开或找不到排行榜数据highscore.dat","您设置的参数太大或者太小"};
//控制台
HANDLE hout;//控制台句柄
COORD curpos={0,0};//光标坐标
//主函数
int main()
{
start1:
try
{
hout = 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;
case '4':
copyright();
break;
case '5':
savehs();//保存数据
saveset();
return 0;
}
}
}
catch(int errnum)//错误处理
{
system("cls");
printf("o(>﹏<)o 出错啦!
\n程序收到了一条错误信息,错误码是:
%d(%s)\n您可以联系我们解决这个问题。
\n",errnum,errword[errnum]);
printf("\n你可以选择以下操作:
\n1.重启程序\n2.以默认设置重启程序\n3.向设置和数据文件写入默认设置然后重启\n4.退出\n");
switch(getch())
{
case '1':
goto start1;
case '2':
gameset.xs=20;
gameset.ys=20;
gameset.speed=100;
strcpy(gameset.sqr,"[]");//无法直接给数组复制数据
strcpy(gameset.no," ");
strcpy(gameset.frame,":
:
");
int i;
for(i=0;i<10;i++)
strcpy(rating[i].name,"未命名"),rating[i].score=0;
goto start2;
case '3':
{
ofstream fout;
fout.open("set.ini");
fout<<"20\n20\n100[]\n \n:
:
\n";
fout.close();
fout.clear();
fout.open("highscore.dat");
int j;
for(j=0;j<10;j++)
fout<<"未命名\n0\n";
goto start1;
}
default:
return -1;//返回异常退出
}
}
return 0;
}
void play()
{
mapsetup();//初始化
/*for(int i=0;i<20;i++)
set(i,19,SQR);*/
while(newsqr())//不断新建方块,直到返回NO
{
while(move(DOWN)!
=CANTMOVE)//每次向下移动方块,直到不能移动
{
guide+=1;//向下移动一次加1分
show();//显示
while(kbhit())//不断处理键盘,直到没有按键
{
switch(getch())//获取按键
{
case '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(
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 俄罗斯方块源码完整功能版 俄罗斯方块 源码 完整 功能