📄 youxi.txt
字号:
/**************************************************/
/* */
/* 俄罗斯方块游戏 程序设计:刘红石 */
/* */
/* http://www.liuhs.com */
/* 为便有理解程序,此程序尽量简化,并使用文本方式 */
/* */
/**************************************************/
# include <stdio.h>
# include <conio.h>
# include <string.h>
# include <time.h>
# include <dos.h>
# include <stdlib.h>
/* 七种拼块的形状数据 */
char fk[7][4][2]={
1,1,1,2,1,3,1,4,
1,1,1,2,1,3,2,3,
2,1,2,2,1,3,2,3,
1,1,1,2,2,2,2,3,
2,1,2,2,1,3,2,3,
1,1,2,1,1,2,2,2,
1,1,1,2,1,3,2,2};
/* 存放组成拼块的四个小方块X和Y坐标 */
int kx[4],ky[4];
/* 桶 */
int tong[13][25];
/* 等待按键并延时的函数 */
char key(int s)
{
clock_t t1,t2;
char c;
t1=clock();
do
t2=clock();
while (((t2-t1)<s) && !kbhit());
if (kbhit())
c=getch();
else
c=0;
return c;
}
/* 显示或清除方块的函数 */
void kuai(int x,int y,int c)
{
char cc[3];
if(c==1)
strcpy(cc,"[]");
else
strcpy(cc," ");
gotoxy(x*2,y);
puts(cc);
gotoxy(79,24);
}
/* 画出拼块 */
void hua()
{
int i;
for(i=0;i<4;i++)
kuai(kx[i],ky[i],1);
}
/* 清除拼块的函数 */
void ca()
{
int i;
for(i=0;i<4;i++)
kuai(kx[i],ky[i],0);
}
/* 拼块下落一行 */
int xialuo()
{
int t,i;
ca();
t=1;
for(i=0;i<4;i++){
if(ky[i]==24) {t=0; break;};
if(tong[kx[i]][ky[i]+1]==1) {t=0; break;};
}
if(t==1)
for(i=0;i<4;i++)
ky[i]=ky[i]+1;
else
for(i=0;i<4;i++)
tong[kx[i]][ky[i]]=1;
hua();
return t;
}
/* 拼块左右移动函数 */
void yidong(int p)
{
int t,i;
ca();
t=1;
i=0;
do{
if((kx[i]==1)&&(p==-1)) {t=0; break;};
if((kx[i]==12)&&(p==1)) {t=0; break;};
if (tong[kx[i]+p][ky[i]]==1) {t=0; break;};
i++;
} while (i<4);
if(t==1)
for(i=0;i<4;i++)
kx[i]=kx[i]+p;
hua();
}
/* 旋转拼块的函数 */
void zhuan()
{
int i,t,x,y;
int kx1[4],ky1[4];
ca();
x=kx[1]; y=ky[1];
for(i=0;i<4;i++) {
kx1[i]=x+y-ky[i]; ky1[i]=y-x+kx[i];
}
t=1;
for(i=0;i<4;i++){
if((kx1[i]<1)||(kx1[i]>12)||(ky1[i]<1)||(ky1[i]>24)) {t=0; break;};
if (tong[kx1[i]][ky1[i]]==1) {t=0; break;};
}
if(t==1)
for(i=0;i<4;i++){
kx[i]=kx1[i]; ky[i]=ky1[i];
};
hua();
}
/* 计算一行中的方块数 */
int fangkuaishu(int h)
{
int i,p=0;
for(i=1;i<=12;i++)
p=p+tong[i][h];
if(p==12)
for(i=1000;i<=4000;i+=80){
sound(i);
delay(10);
}
nosound();
return p;
}
/* 桶中方块除去一行,在此行上面的方块下移一行 */
void yihang(int h)
{
int k,j,q;
for(k=h;k>0;k--){
q=0;
for(j=1;j<=12;j++){
if(tong[j][k]!=tong[j][k-1]){
kuai(j,k,tong[j][k-1]);
tong[j][k]=tong[j][k-1];
}
q=q+tong[j][k];
}
if(q==0) break;
}
}
/* 检查有无完成的行,并处理之 */
void jiancha()
{
int i,n;
i=24;
do{
n=fangkuaishu(i);
if(n==12) yihang(i); else i--;
} while((i>0)&&(n>0));
}
/* 开始函数,初始化,画出空桶*/
void kaishi()
{
int i,j;
for(i=1;i<=24;i++)
for(j=1;j<=12;j++)
tong[j][i]=0;
clrscr();
for(i=0;i<24;i++)
puts("| |");
printf("`------------------------'");
randomize();
}
/**********************************************/
/* 主程序 */
main()
{
int i,j,k,s;
int m,t;
char kk;
kaishi(); /* 屏幕初始化,显示空桶 */
for(;;){ /* 开始一个循环,在此循环中不断检测按键并处理之 */
m=rand()%7; /* 随机产生一种拼块 */
for(i=0;i<4;i++){ /* 计算拼块在桶中的坐标 */
kx[i]=fk[m][i][0]+5;
ky[i]=fk[m][i][1];
}
t=1;
for(i=0;i<4;i++) /* 检查拼块是否能放入桶中,不能放则退出游戏 */
if (tong[kx[i]][ky[i]]==1)
exit(0);
hua(); /* 画出拼块 */
s=0; /* S是一个标志,指示是否按了空格键 */
for(;;){ /* 此循环中处理一个拼块的下落过程 */
if(s==0) kk=key(9); else kk=key(0); /* 按过了空格键则不延时 */
if((kk>='a')&&(kk<='z')) kk=kk-32; /* 将小写字母转换为大写 */
switch (kk){ /* 根据按键作相应处理 */
case ' ' : s=1; break; /* 按空格, 快速下落 */
case 'K': zhuan(); break; /* 按K,旋转拼块 */
case 'J': yidong(-1); break; /* 按J,左移拼块 */
case 'L': yidong(1); break; /* 按L,右移拼块 */
case 'S': while(kbhit()==0);break; /* 按S,暂停游戏 */
case 'E': exit(0); break; /* 按E,结束游戏 */
default : t=xialuo(); /* 没按上面的键,或未按任何键,拼块下落一格 */
}
if(t==0) break; /* 拼块落到桶底或不能再下落退出循环 */
}
jiancha(); /* 检查是否有完成的行,并处理之 */
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -