俄罗斯方块C语言版本.docx

上传人:b****2 文档编号:18196455 上传时间:2023-04-24 格式:DOCX 页数:25 大小:21.15KB
下载 相关 举报
俄罗斯方块C语言版本.docx_第1页
第1页 / 共25页
俄罗斯方块C语言版本.docx_第2页
第2页 / 共25页
俄罗斯方块C语言版本.docx_第3页
第3页 / 共25页
俄罗斯方块C语言版本.docx_第4页
第4页 / 共25页
俄罗斯方块C语言版本.docx_第5页
第5页 / 共25页
点击查看更多>>
下载资源
资源描述

俄罗斯方块C语言版本.docx

《俄罗斯方块C语言版本.docx》由会员分享,可在线阅读,更多相关《俄罗斯方块C语言版本.docx(25页珍藏版)》请在冰豆网上搜索。

俄罗斯方块C语言版本.docx

俄罗斯方块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("***********************************************

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

当前位置:首页 > 人文社科 > 哲学历史

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

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