C++俄罗斯方块源码完整功能版Word文件下载.docx
《C++俄罗斯方块源码完整功能版Word文件下载.docx》由会员分享,可在线阅读,更多相关《C++俄罗斯方块源码完整功能版Word文件下载.docx(24页珍藏版)》请在冰豆网上搜索。
void
play();
//开始游戏
sets();
//设置
highscores();
//排行榜
copyright();
//作者
//功能
mapsetup();
//准备地图
bool
newsqr();
//放置方块,返回是否游戏结束
int
move(int
direction);
//移动方块,返回定义表
movetomap();
//把当前方块移动到地图上
wholeline();
//检查是否组成了一层,返回层数,-1表示没有
deleteline(int
which);
//删除一行
endup();
//结束游戏,清理内存
//显示
show();
//刷新画面
showmenu(char*
menu);
//显示菜单
//文件
loadset();
//加载设置
saveset();
//保存设置
loadhs();
//加载排行榜
addscores(int
score,char
name[50]);
//增加一个分数,返回是否是高分
savehs();
//保存排行榜
//坐标变换
get(int
x,int
y);
set(int
y,int
date);
//结构
struct{
xs,ys;
//屏幕大小
speed;
//速度
char
sqr[3],no[3],frame[3];
//方块、空白处、边框的样式
}gameset;
name[50];
score;
}rating[10];
//全局变量
//变量
int*
map=NULL;
//地图
now[4][4];
//当前方块
xnow,ynow;
//当前位置
guide;
//分数
//常量
const
shap[7][4][4]={//形状
{\
0,0,0,0,\
1,1,1,1,\
},\
0,1,1,0,\
0,1,1,1,\
0,0,1,0,\
1,0,0,0,\
1,1,1,0,\
0,0,0,1,\
0,1,0,0,\
}\
};
errword[4][50]={"
程序没能取得足够的内存"
"
无法打开或找不到设置文件set.ini"
无法打开或找不到排行榜数据highscore.dat"
您设置的参数太大或者太小"
//控制台
HANDLE
hout;
//控制台句柄
COORD
curpos={0,0};
//光标坐标
//主函数
main()
{
start1:
try
hout
=
GetStdHandle(STD_OUTPUT_HANDLE);
//获取控制台句柄,以便移动光标
srand(time(0));
//用当前时间初始化随机数生成器
//加载
start2:
while
(1)
showmenu("
俄罗斯方块\n请选择菜单:
\n1.开始游戏\n2.设置\n3.排行榜\n4.帮助\n5.保存并退出\n"
);
switch(getch())
case
'
1'
:
system("
cls"
//play函数覆盖界面而不是清屏,所以需要先清屏
break;
2'
3'
4'
5'
//保存数据
return
0;
}
catch(int
errnum)//错误处理
printf("
o(>
﹏<
)o
出错啦!
\n程序收到了一条错误信息,错误码是:
%d(%s)\n您可以联系我们解决这个问题。
\n"
errnum,errword[errnum]);
\n你可以选择以下操作:
\n1.重启程序\n2.以默认设置重启程序\n3.向设置和数据文件写入默认设置然后重启\n4.退出\n"
goto
start1;
gameset.xs=20;
gameset.ys=20;
gameset.speed=100;
strcpy(gameset.sqr,"
[]"
//无法直接给数组复制数据
strcpy(gameset.no,"
"
strcpy(gameset.frame,"
i;
for(i=0;
i<
10;
i++)
strcpy(rating[i].name,"
未命名"
),rating[i].score=0;
start2;
ofstream
fout;
fout.open("
set.ini"
fout<
20\n20\n100[]\n
\n:
;
fout.close();
fout.clear();
highscore.dat"
j;
for(j=0;
j<
j++)
未命名\n0\n"
default:
-1;
//返回异常退出
play()
//初始化
/*for(int
i=0;
20;
set(i,19,SQR);
*/
while(newsqr())//不断新建方块,直到返回NO
while(move(DOWN)!
=CANTMOVE)//每次向下移动方块,直到不能移动
guide+=1;
//向下移动一次加1分
while(kbhit())//不断处理键盘,直到没有按键
switch(getch())//获取按键
w'
move(UP);
s'
move(DOWN);
a'
move(LEFT);
d'
move(RIGHT);
Sleep(gameset.speed);
//延时
//退出循环时无法向下移动,把当前方块移动到地图上
line;
while((line=wholeline())!
=-1);
//不断检查是否出现整行,直到没有
deleteline(line);
//删除整行
//无法新建方块,游戏结束
return;
//结束
//函数定义
mapsetup()
map=new
int[gameset.xs*gameset.ys];
//申请内存
if(!
map)//如果申请到0
throw
no_enough_memory;
//抛出异常
//初始化地图
i,j;
gameset.xs;
gameset.ys;
set(i,j,NO);
guide=0;
//分数清零
y)
if(y<
0)//上方虚拟为空
NO;
if(x>
=0&
&
x<
gameset.xs&
y>
y<
gameset.ys)//是否在地图范围内
*(map+y*gameset.xs+x);
//提取数据
else
SQR;
//虚拟地图侧面和底部有方块
date)
gameset.ys)//if(x>
0&
*(map+y*gameset.xs+x)=date;
//写入
newsqr(){
4;
i++)//检查下一个方块要出现的地方是否有方块
if(get(gameset.xs/2+i,0)==SQR)
false;
//有方块,创建失败
which=rand()%7;
//随机选择形状
now[i][j]=shap[which][i][j];
//复制形状
for(i=rand()%4;
i>
i--)//旋转随机0-3次
xnow=gameset.xs/2;
//设置坐标
ynow=-4;
true;
direction){
x,y;
//储存坐标偏移量
switch(direction)
UP:
//上键是旋转
newshap[4][4];
//储存旋转后的图形
newshap[i][j]=now[j][3-i];
if(newshap[i][j]==true&
get(xnow+i,ynow+j)==SQR)//对新图形碰撞检测
CANTMOVE;
//不能旋转
now[i][j]=newshap[i][j];
//检测完毕,复制形状
OK;
DOWN:
//先记录坐标的偏移量,确定没有碰撞以后移动
x=0,y=1;
LEFT:
x=-1;
y=0;
RIGHT:
x=1,y=0;
if(now[i][j]==true&
get(i+x+xnow,j+y+ynow)==SQR)//如果和地图上的方块重合(边缘以外get函数也返回SQR,不必单独处理)//if(get(i+x,j+y)==SQR)//if(now[i+x][j+y]==SQR)
//无法移动
xnow+=x;
//检测完毕,更改坐标
ynow+=y;
movetomap(){
guide+=10;
//成功放置方块,加10分
if(now[i][j]==true)
set(xnow+i,ynow+j,SQR);
//复制方块到地图
wholeline(){
whole;
//储存是否是整行
j++)//for(i=0;
whole=true;
//假设是整行
i++)//for(j=0;
if(get(i,j)==NO)
whole=false;
//有空,不是整行
if(whole)
//是整行,返回
//没找到整行,返回
which){
guide+=1000;
//消方块,奖励分数
for(i=which;
=0;
i--)
set(j,i,get(j,i-1));
//移动上面的所有方块,覆盖这一行。
最上面虚拟成了空,不必特殊处理
endup(){
delete
map;
//清理内存
while(kbhit())//清除所有未处理的按键
getchar();
游戏结束,请输入您的姓名:
name[50]="
noname"
scanf("
%s"
&
name[0]);
//输入
word[1000];
//储存格式化以后的字符串
sprintf(&
word[0],"
游戏结束!
\n\n您(%s)的积分是:
%d\n\n%s\n\n请按任意键继续·
·
name,guide,((addscores(guide,name))?
你进入了排行榜"
你没有进入排行榜"
));
showmenu(&
word[0]);
getch();
//显示排行榜
show(){
SetConsoleCursorPosition(hout,curpos);
//system("
//光标移至左上角,覆盖之前的图案
当前积分:
%d\n"
guide);
gameset.xs+2;
i++)//输出上边框
printf(gameset.frame);
//左边框
if(i>
=xnow&
(xnow+4)&
j>
=ynow&
(ynow+4))//if(i>
(xnow+1)&
(ynow+1))//在当前方块范围内
if(now[i-xnow][j-ynow]==true)//如果有方块
printf(gameset.sqr);
else
if(get(i,j)==SQR)//如果地图有方块
else//否则,空白
printf(gameset.no);
else//不在当前方块范围内,输出地图
if(get(i,j)==SQR)//有方块
else//否则,没方块
//右边框和换行
i++)//下边框
menu)
output[100];
//储存本行的文字
g