/* Turbo C */
#include <stdio.h>
#include <stdlib.h>
#include <dos.h>
#include <conio.h>
#include <time.h>
#include <graphics.h>
#define L 1
#define LX 15
#define LY 4
static struct BLOCK{
int x0;
int y0;
int x1;
int y1;
int x2;
int y2;
int x3;
int y3;
int color;
int next;
}b[23] = {{0, 1, 1, 1, 2, 1, 3, 1, 4, 1},
{1, 0, 1, 3, 1, 2, 1, 1, 4, 0 },
{1, 1, 2, 2, 1, 2, 2, 1, 1, 2 },
{0, 1, 1, 1, 1, 0, 2, 0, 2, 4 },
{1, 0, 1, 1, 2, 2, 2, 1, 2, 5 },
{0, 2, 1, 2, 1, 1, 2, 1, 2, 6 },
{0, 0, 0, 1, 1, 2, 1, 1, 2, 3 },
{0, 0, 1, 0, 1, 1, 2, 1, 3, 8 },
{0, 1, 0, 2, 1, 1, 1, 0, 3, 9 },
{0, 1, 1, 1, 1, 2, 2, 2, 3, 10 },
{1, 1, 1, 2, 2, 1, 2, 0, 3, 7 },
{1, 0, 1, 1, 1, 2, 2, 2, 7, 12 },
{0, 1, 1, 1, 2, 1, 2, 0, 7, 13 },
{0, 0, 1, 2, 1, 1, 1, 0, 7, 14 },
{0, 1, 0, 2, 1, 1, 2, 1, 7, 11 },
{0, 2, 1, 2, 1, 1, 1, 0, 5, 16 },
{0, 1, 1, 1, 2, 2, 2, 1, 5, 17 },
{1, 0, 1, 1, 1, 2, 2, 0, 5, 18 },
{0, 0, 0, 1, 1, 1, 2, 1, 5, 15 },
{0, 1, 1, 1, 1, 0, 2, 1, 6, 20 },
{0, 1, 1, 2, 1, 1, 1, 0, 6, 21 },
{0, 1, 1, 2, 1, 1, 2, 1, 6, 22 },
{1, 0, 1, 1, 1, 2, 2, 1, 6, 19 }};
static int d[10]={ 33000,3000,1600,1200,900,800,600,400,300,200 };
int Llevel, Lcurrent, Lnext, Lable, lx, ly, Lsum;
unsigned Lpoint;
int La[19][10], FLAG, sum;
unsigned ldelay;
void scrinit( ),datainit( ),dispb( ), eraseb( );
void throw( ), judge( ), delayp( ), move( ), note( ), show( );
int Ldrop( ), Ljudge( ), nextb( ), routejudge( );
main( )
{
char c;
do{
scrinit( );
datainit( );
Lable=nextb();
Lable = Ldrop( );
while( 1 ){
delayp( );
if( Lable != 0 ){
Ljudge( );
Lable = nextb( );
}
ldelay–;
if( ldelay == 0 ){
Lable = Ldrop( );
ldelay = d[0];
}
if( FLAG != 0 )
break;
}
while( getch( )!=’\r’ );
gotoxy( 38, 16 );
cputs( “again?” );
c = getch( );
}while( c!=’n’ && c!=’N’ );
clrscr( );
}
int nextb( )
{
if( La[(b[Lnext].y0)][(3+b[Lnext].x0)] != 0 ||
La[(b[Lnext].y1)][(3+b[Lnext].x1)] != 0 ||
La[(b[Lnext].y2)][(3+b[Lnext].x2)] != 0 ||
La[(b[Lnext].y3)][(3+b[Lnext].x3)] != 0 ){
FLAG = L;
return( -1 );
}
eraseb( 0, 3, 5, Lnext );
Lcurrent = Lnext;
lx = 3;
ly = 0;
Lable = 0;
ldelay = d[0];
Lsum ++;
Lpoint += 1;
Lnext = random( 23 );
dispb( 0, 3, 5, Lnext );
textcolor( 7 );
gotoxy( 3, 14 ); cprintf( “%#5d”, Lsum );
gotoxy( 3, 17 ); cprintf( “%#5d”, Lpoint );
return( 0 );
}
void delayp( )
{
char key;
if( kbhit( ) != 0 ){
key = getch( );
move( key );
if( key== ‘\\’ )
getch( );
}
}
void move( funckey )
char funckey;
{
int tempcode;
switch( funckey ){
case ‘K’: if( lx+b[Lcurrent].x0 > 0 )
if( La[ly+(b[Lcurrent].y0)][lx-1+(b[Lcurrent].x0)]==0 &&
La[ly+(b[Lcurrent].y1)][lx-1+(b[Lcurrent].x1)]==0 &&
La[ly+(b[Lcurrent].y2)][lx-1+(b[Lcurrent].x2)]==0 &&
La[ly+(b[Lcurrent].y3)][lx-1+(b[Lcurrent].x3)]==0 ){
eraseb( L, lx, ly, Lcurrent );
lx –;
dispb( L, lx, ly, Lcurrent );
}
break;
case 0×20: tempcode = b[Lcurrent].next;
if( lx+b[tempcode].x0 >= 0 && lx+b[tempcode].x3 <= 9 &&
ly+b[tempcode].y1 <=19 && ly+b[tempcode].y2 <= 19 )
if( routejudge( ) != -1 )
if( La[ly+(b[tempcode].y0)][lx+(b[tempcode].x0)]==0 &&
La[ly+(b[tempcode].y1)][lx+(b[tempcode].x1)]==0 &&
La[ly+(b[tempcode].y2)][lx+(b[tempcode].x2)]==0 &&
La[ly+(b[tempcode].y3)][lx+(b[tempcode].x3)]==0 ){
eraseb( L, lx, ly, Lcurrent );
Lcurrent = tempcode;
dispb( L, lx, ly, Lcurrent );
}
break;
case ‘M’: if( lx+b[Lcurrent].x3 < 9 )
if( La[ly+(b[Lcurrent].y0)][lx+1+(b[Lcurrent].x0)]==0 &&
La[ly+(b[Lcurrent].y1)][lx+1+(b[Lcurrent].x1)]==0 &&
La[ly+(b[Lcurrent].y2)][lx+1+(b[Lcurrent].x2)]==0 &&
La[ly+(b[Lcurrent].y3)][lx+1+(b[Lcurrent].x3)]==0 ){
eraseb( L, lx, ly, Lcurrent );
lx ++;
dispb( L, lx, ly, Lcurrent );
}
break;
case ‘P’: throw( );
break;
case 0x1b: clrscr( );
exit(0);
break;
default: break;
}
}
void throw( )
{int tempy;
tempy = ly;
while( ly+b[Lcurrent].y1 < 19 && ly+b[Lcurrent].y2 < 19 &&
La[ly+(b[Lcurrent].y0)][lx+(b[Lcurrent].x0)]==0 &&
La[ly+(b[Lcurrent].y1)][lx+(b[Lcurrent].x1)]==0 &&
La[ly+(b[Lcurrent].y2)][lx+(b[Lcurrent].x2)]==0 &&
La[ly+(b[Lcurrent].y3)][lx+(b[Lcurrent].x3)]==0 )
ly++;
ly–;
eraseb( L, lx, tempy, Lcurrent );
dispb( L, lx, ly, Lcurrent );
La[ly+(b[Lcurrent].y0)][lx+(b[Lcurrent].x0)] =
La[ly+(b[Lcurrent].y1)][lx+(b[Lcurrent].x1)] =
La[ly+(b[Lcurrent].y2)][lx+(b[Lcurrent].x2)] =
La[ly+(b[Lcurrent].y3)][lx+(b[Lcurrent].x3)] = b[Lcurrent].color;
Lable = -1;
}
int routejudge( )
{
int i, j;
for( i=0;i<3;i++ )
for( j=0;j<3;j++ )
if( La[ly+i][lx+j] != 0 )
return( -1 );
return( 1 );
}
int Ldrop( )
{
if( ly+b[Lcurrent].y1 >= 18 || ly+b[Lcurrent].y2 >= 18 ){
La[ly+(b[Lcurrent].y0)][lx+(b[Lcurrent].x0)] =
La[ly+(b[Lcurrent].y1)][lx+(b[Lcurrent].x1)] =
La[ly+(b[Lcurrent].y2)][lx+(b[Lcurrent].x2)] =
La[ly+(b[Lcurrent].y3)][lx+(b[Lcurrent].x3)] = b[Lcurrent].color;
return( -1 );
}
if( La[ly+1+(b[Lcurrent].y0)][lx+(b[Lcurrent].x0)]!=0 ||
La[ly+1+(b[Lcurrent].y1)][lx+(b[Lcurrent].x1)]!=0 ||
La[ly+1+(b[Lcurrent].y2)][lx+(b[Lcurrent].x2)]!=0 ||
La[ly+1+(b[Lcurrent].y3)][lx+(b[Lcurrent].x3)]!=0 ){
La[ly+(b[Lcurrent].y0)][lx+(b[Lcurrent].x0)]=
La[ly+(b[Lcurrent].y1)][lx+(b[Lcurrent].x1)]=
La[ly+(b[Lcurrent].y2)][lx+(b[Lcurrent].x2)]=
La[ly+(b[Lcurrent].y3)][lx+(b[Lcurrent].x3)]=b[Lcurrent].color;
return( -1 );
}
eraseb( L, lx, ly, Lcurrent );
dispb( L, lx, ++ly, Lcurrent );
return( 0 );
}
int Ljudge( )
{
int i, j, k,lines, f;
static int p[5]={ 0,1,3,6,10 };
lines = 0;
for( k=0; k<=3; k++ ){
f = 0;
if( (ly+k)>18 )
continue;
for( i=0; i<10; i++ )
if( La[ly+k][i]==0 ){
f++;
break;
}
if( f == 0 ){
movetext( LX, LY, LX+19, LY+ly+k-1, LX, LY+1 );
for( i=(ly+k); i>0; i– )
for( j=0; j<10; j++ )
La[i][j] = La[i-1][j];
for( j=0; j<10; j++ )
La[0][j] = 0;
lines ++;
}
}
Lpoint += p[lines]*10;
return( 0 );
}
void scrinit( )
{
int i;
char lft[20];
textbackground(1);
clrscr( );
gotoxy( 30,9 );
cputs( “ENTER YOUR NAMES:” );
gotoxy( 25,14 );
scanf( “%s”,lft );
textbackground(0);
clrscr( );
textcolor( 15 );
gotoxy( 17, 1 );
cprintf( “%s”,lft );
gotoxy( 5, 3 );
cputs( “NEXT” );
gotoxy( 4, 13 );
cputs( “block” );
gotoxy( 4, 16 );
cputs( “point” );
for( i=0; i<19; i++ ){
gotoxy( LX-2, LY+i );
cputs( “圹 圹” );
}
gotoxy( LX-2, LY+19 );
cputs( “圹圹圹圹圹圹圹圹圹圹圹圹” );
}
void datainit( )
{
int i,j;
for( i=0; i<19; i++ )
for( j=0; j<10; j++ ){
La[i][j]=0;
}
Lable = 0;
FLAG = 0;
ldelay = d[0];
Lsum = 0;
Lpoint=0;
randomize( );
Lnext = random( 23);
}
void dispb( LRflag, x, y, blockcode ) /* display blocks */
int LRflag, x, y, blockcode;
{
int realx, realy;
if( LRflag == L ){
realx = LX+x*2;
realy = LY+y;
}else{
realx = x;
realy = y;
}
textcolor( b[blockcode].color );
gotoxy( realx+2*b[blockcode].x0, realy+b[blockcode].y0 ); cputs(“圹”);
gotoxy( realx+2*b[blockcode].x1, realy+b[blockcode].y1 ); cputs(“圹”);
gotoxy( realx+2*b[blockcode].x2, realy+b[blockcode].y2 ); cputs(“圹”);
gotoxy( realx+2*b[blockcode].x3, realy+b[blockcode].y3 ); cputs(“圹”);
}
void eraseb( LRflag, x, y, blockcode ) /* erase blocks */
int LRflag, x, y, blockcode;
{
int realx, realy;
if( LRflag == L ){
realx = LX+x*2;
realy = LY+y;
}else{
realx = x;
realy = y;
}
textcolor( 0 );
gotoxy( realx+2*b[blockcode].x0, realy+b[blockcode].y0 ); cputs(“圹”);
gotoxy( realx+2*b[blockcode].x1, realy+b[blockcode].y1 ); cputs(“圹”);
gotoxy( realx+2*b[blockcode].x2, realy+b[blockcode].y2 ); cputs(“圹”);
gotoxy( realx+2*b[blockcode].x3, realy+b[blockcode].y3 ); cputs(“圹”);
}
/*总是索取不做点贡献不大好,所以就找来了这个代码,是俄罗斯方块的.希望有用的到的朋友*/
>> 本文固定链接: http://www.vcgood.com/archives/2042