char tet[16][25];
int ox, oy, r, n;
long level, lines, score;
int next_n, next_r, next_ox, next_oy;
char* version = "1.6c";
char best10title[10][10];
long best10score[10];
//------------------------------------
void draw(void);
int check_gameover();
void add_or_delete(int flag, int Next = NOT_NEXT);
void best_score(int flag);
//------------------------------------
void check_best_score(){
for(int i=0; i<10; i++){
if(score > best10score){
for(int j=9; j>i; j--){
best10score[j] = best10score[j-1];
strcpy(best10title[j], best10title[j-1]);
}
gotoxy(32, 10);
cprintf(" ");
gotoxy(32, 11);
textcolor(5);
cprintf(" Congratulations!!! ");
gotoxy(32, 12);
cprintf(" Write your name ");
textcolor(2);
gotoxy(32, 13);
cprintf(" ");
gotoxy(32, 14);
cprintf(" ");
gotoxy(33, 13);
scanf("%s", &best10title);
best10score = score;
best_score(WRITE);
break;
}
}
}
void best_score(int flag){
FILE* best_score_file=NULL;
switch(flag){
case READ:
best_score_file = fopen("best.txt", "rt");
if(best_score_file==NULL){
for(int i=0; i<10; i++){
strcpy(best10title, "NONE");
best10score = 0;
}
break;
}
else{
for(int i=0; i<10; i++){
fscanf(best_score_file, "%s%ld", &best10title, &best10score);
}
fclose(best_score_file);
break;
}
case WRITE:
best_score_file = fopen("best.txt", "wt");
for(int i=0; i<10; i++){
fprintf(best_score_file, "%s\t%ld\n", best10title, best10score);
}
fclose(best_score_file);
break;
}
}
int sx(int x){
return(2*x+32);
}
int sy(int y){
return(25-y);
}
int born(){
static int firsttime = 1;
ox = 4;
oy = 23;
next_ox = 4;
if(firsttime){
firsttime = 0;
next_r = 1+random(4);
next_n = 1+random(7);
if(next_n==4) next_oy = 22;
else next_oy = 23;
add_or_delete(ADD, NEXT);
}
add_or_delete(DELETE, NEXT);
n = next_n;
r = next_r;
next_r = 1+random(4);
next_n = 1+random(7);
if(n==4) oy = 22;
if(next_n==4) next_oy = 22;
else next_oy = 23;
if(check_gameover()==1) return 0;
add_or_delete(ADD, NEXT);
add_or_delete(ADD);
draw();
return 1;
}
int check_gameover(){
switch(n){
case 1:
switch(r){
case 1:
if(tet[ox-1][oy+1]+tet[ox-1][oy]+tet[ox][oy]+tet[ox+1][oy]!=0) return 1;
break;
case 2:
if(tet[ox][oy+1]+tet[ox][oy]+tet[ox][oy-1]+tet[ox-1][oy-1]!=0) return 1;
break;
case 3:
if(tet[ox-1][oy]+tet[ox][oy]+tet[ox+1][oy]+tet[ox+1][oy-1]!=0) return 1;
break;
case 4:
if(tet[ox][oy+1]+tet[ox][oy]+tet[ox][oy-1]+tet[ox+1][oy+1]!=0) return 1;
break;
}
break;
case 2:
switch(r){
case 1:
if(tet[ox][oy]+tet[ox-1][oy]+tet[ox+1][oy]+tet[ox][oy+1]!=0) return 1;
break;
case 2:
if(tet[ox][oy]+tet[ox-1][oy]+tet[ox][oy-1]+tet[ox][oy+1]!=0) return 1;
break;
case 3:
if(tet[ox][oy]+tet[ox-1][oy]+tet[ox+1][oy]+tet[ox][oy-1]!=0) return 1;
break;
case 4:
if(tet[ox][oy]+tet[ox][oy-1]+tet[ox][oy+1]+tet[ox+1][oy]!=0) return 1;
break;
}
break;
case 3:
if(tet[ox][oy]+tet[ox-1][oy]+tet[ox-1][oy+1]+tet[ox][oy+1]!=0) return 1;
break;
case 4:
switch(r){
case 1:
case 3:
if(tet[ox][oy+2]+tet[ox][oy+1]+tet[ox][oy]+tet[ox][oy-1]!=0) return 1;
break;
case 2:
case 4:
if(tet[ox-2][oy]+tet[ox-1][oy]+tet[ox][oy]+tet[ox+1][oy]!=0) return 1;
break;
}
break;
case 5:
switch(r){
case 1:
if(tet[ox][oy]+tet[ox-1][oy]+tet[ox+1][oy]+tet[ox+1][oy+1]!=0) return 1;
break;
case 2:
if(tet[ox][oy-1]+tet[ox][oy]+tet[ox][oy+1]+tet[ox-1][oy+1]!=0) return 1;
break;
case 3:
if(tet[ox][oy]+tet[ox-1][oy]+tet[ox+1][oy]+tet[ox-1][oy-1]!=0) return 1;
break;
case 4:
if(tet[ox][oy-1]+tet[ox][oy]+tet[ox][oy+1]+tet[ox+1][oy-1]!=0) return 1;
break;
}
break;
case 6:
switch(r){
case 1:
if(tet[ox][oy]+tet[ox-1][oy]+tet[ox][oy+1]+tet[ox+1][oy+1]!=0) return 1;
break;
case 2:
if(tet[ox][oy]+tet[ox-1][oy]+tet[ox-1][oy+1]+tet[ox][oy-1]!=0) return 1;
break;
case 3:
if(tet[ox][oy]+tet[ox+1][oy]+tet[ox][oy-1]+tet[ox-1][oy-1]!=0) return 1;
break;
case 4:
if(tet[ox][oy]+tet[ox][oy+1]+tet[ox+1][oy]+tet[ox+1][oy-1]!=0) return 1;
break;
}
break;
case 7:
switch(r){
case 1:
if(tet[ox][oy]+tet[ox-1][oy+1]+tet[ox][oy+1]+tet[ox+1][oy]!=0) return 1;
break;
case 2:
if(tet[ox][oy]+tet[ox][oy+1]+tet[ox-1][oy]+tet[ox-1][oy-1]!=0) return 1;
break;
case 3:
if(tet[ox][oy]+tet[ox-1][oy]+tet[ox][oy-1]+tet[ox+1][oy-1]!=0) return 1;
break;
case 4:
if(tet[ox][oy]+tet[ox+1][oy+1]+tet[ox+1][oy]+tet[ox][oy-1]!=0) return 1;
break;
}
break;
}
return 0;
}
void add_or_delete(int flag, int Next){
int col, tmp_n, tmp_x, tmp_y, tmp_r;
if(Next==NEXT){
/* ўаҐ¬Ґ® Ї®¤¬ҐпҐ¬ ⥪гйго дЁЈгаг б«Ґ¤гойго */
tmp_x = ox;
tmp_y = oy;
tmp_n = n;
tmp_r = r;
n = next_n;
ox = next_ox + 8;
oy = next_oy;
r = next_r;
}
col = n;
if(flag==DELETE) col=0;
switch(n){
case 1:
switch(r){
case 1:
tet[ox-1][oy+1]=col;
tet[ox-1][oy]=col;
tet[ox][oy]=col;
tet[ox+1][oy]=col;
break;
case 2:
tet[ox][oy+1]=col;
tet[ox][oy]=col;
tet[ox][oy-1]=col;
tet[ox-1][oy-1]=col;
break;
case 3:
tet[ox-1][oy]=col;
tet[ox][oy]=col;
tet[ox+1][oy]=col;
tet[ox+1][oy-1]=col;
break;
case 4:
tet[ox][oy+1]=col;
tet[ox][oy]=col;
tet[ox][oy-1]=col;
tet[ox+1][oy+1]=col;
break;
}
break;
case 2:
switch(r){
case 1:
tet[ox][oy]=col;
tet[ox-1][oy]=col;
tet[ox+1][oy]=col;
tet[ox][oy+1]=col;
break;
case 2:
tet[ox][oy]=col;
tet[ox-1][oy]=col;
tet[ox][oy-1]=col;
tet[ox][oy+1]=col;
break;
case 3:
tet[ox][oy]=col;
tet[ox-1][oy]=col;
tet[ox+1][oy]=col;
tet[ox][oy-1]=col;
break;
case 4:
tet[ox][oy]=col;
tet[ox][oy-1]=col;
tet[ox][oy+1]=col;
tet[ox+1][oy]=col;
break;
}
break;
case 3:
tet[ox][oy]=col;
tet[ox-1][oy]=col;
tet[ox-1][oy+1]=col;
tet[ox][oy+1]=col;
break;
case 4:
switch(r){
case 1:
case 3:
tet[ox][oy+2]=col;
tet[ox][oy+1]=col;
tet[ox][oy]=col;
tet[ox][oy-1]=col;
break;
case 2:
case 4:
tet[ox-2][oy]=col;
tet[ox-1][oy]=col;
tet[ox][oy]=col;
tet[ox+1][oy]=col;
break;
}
break;
case 5:
switch(r){
case 1:
tet[ox][oy]=col;
tet[ox-1][oy]=col;
tet[ox+1][oy]=col;
tet[ox+1][oy+1]=col;
break;
case 2:
tet[ox][oy-1]=col;
tet[ox][oy]=col;
tet[ox][oy+1]=col;
tet[ox-1][oy+1]=col;
break;
case 3:
tet[ox][oy]=col;
tet[ox-1][oy]=col;
tet[ox+1][oy]=col;
tet[ox-1][oy-1]=col;
break;
case 4:
tet[ox][oy-1]=col;
tet[ox][oy]=col;
tet[ox][oy+1]=col;
tet[ox+1][oy-1]=col;
break;
}
break;
case 6:
switch(r){
case 1:
tet[ox][oy]=col;
tet[ox-1][oy]=col;
tet[ox][oy+1]=col;
tet[ox+1][oy+1]=col;
break;
case 2:
tet[ox][oy]=col;
tet[ox-1][oy]=col;
tet[ox-1][oy+1]=col;
tet[ox][oy-1]=col;
break;
case 3:
tet[ox][oy]=col;
tet[ox+1][oy]=col;
tet[ox][oy-1]=col;
tet[ox-1][oy-1]=col;
break;
case 4:
tet[ox][oy]=col;
tet[ox][oy+1]=col;
tet[ox+1][oy]=col;
tet[ox+1][oy-1]=col;
break;
}
break;
case 7:
switch(r){
case 1:
tet[ox][oy]=col;
tet[ox-1][oy+1]=col;
tet[ox][oy+1]=col;
tet[ox+1][oy]=col;
break;
case 2:
tet[ox][oy]=col;
tet[ox][oy+1]=col;
tet[ox-1][oy]=col;
tet[ox-1][oy-1]=col;
break;
case 3:
tet[ox][oy]=col;
tet[ox-1][oy]=col;
tet[ox][oy-1]=col;
tet[ox+1][oy-1]=col;
break;
case 4:
tet[ox][oy]=col;
tet[ox+1][oy+1]=col;
tet[ox+1][oy]=col;
tet[ox][oy-1]=col;
break;
}
break;
}
if(Next==NEXT){
/* ўҐагвм ўбҐ § ¤ */
ox = tmp_x;
oy = tmp_y;
n = tmp_n;
r = tmp_r;
}
}
int down(){
switch(n){
case 1:
switch(r){
case 1:
if(tet[ox-1][oy-1]+tet[ox][oy-1]+tet[ox+1][oy-1]!=0) return 1;
if(oy==0) return 1;
break;
case 2:
if(tet[ox-1][oy-2]+tet[ox][oy-2]+tet[ox-1][oy-2]!=0) return 1;
if(oy==1) return 1;
break;
case 3:
if(tet[ox-1][oy-1]+tet[ox][oy-1]+tet[ox+1][oy-2]!=0) return 1;
if(oy==1) return 1;
break;
case 4:
if(tet[ox][oy-2]+tet[ox+1][oy]!=0) return 1;
if(oy==1) return 1;
break;
}
break;
case 2:
switch(r){
case 1:
if(tet[ox-1][oy-1]+tet[ox][oy-1]+tet[ox+1][oy-1]!=0) return 1;
if(oy==0) return 1;
break;
case 2:
if(tet[ox-1][oy-1]+tet[ox][oy-2]!=0) return 1;
if(oy==1) return 1;
break;
case 3:
if(tet[ox-1][oy-1]+tet[ox][oy-2]+tet[ox+1][oy-1]!=0) return 1;
if(oy==1) return 1;
break;
case 4:
if(tet[ox+1][oy-1]+tet[ox][oy-2]!=0) return 1;
if(oy==1) return 1;
break;
}
break;
case 3:
if(tet[ox][oy-1]+tet[ox-1][oy-1]!=0) return 1;
if(oy==0) return 1;
break;
case 4:
switch(r){
case 1:
case 3:
if(tet[ox][oy-2]!=0) return 1;
if(oy==1) return 1;
break;
case 2:
case 4:
if(tet[ox-2][oy-1]+tet[ox-1][oy-1]+tet[ox][oy-1]+tet[ox+1][oy-1]!=0) return 1;
if(oy==0) return 1;
break;
}
break;
case 5:
switch(r){
case 1:
if(tet[ox-1][oy-1]+tet[ox][oy-1]+tet[ox+1][oy-1]!=0) return 1;
if(oy==0) return 1;
break;
case 2:
if(tet[ox-1][oy]+tet[ox][oy-2]!=0) return 1;
if(oy==1) return 1;
break;
case 3:
if(tet[ox][oy-1]+tet[ox-1][oy-2]+tet[ox+1][oy-1]!=0) return 1;
if(oy==1) return 1;
break;
case 4:
if(tet[ox][oy-2]+tet[ox+1][oy-2]!=0) return 1;
if(oy==1) return 1;
break;
}
break;
case 6:
switch(r){
case 1:
if(tet[ox-1][oy-1]+tet[ox][oy-1]+tet[ox+1][oy]!=0) return 1;
if(oy==0) return 1;
break;
case 2:
if(tet[ox-1][oy-1]+tet[ox][oy-2]!=0) return 1;
if(oy==1) return 1;
break;
case 3:
if(tet[ox-1][oy-2]+tet[ox][oy-2]+tet[ox+1][oy-1]!=0) return 1;
if(oy==1) return 1;
break;
case 4:
if(tet[ox][oy-1]+tet[ox+1][oy-2]!=0) return 1;
if(oy==1) return 1;
break;
}
break;
case 7:
switch(r){
case 1:
if(tet[ox-1][oy]+tet[ox][oy-1]+tet[ox+1][oy-1]!=0) return 1;
if(oy==0) return 1;
break;
case 2:
if(tet[ox-1][oy-2]+tet[ox][oy-1]!=0) return 1;
if(oy==1) return 1;
break;
case 3:
if(tet[ox-1][oy-1]+tet[ox][oy-2]+tet[ox+1][oy-2]!=0) return 1;
if(oy==1) return 1;
break;
case 4:
if(tet[ox][oy-2]+tet[ox+1][oy-1]!=0) return 1;
if(oy==1) return 1;
break;
}
break;
}
add_or_delete(DELETE);
oy-=1;
add_or_delete(ADD);
draw();
return 0;
}
void left(){
switch(n){
case 1:
switch(r){
case 1:
if(tet[ox-2][oy]+tet[ox-2][oy+1]!=0) return;
if(ox==1) return;
break;
case 2:
if(tet[ox-2][oy-1]+tet[ox-1][oy]+tet[ox-1][oy+1]!=0) return;
if(ox==1) return;
break;
case 3:
if(tet[ox-2][oy]+tet[ox][oy-1]!=0) return;
if(ox==1) return;
break;
case 4:
if(tet[ox-1][oy-1]+tet[ox-1][oy]+tet[ox-1][oy+1]!=0) return;
if(ox==0) return;
break;
}
break;
case 2:
switch(r){
case 1:
if(tet[ox-2][oy]+tet[ox-1][oy+1]!=0) return;
if(ox==1) return;
break;
case 2:
if(tet[ox-2][oy]+tet[ox-1][oy+1]+tet[ox-1][oy-1]!=0) return;
if(ox==1) return;
break;
case 3:
if(tet[ox-2][oy]+tet[ox-1][oy-1]!=0) return;
if(ox==1) return;
break;
case 4:
if(tet[ox-1][oy]+tet[ox-1][oy+1]+tet[ox-1][oy-1]!=0) return;
if(ox==0) return;
break;
}
break;
case 3:
if(tet[ox-2][oy]+tet[ox-2][oy+1]!=0) return;
if(ox==1) return;
break;
case 4:
switch(r){
case 1:
case 3:
if(tet[ox-1][oy-1]+tet[ox-1][oy]+tet[ox-1][oy+1]+tet[ox-1][oy+2]!=0) return;
if(ox==0) return;
break;
case 2:
case 4:
if(tet[ox-3][oy]!=0) return;
if(ox==2) return;
break;
}
break;
case 5:
switch(r){
case 1:
if(tet[ox-2][oy]+tet[ox][oy+1]!=0) return;
if(ox==1) return;
break;
case 2:
if(tet[ox-2][oy+1]+tet[ox-1][oy-1]+tet[ox-1][oy]!=0) return;
if(ox==1) return;
break;
case 3:
if(tet[ox-2][oy]+tet[ox-2][oy-1]!=0) return;
if(ox==1) return;
break;
case 4:
if(tet[ox-1][oy+1]+tet[ox-1][oy-1]+tet[ox-1][oy]!=0) return;
if(ox==0) return;
break;
}
break;
case 6:
switch(r){
case 1:
if(tet[ox-2][oy]+tet[ox-1][oy+1]!=0) return;
if(ox==1) return;
break;
case 2:
if(tet[ox-2][oy]+tet[ox-2][oy+1]+tet[ox-1][oy-1]!=0) return;
if(ox==1) return;
break;
case 3:
if(tet[ox-1][oy]+tet[ox-2][oy-1]!=0) return;
if(ox==1) return;
break;
case 4:
if(tet[ox-1][oy]+tet[ox-1][oy+1]+tet[ox][oy-1]!=0) return;
if(ox==0) return;
break;
}
break;
}