俄罗斯方块C语言版本.docx
- 文档编号:2611758
- 上传时间:2023-05-04
- 格式:DOCX
- 页数:25
- 大小:21.15KB
俄罗斯方块C语言版本.docx
《俄罗斯方块C语言版本.docx》由会员分享,可在线阅读,更多相关《俄罗斯方块C语言版本.docx(25页珍藏版)》请在冰点文库上搜索。
俄罗斯方块C语言版本
//俄罗斯方块.cpp:
Definestheentrypointfortheconsoleapplication.
//
#include"stdafx.h"
#include"all_include.h"
//-------------------------------------------------------------
//extern引用外部变量
externintfx[4][4];//方形
externintall_xy[35][60];//地图坐标
externintlx1[4][4],lx2[4][4],lx3[4][4],lx4[4][4];//L型
externintsx1[4][4],sx2[4][4],zx1[4][4],zx2[4][4];//S型
externinttx1[4][4],tx2[4][4],tx3[4][4],tx4[4][4];//T型
externintjx1[4][4],jx2[4][4],jx3[4][4],jx4[4][4];//J型
externintix1[4][4],ix2[4][4];//I型
//------------------------------------------------------------
int(*now)[4],(*next)[4],rand_data=0,olde_rand=0;
intll=0,ss=0,zz=0,tt=0,ii=0,jj=0,fenshu=0;
POINTbegin_xy,print_xy;
intkey,i,j,sleep_time=10,end_hand=0/*方块与顶部的距离*/,in_time=0;
//-------------------------------------------------------------
intmain()
{
BOOLpush=FALSE;
//设置窗口标题
charstrTitle[255];
GetConsoleTitle(strTitle,255);
HWNDhwnd=FindWindow("ConsoleWindowClass",strTitle);
SetWindowText(hwnd,"俄罗斯方块");
colorful();
HideCursor();//隐藏光标
while
(1)//进入主体
{
begin_xy.x=7,begin_xy.y=1,fenshu=0,sleep_time=30;//方块初始位置从第7列第1行开始降落
srand(time(NULL));//随机数发生器的初始化函数
next=&fx[0];//初始化第一个next,使得其指向方形方块数组的地址
chushihua();//初始化
memset(all_xy,0,sizeof(all_xy));//为新生成的内存初始化,数组清零
my_switch();
show_next(next);//显示下一个图形
for(i=0;i<24;i++)//边界均为1
{
all_xy[i][0]=1;
all_xy[22][i*2]=1;
all_xy[i][32]=1;
}
while
(1)//主体部分
{
while(kbhit())//检查当前是否有键盘输入,若有则返回一个非0值
{
end_e();
key=get_key();//得到输入的按键码
if(push)//暂停
push=!
push;
switch(key)//匹配按键码
{
caseKEY_PUSH:
//空格键快速
while(found_error(begin_xy,now))
{
begin_xy.y++;end_hand++;
}break;
case115:
//S键
caseKEY_DOWN:
end_hand++;//↓键
if(begin_xy.y>=20)break;
begin_xy.y++;if(!
found_error(begin_xy,now))begin_xy.y--;break;
case119:
//W键
caseKEY_UP:
change_tx();break;//↑键改变方块图形
case97:
//A键
caseKEY_LEFT:
begin_xy.y--;//←键
begin_xy.x--;
if(!
found_error(begin_xy,now))
begin_xy.x++;
begin_xy.y++;
break;
case100:
//D键
caseKEY_RIGHT:
//→键
begin_xy.x++;begin_xy.y--;
if(!
found_error(begin_xy,now))begin_xy.x--;
begin_xy.y++;break;
caseKEY_ESC:
if(6==MessageBox(hwnd,"是否退出?
","询问",MB_YESNO|MB_ICONQUESTION))return0;break;//窗口
caseKEY_ADD:
if(sleep_time>=10)sleep_time-=10;break;//加速
caseKEY_NADD:
if(sleep_time<1000)sleep_time+=10;break;//减速
default:
push=!
push;break;//printf("%d",key);getch();暂停
}
print_e();//显示方块
}
Sleep(sleep_time);
if(!
found_error(begin_xy,now))
{
if(end_hand==0)//有一排方块达到顶格
{
if(6==MessageBox(hwnd,"\t游戏结束!
你弱爆了!
何必重新开始呢?
\n","你挂啦!
",MB_YESNO|MB_ICONQUESTION))//窗口
break;
else
return0;
}
begin_xy.y-=1;
set_data(begin_xy,now);
found_end();
//-----------------------------------
begin_xy.x=7,begin_xy.y=1,end_hand=0;
ll=0,ss=0,zz=0,tt=0,ii=0,jj=0;
//-----------------------------------
end_next(next);
my_switch();
show_next(next);
continue;
}
if(!
push&&in_time++==20)//?
?
?
?
?
{
end_e();
begin_xy.y++;in_time=0;
print_e();
}
}
}
return0;
}
intget_key()
{
/*对于上下左右和别的一些扩展键
使用getch()会先返回一个224,再使用一次getch()这时返回的才是扫描码*/
intc1,c2;
if((c1=getch())!
=224)returnc1;//
c2=getch();//直接获得按键,且不显示在屏幕上
returnc2;
}
voidprint_e()//显示方块
{
print_xy=begin_xy;
for(i=0;i<4;i++,print_xy.x++)
for(j=0,print_xy.y=begin_xy.y;j<4;j++,print_xy.y++)
if(now[i][j]==1)
{
gotoxy(print_xy.x*2,print_xy.y);printf("■");
}
}
voidend_e()//隐藏移动路径
{
print_xy=begin_xy;//开始的坐标值赋值给显示出来的坐标值
end_hand++;
for(i=0;i<4;i++,print_xy.x++)
for(j=0,print_xy.y=begin_xy.y;j<4;j++,print_xy.y++)
if(now[i][j]==1)
{
gotoxy(print_xy.x*2,print_xy.y);printf("");
}
}
voidmy_switch()//随机将一种类型方块的地址赋值给next
{
now=next;olde_rand=rand_data;
rand_data=rand()%7;//rang()函数产生随机数
switch(rand_data)
{
case0:
next=&fx[0];break;
case1:
next=&lx1[0];break;
case2:
next=&sx1[0];break;
case3:
next=&zx1[0];break;
case4:
next=&tx1[0];break;
case5:
next=&ix1[0];break;
case6:
next=&jx1[0];break;
}
}
voidchange_tx()
{
int(*olde)[4]=now;
switch(olde_rand)
{
case0:
break;
case1:
if(++ll==4)ll=0;
switch(ll)
{
case0:
now=&lx1[0];break;
case1:
now=&lx2[0];break;
case2:
now=&lx3[0];break;
case3:
now=&lx4[0];break;
}break;
case2:
if(++ss==2)ss=0;
switch(ss)
{
case0:
now=&sx1[0];break;
case1:
now=&sx2[0];break;
}break;
case3:
if(++zz==2)zz=0;
switch(zz)
{
case0:
now=&zx1[0];break;
case1:
now=&zx2[0];break;
}break;
case4:
if(++tt==4)tt=0;
switch(tt)
{
case0:
now=&tx1[0];break;
case1:
now=&tx2[0];break;
case2:
now=&tx3[0];break;
case3:
now=&tx4[0];break;
}break;
case5:
if(++ii==2)ii=0;
switch(ii)
{
case0:
now=&ix1[0];break;
case1:
now=&ix2[0];break;
}break;
case6:
if(++jj==4)jj=0;
switch(jj)
{
case0:
now=&jx1[0];break;
case1:
now=&jx2[0];break;
case2:
now=&jx3[0];break;
case3:
now=&jx4[0];break;
}break;
}
if(!
found_error(begin_xy,now))now=olde;
}
//stdafx.cpp:
sourcefilethatincludesjustthestandardincludes
//¶íÂÞ˹·½¿é.pchwillbethepre-compiledheader
//stdafx.objwillcontainthepre-compiledtypeinformation
#include"stdafx.h"
//TODO:
referenceanyadditionalheadersyouneedinSTDAFX.H
//andnotinthisfile
#include"stdafx.h"
#include"all_include.h"
intfx[4][4]={{0,0,0,0},{0,1,1,0},{0,1,1,0},{0,0,0,0}};
/*0,0,0,0,
0,1,1,0,
0,1,1,0,
0,0,0,0*/
//以上是方形
intlx1[4][4]={{0,1,0,0},{0,1,0,0},{0,1,1,0},{0,0,0,0}};
/*0,1,0,0,
0,1,0,0,
0,1,1,0,
0,0,0,0*/
intlx2[4][4]={{0,0,0,0},{0,1,1,1},{0,1,0,0},{0,0,0,0}};
/*0,0,0,0,
0,1,1,1,
0,1,0,0,
0,0,0,0*/
intlx3[4][4]={{0,0,0,0},{0,1,1,0},{0,0,1,0},{0,0,1,0}};
/*0,0,0,0,
0,1,1,0,
0,0,1,0,
0,0,1,0*/
intlx4[4][4]={{0,0,0,0},{0,0,1,0},{1,1,1,0},{0,0,0,0}};
/*0,0,0,0,
0,0,1,0,
1,1,1,0,
0,0,0,0*/
//以上是L形
intjx1[4][4]={{0,0,0,0},{0,1,0,0},{0,1,1,1},{0,0,0,0}};
/*0,0,0,0,
0,1,0,0,
0,1,1,1,
0,0,0,0*/
intjx2[4][4]={{0,0,0,0},{0,1,1,0},{0,1,0,0},{0,1,0,0}};
/*0,0,0,0,
0,1,1,0,
0,1,0,0,
0,1,0,0*/
intjx3[4][4]={{0,0,0,0},{1,1,1,0},{0,0,1,0},{0,0,0,0}};
/*0,0,0,0,
1,1,1,0,
0,0,1,0,
0,0,0,0*/
intjx4[4][4]={{0,0,1,0},{0,0,1,0},{0,1,1,0},{0,0,0,0}};
/*0,0,1,0,
0,0,1,0,
0,1,1,0,
0,0,0,0*/
//以上是J形
intsx1[4][4]={{0,0,0,0},{0,0,1,1},{0,1,1,0},{0,0,0,0}};
/*0,0,0,0,
0,0,1,1,
0,1,1,0,
0,0,0,0*/
intsx2[4][4]={{0,1,0,0},{0,1,1,0},{0,0,1,0},{0,0,0,0}};
/*0,1,0,0,
0,1,1,0,
0,0,1,0,
0,0,0,0*/
//以上是S形
intzx1[4][4]={{0,0,0,0},{1,1,0,0},{0,1,1,0},{0,0,0,0}};
/*0,0,0,0,
1,1,0,0,
0,1,1,0,
0,0,0,0*/
intzx2[4][4]={{0,0,1,0},{0,1,1,0},{0,1,0,0},{0,0,0,0}};
/*0,0,1,0,
0,1,1,0,
0,1,0,0,
0,0,0,0*/
//以上是Z形
inttx1[4][4]={{1,1,1,0},{0,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,0*/
inttx2[4][4]={{0,0,1,0},{0,1,1,0},{0,0,1,0},{0,0,0,0}};
/*0,0,1,0,
0,1,1,0,
0,0,1,0,
0,0,0,0*/
inttx3[4][4]={{0,0,0,0},{0,0,1,0},{0,1,1,1},{0,0,0,0}};
/*0,0,0,0,
0,0,1,0,
0,1,1,1,
0,0,0,0*/
inttx4[4][4]={{0,1,0,0},{0,1,1,0},{0,1,0,0},{0,0,0,0}};
/*0,1,0,0,
0,1,1,0,
0,1,0,0,
0,0,0,0*/
//以上是T形
intix1[4][4]={{0,1,0,0},{0,1,0,0},{0,1,0,0},{0,1,0,0}};
/*0,1,0,0,
0,1,0,0,
0,1,0,0,
0,1,0,0*/
intix2[4][4]={{0,0,0,0},{1,1,1,1},{0,0,0,0},{0,0,0,0}};
/*0,0,0,0,
1,1,1,1,
0,0,0,0,
0,0,0,0*/
//以上是I形
intall_xy[35][60];//地图坐标
externintfenshu;//分数
voidfound_end()//到了最底层
{
inti=21,j,k,how=0;//i代表竖格子数,j代表横的格子数,how代表几层(一二三四)
BOOLyes=TRUE,end=TRUE;
for(i=21;i>0;i--)//i等于0说明方块落到最下
{
for(j=1,yes=TRUE;j<16;j++)//j等于16说明方块到了最右
if(all_xy[i][j*2]!
=1)
{
yes=FALSE;break;
}
if(yes)
{
how++;fenshu++;
for(k=i;k>1;k--)
{
for(j=1,end=TRUE;j<16;j++)
{
all_xy[k][j*2]=all_xy[k-1][j*2];
if(all_xy[k-1][j*2]==1)end=FALSE;
}
if(end)break;//如果一行中一个方块都没有停止赋值
}
i=22;
}
}
if(how!
=0)
{
for(k=21;k>1;k--)
for(j=1;j<16;j++)
if(all_xy[k][j*2]==1)
{
gotoxy(j*2,k+1);printf("■");
}
else
{
gotoxy(j*2,k+1);printf("");
}
if(how>1)
fenshu+=how;
gotoxy(41,15);
printf("%d分",fenshu);
}
}
voidset_data(POINTbegin_xy,int(*now)[4])
{
inti,j;
POINTprint_xy=begin_xy;
for(i=0;i<4;i++,print_xy.x++)
for(j=0,print_xy.y=begin_xy.y;j<4;j++,print_xy.y++)
if(now[i][j]==1)
all_xy[print_xy.y][print_xy.x*2]=1;
}
BOOLfound_error(POINTbegin_xy,int(*now)[4])
{
inti,j;
POINTprint_xy=begin_xy;
for(i=0;i<4;i++,print_xy.x++)
for(j=0,print_xy.y=begin_xy.y;j<4;j++,print_xy.y++)
if(now[i][j]==1)
if(all_xy[print_xy.y][print_xy.x*2]==1)
returnFALSE;
returnTRUE;
}
#include"stdafx.h"
#include"all_include.h"
voidcolorful()//选择界面颜色
{
chara[10],color[]="color";
printf("*********************************************************\n");
printf("****数字代表背景,字母代表字体****\n");
printf("****您可以从以下选择一种您喜欢的颜色,颜色如下:
****\n");
printf("****0=黑色8=灰色****\n");
printf("****1=蓝色9=淡蓝色****\n");
printf("****2=绿色A=淡绿色****\n");
printf("****3=湖蓝色B=淡浅绿色****\n");
printf("****4=红色C=淡红色****\n");
printf("****5=紫色D=淡紫色****\n");
printf("****6=黄色E=淡黄色****\n");
printf("****7=白色F=亮白色****\n");
printf("***********************************************
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 俄罗斯方块 语言 版本