C++俄罗斯方块源码完整功能版Word文件下载.docx

上传人:b****6 文档编号:19324865 上传时间:2023-01-05 格式:DOCX 页数:24 大小:216.42KB
下载 相关 举报
C++俄罗斯方块源码完整功能版Word文件下载.docx_第1页
第1页 / 共24页
C++俄罗斯方块源码完整功能版Word文件下载.docx_第2页
第2页 / 共24页
C++俄罗斯方块源码完整功能版Word文件下载.docx_第3页
第3页 / 共24页
C++俄罗斯方块源码完整功能版Word文件下载.docx_第4页
第4页 / 共24页
C++俄罗斯方块源码完整功能版Word文件下载.docx_第5页
第5页 / 共24页
点击查看更多>>
下载资源
资源描述

C++俄罗斯方块源码完整功能版Word文件下载.docx

《C++俄罗斯方块源码完整功能版Word文件下载.docx》由会员分享,可在线阅读,更多相关《C++俄罗斯方块源码完整功能版Word文件下载.docx(24页珍藏版)》请在冰豆网上搜索。

C++俄罗斯方块源码完整功能版Word文件下载.docx

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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 人文社科 > 军事政治

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1