?? 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 + -