commit f64fe9f5606e0419fea5387c45b4945c2d948ffb Author: Your Name <1430817717@qq.com> Date: Mon Jan 7 14:23:49 2019 +0800 first commit diff --git a/俄罗斯方块.c b/俄罗斯方块.c new file mode 100644 index 0000000..44c64f6 --- /dev/null +++ b/俄罗斯方块.c @@ -0,0 +1,798 @@ +#include //׼ +#include //ƿ̨ +#include //ռź +#include // + +#define FrameX 13 // ϷϽX +#define FrameY 3 //ϷϽY +#define Frame_gao 20 //Ϸڸ߶ +#define Frame_kuan 18 //Ϸڿ + +int i, j, temp, temp1, temp2; //ȫֱ tempʾ洢ֵ +int a[80][80] = {0}; //0ʾ޷飬1ʾз飬 2Ϊ߽ +int b[4]; //ĸ飬ֵΪ01 +struct fangkuai +{ + int x, y; //ֵ + int flag; // + int next; //һ + int speed; // ٶ + int number; // + int score; // + int level; //Ϸȼ +}; + + +HANDLE hOut; //̨ + +/******************/ +void gotoxy(int x, int y); //ƶָλ +int color(int c); //̨ɫ +void DrawGameframe(); //Ϸ߽ +void Flag(struct fangkuai *); // +void Makefangkuai(struct fangkuai *); // +void printfangkuai(struct fangkuai *); //ӡ~ +void cleanfangkuai(struct fangkuai *); //~ +int ifMove(struct fangkuai *); //жǷƶ +void Del_fullline(struct fangkuai *); //жǷУɾз +void Gamebegin(); //Ϸʼ +void welcome(); //ӭ˵ +void explation(); //˵ +void Replay(struct fangkuai *); //Ϸ +void title(); //Ϸ +void close(); //رϷ + + + +/*****ɫ*******/ +int color(int c){ + SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),c); //ֻwindowsϸıɫ + return 0; +} //0~1516ɫ +/*÷ + coler֣ + printf +*/ + +/*******ʾλ********/ +void gotoxy(int x, int y) +{ + COORD pos; + pos.X = x; + pos.Y = y; + SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),pos); + } + /* + ÷ + gotoxy3010 30λ10λ + printf + */ + +/*****ÿʼ*****/ +void title() +{ + color(15); + gotoxy(30,3); + printf(" ˹ "); + color(11); + gotoxy(17,5); + printf(""); + gotoxy(17,6); + printf(""); + gotoxy(17,7); + printf(""); + + color(10); + gotoxy(25,5); + printf(""); + gotoxy(25,6); + printf(""); + + color(13); + gotoxy(33,6); + printf(""); + + color(4); + gotoxy(45,5); + printf(""); + gotoxy(45,6); + printf(" "); + gotoxy(45,7); + printf(" "); + + color(12); + gotoxy(53,5); + printf(""); + gotoxy(53,6); + printf(" "); + +} + + +/*****ò˵ѡ*****/ +void welcome(){ + int i = 1, j = 1; + int n; + color(14); + for(i = 9; i <= 20; i++){ + for(j = 15; j <= 60; j++){ + gotoxy(j, i); + if(i == 9 || i == 20){ + printf("="); + } + else if(j == 15 || j == 59){ + printf("||"); + } + } + } + + color(12); + gotoxy(25,12); + printf("1.ʼϷ"); + gotoxy(40,12); + printf("2.˵͹"); + gotoxy(33,17); + printf("3.˳Ϸ\n"); + gotoxy(31,19); + printf("Ϸڲ"); + gotoxy(28,22); + color(3); + printf("ѡ[1 2 3]:{ }\b\b"); + color(14); + scanf("%d", &n); + switch(n) + { + case 1: + { + system("cls"); // + DrawGameframe(); + Gamebegin(); + break; + } + case 2: + explation(); + break; + case 3: + close(); + break; + } +} + +/*****Ϸڽ*****/ +void DrawGameframe() +{ + gotoxy((FrameX+Frame_kuan-7), FrameY-2); + color(11); + printf("˹"); + + color(12); + gotoxy(FrameX,FrameY); + printf(""); + + gotoxy(FrameX + 2*Frame_kuan-2,FrameY); + printf(""); + + gotoxy(FrameX,FrameY + Frame_gao); + printf(""); + + gotoxy(FrameX+ 2*Frame_kuan-2,FrameY + Frame_gao); + printf(""); + a[FrameX+ 2*Frame_kuan-2][FrameY + Frame_gao] = 2; +/****Ϻ*****/ + for(i = 2; i < 2 * Frame_kuan-2; i += 2){ + gotoxy(FrameX + i, FrameY); + printf(""); + } +/*****º*****/ + for(i = 2; i < 2 * Frame_kuan-2; i += 2){ + gotoxy(FrameX + i, FrameY + Frame_gao); + printf(""); + a[FrameX + i][FrameY + Frame_gao] = 2; + } + +/********/ + for(i = 1; i < Frame_gao; i++){ // + gotoxy(FrameX, FrameY+i); + printf(""); + a[FrameX][FrameY + i] = 2; + } + for(i = 1; i < Frame_gao; i++){ + gotoxy(FrameX + 2 * Frame_kuan-2, FrameY+i); + printf(""); + a[FrameX + 2 * Frame_kuan-2][FrameY+i] = 2; + } + +/****ʾ****/ + color(2); + gotoxy(FrameX + 2* Frame_kuan + 3,FrameY + 7); + printf("**********"); + gotoxy(FrameX + 2* Frame_kuan + 3,FrameY + 13); + printf("**********"); + color(3); + gotoxy(FrameX + 2* Frame_kuan + 3,FrameY + 6); + printf("һ飺"); + + color(14); + gotoxy(FrameX + 2* Frame_kuan + 3,FrameY + 17); + printf("ոͣϷ"); + gotoxy(FrameX + 2* Frame_kuan + 3,FrameY + 19); + printf("ESC˳Ϸ"); + +} + +/*********/ +void Makefangkuai(struct fangkuai *tetris) +{ + a[tetris->x][tetris->y] = b[0]; + switch(tetris->flag) + { + case 1: //ַ + { + a[tetris->x][tetris->y-1]=b[1]; + a[tetris->x+2][tetris->y-1]=b[2]; + a[tetris->x+2][tetris->y]=b[3]; + break; + } + case 2: //ֱ߷:---- + { + a[tetris->x-2][tetris->y]=b[1]; + a[tetris->x+2][tetris->y]=b[2]; + a[tetris->x+4][tetris->y]=b[3]; + break; + } + case 3: //ֱ߷: | + { + a[tetris->x][tetris->y-1]=b[1]; + a[tetris->x][tetris->y-2]=b[2]; + a[tetris->x][tetris->y+1]=b[3]; + break; + } + case 4: //Tַ + { + a[tetris->x-2][tetris->y]=b[1]; + a[tetris->x+2][tetris->y]=b[2]; + a[tetris->x][tetris->y+1]=b[3]; + break; + } + case 5: //T˳ʱת90ȷ + { + a[tetris->x][tetris->y-1]=b[1]; + a[tetris->x][tetris->y+1]=b[2]; + a[tetris->x-2][tetris->y]=b[3]; + break; + } + case 6: //T˳ʱת180ȷ + { + a[tetris->x][tetris->y-1]=b[1]; + a[tetris->x-2][tetris->y]=b[2]; + a[tetris->x+2][tetris->y]=b[3]; + break; + } + case 7: //T˳ʱת270ȷ + { + a[tetris->x][tetris->y-1]=b[1]; + a[tetris->x][tetris->y+1]=b[2]; + a[tetris->x+2][tetris->y]=b[3]; + break; + } + case 8: //Zַ + { + a[tetris->x][tetris->y+1]=b[1]; + a[tetris->x-2][tetris->y]=b[2]; + a[tetris->x+2][tetris->y+1]=b[3]; + break; + } + case 9: //Z˳ʱת90ȷ + { + a[tetris->x][tetris->y-1]=b[1]; + a[tetris->x-2][tetris->y]=b[2]; + a[tetris->x-2][tetris->y+1]=b[3]; + break; + } + case 10: //Z˳ʱת180ȷ + { + a[tetris->x][tetris->y-1]=b[1]; + a[tetris->x-2][tetris->y-1]=b[2]; + a[tetris->x+2][tetris->y]=b[3]; + break; + } + case 11: //Z˳ʱת270ȷ + { + a[tetris->x][tetris->y+1]=b[1]; + a[tetris->x+2][tetris->y-1]=b[2]; + a[tetris->x+2][tetris->y]=b[3]; + break; + } + case 12: //7ַ + { + a[tetris->x][tetris->y-1]=b[1]; + a[tetris->x][tetris->y+1]=b[2]; + a[tetris->x-2][tetris->y-1]=b[3]; + break; + } + case 13: //7˳ʱת90ȷ + { + a[tetris->x-2][tetris->y]=b[1]; + a[tetris->x-2][tetris->y+1]=b[2]; + a[tetris->x+2][tetris->y]=b[3]; + break; + } + case 14: //7˳ʱת180ȷ + { + a[tetris->x][tetris->y-1]=b[1]; + a[tetris->x][tetris->y+1]=b[2]; + a[tetris->x+2][tetris->y+1]=b[3]; + break; + } + case 15: //7˳ʱת270ȷ + { + a[tetris->x-2][tetris->y]=b[1]; + a[tetris->x+2][tetris->y-1]=b[2]; + a[tetris->x+2][tetris->y]=b[3]; + break; + } + case 16: //7ַ + { + a[tetris->x][tetris->y+1]=b[1]; + a[tetris->x][tetris->y-1]=b[2]; + a[tetris->x+2][tetris->y-1]=b[3]; + break; + } + case 17: //7˳ָת90ȷ + { + a[tetris->x-2][tetris->y]=b[1]; + a[tetris->x-2][tetris->y-1]=b[2]; + a[tetris->x+2][tetris->y]=b[3]; + break; + } + case 18: //7˳ʱת180ȷ + { + a[tetris->x][tetris->y-1]=b[1]; + a[tetris->x][tetris->y+1]=b[2]; + a[tetris->x-2][tetris->y+1]=b[3]; + break; + } + case 19: //7˳ʱת270ȷ + { + a[tetris->x-2][tetris->y]=b[1]; + a[tetris->x+2][tetris->y+1]=b[2]; + a[tetris->x+2][tetris->y]=b[3]; + break; + } + } +} + +/****ӡ*****/ + +void Printfangkuai(struct fangkuai *tetris) +{ + for(i = 0; i < 4; i++) + { + b[i] = 1; + } + Makefangkuai(tetris); + for(i = tetris->x-2; i <= tetris->x+4; i += 2){ + for(j = tetris->y-2; j <= tetris->y+1; j++){ + if(a[i][j] == 1 && j > FrameY){ + gotoxy(i, j); + printf(""); + } + } + } + + /*****ӡϢ******/ + gotoxy(FrameX + 2 * Frame_kuan+3,FrameY + 1); + color(4); + printf("ȼ "); + color(12); + printf("%d", tetris->level); + + gotoxy(FrameX + 2 * Frame_kuan+3,FrameY + 3); + color(4); + printf(" "); + color(12); + printf("%d", tetris->score); + + gotoxy(FrameX + 2 * Frame_kuan+3,FrameY + 5); + color(4); + printf("ٶȣ "); + color(12); + printf("%dms", tetris->speed); +} + + +/*****жǷƶ*****/ +int ifMove(struct fangkuai *tetris) +{ + if(a[tetris->x][tetris->y] != 0){ //ķ鴦Ϊ + return 0; + } + else + { + if(//Ϊַҳķλ⣬""ַλͼʱֵΪ1ƶ + ( tetris->flag==1 && ( a[tetris->x][tetris->y-1]==0 && + a[tetris->x+2][tetris->y-1]==0 && a[tetris->x+2][tetris->y]==0 ) ) || + //Ϊֱ߷ҳķλ⣬""ַλͼʱֵΪ1ƶ + ( tetris->flag==2 && ( a[tetris->x-2][tetris->y]==0 && + a[tetris->x+2][tetris->y]==0 && a[tetris->x+4][tetris->y]==0 ) ) || + + ( tetris->flag==3 && ( a[tetris->x][tetris->y-1]==0 && + a[tetris->x][tetris->y-2]==0 && a[tetris->x][tetris->y+1]==0 ) ) || + + ( tetris->flag==4 && ( a[tetris->x-2][tetris->y]==0 && + a[tetris->x+2][tetris->y]==0 && a[tetris->x][tetris->y+1]==0 ) ) || + + ( tetris->flag==5 && ( a[tetris->x][tetris->y-1]==0 && + a[tetris->x][tetris->y+1]==0 && a[tetris->x-2][tetris->y]==0 ) ) || + + ( tetris->flag==6 && ( a[tetris->x][tetris->y-1]==0 && + a[tetris->x-2][tetris->y]==0 && a[tetris->x+2][tetris->y]==0 ) ) || + + ( tetris->flag==7 && ( a[tetris->x][tetris->y-1]==0 && + a[tetris->x][tetris->y+1]==0 && a[tetris->x+2][tetris->y]==0 ) ) || + + ( tetris->flag==8 && ( a[tetris->x][tetris->y+1]==0 && + a[tetris->x-2][tetris->y]==0 && a[tetris->x+2][tetris->y+1]==0 ) ) || + + ( tetris->flag==9 && ( a[tetris->x][tetris->y-1]==0 && + a[tetris->x-2][tetris->y]==0 && a[tetris->x-2][tetris->y+1]==0 ) ) || + + ( tetris->flag==10 && ( a[tetris->x][tetris->y-1]==0 && + a[tetris->x-2][tetris->y-1]==0 && a[tetris->x+2][tetris->y]==0 ) ) || + + ( tetris->flag==11 && ( a[tetris->x][tetris->y+1]==0 && + a[tetris->x+2][tetris->y-1]==0 && a[tetris->x+2][tetris->y]==0 ) ) || + + ( tetris->flag==12 && ( a[tetris->x][tetris->y-1]==0 && + a[tetris->x][tetris->y+1]==0 && a[tetris->x-2][tetris->y-1]==0 ) ) || + + ( tetris->flag==13 && ( a[tetris->x-2][tetris->y]==0 && + a[tetris->x-2][tetris->y+1]==0 && a[tetris->x+2][tetris->y]==0 ) ) || + + ( tetris->flag==14 && ( a[tetris->x][tetris->y-1]==0 && + a[tetris->x][tetris->y+1]==0 && a[tetris->x+2][tetris->y+1]==0 ) ) || + + ( tetris->flag==15 && ( a[tetris->x-2][tetris->y]==0 && + a[tetris->x+2][tetris->y-1]==0 && a[tetris->x+2][tetris->y]==0 ) ) || + + ( tetris->flag==16 && ( a[tetris->x][tetris->y+1]==0 && + a[tetris->x][tetris->y-1]==0 && a[tetris->x+2][tetris->y-1]==0 ) ) || + + ( tetris->flag==17 && ( a[tetris->x-2][tetris->y]==0 && + a[tetris->x-2][tetris->y-1]==0 && a[tetris->x+2][tetris->y]==0 ) ) || + + ( tetris->flag==18 && ( a[tetris->x][tetris->y-1]==0 && + a[tetris->x][tetris->y+1]==0 && a[tetris->x-2][tetris->y+1]==0 ) ) || + + ( tetris->flag==19 && ( a[tetris->x-2][tetris->y]==0 && + a[tetris->x+2][tetris->y+1]==0 && a[tetris->x+2][tetris->y]==0 ) ) + ) + { + return 1; + } + } + return 0; +} + +/*****켣******/ +void Cleanfangkuai(struct fangkuai *tetris) +{ + for(i = 0; i < 4; i++){ + b[i] = 0; + } + Makefangkuai(tetris); + for(i = tetris->x-2; i <= tetris->x+4; i += 2){ + for(j = tetris->y-2; j <= tetris->y + 1; j++){ + if(a[i][j] == 0 && j > FrameY){ + gotoxy(i, j); + printf(" "); //һĹ켣Կո + } + } + } + } + + + /******жвɾ******/ +void Del_fullline(struct fangkuai *tetris) +{ + int k, del_rows = 0; + for(j = FrameY+Frame_gao-1; j >= FrameY+1; j--){ + k=0; + for(i = FrameX+2; i < FrameX + 2* Frame_kuan - 2; i += 2){ //½ǿʼϷ + if(a[i][j] == 1){ + k++; + if(k == Frame_kuan - 2) //ki + { + for(k = FrameX + 2; k < FrameX + 2 * Frame_kuan - 2; k += 2) + { + a[k][j] = 0; + gotoxy(k, j); + printf(" "); //ɾ + } + + for(k = j-1; k > FrameY; k--) //kj + { + for(i = FrameX + 2; i < FrameX + 2 * Frame_kuan-2; i += 2) + { + if(a[i][k] == 1) + { + a[i][k] == 0; + gotoxy(i,k); + printf(" "); + a[i][k+1] == 1; + gotoxy(i, k+1); + printf(""); + } + } + } + j++; + del_rows++; //¼ɾ + } + } + } + } + tetris->score += 100*del_rows; //÷ + if(del_rows > 0 && (tetris->score % 1000 == 0 || (tetris->score / 1000) > (tetris->level-1))) + { + tetris->speed -= 20; + tetris->level++; + } + + } + + +/**********/ +void Flag(struct fangkuai *tetris) +{ + tetris->number++; + srand(time(NULL)); //ʼ + if(tetris->number == 1) + { + tetris->flag == rand()%19+1; //randȡ࣬Ϊ0~18 + } + tetris->next = rand()%19+1; +} + +/*******ʼϷ********/ +void Gamebegin() +{ + int n; + struct fangkuai t, *tetris = &t; // + char ch; + tetris->number = 0; //ʼΪ0 + tetris->speed = 300; //ʼٶ + tetris->score = 0; //ʼ÷ + tetris->level = 1; //ʼȼ + while(1) + { + Flag(tetris); + temp = tetris->flag; //tempһ뵽Ϸ + tetris->x = FrameX + 2 * Frame_kuan + 6; + tetris->y = FrameY +10; + tetris->flag = tetris->next; + Printfangkuai(tetris); + tetris->x = FrameX + Frame_kuan; + tetris->y = FrameY -1; + tetris->flag = temp; + + // + while(1) //Ʒ仯ֱ + { + label:Printfangkuai(tetris); //ӡ + Sleep(tetris->speed); //ӻʱ + Cleanfangkuai(tetris); //ۼ + temp1 = tetris->x; //궨ķֵ + temp2 = tetris->flag; //סǰ˹ + if(kbhit()) //жǷм루kbhit + { + ch = getch(); //ch + if((ch == 75) || (ch == 'a' || ch == 'A')) + { + tetris->x-=2; //Aƶĺ2 + } + if((ch == 77) || (ch == 'd' || ch == 'D')) + { + tetris->x+=2; //һDƶĺ2 + } + if((ch == 0x28) || (ch == 's' || ch == 'S')) //¼S¼ + { + if(ifMove(tetris) != 0) + { + tetris->y+=2; + } + if(ifMove(tetris) == 0) + { + tetris->y = FrameY + Frame_gao - 2; + } + } + if((ch == 72) || (ch == 'w' || ch == 'W')) //ϼWı䷽״ + { + if( tetris->flag>=2 && tetris->flag<=3 ) + { + tetris->flag++; + tetris->flag%=2; + tetris->flag+=2; + } + if( tetris->flag>=4 && tetris->flag<=7 ) + { + tetris->flag++; + tetris->flag%=4; + tetris->flag+=4; + } + if( tetris->flag>=8 && tetris->flag<=11 ) + { + tetris->flag++; + tetris->flag%=4; + tetris->flag+=8; + } + if( tetris->flag>=12 && tetris->flag<=15 ) + { + tetris->flag++; + tetris->flag%=4; + tetris->flag+=12; + } + if( tetris->flag>=16 && tetris->flag<=19 ) + { + tetris->flag++; + tetris->flag%=4; + tetris->flag+=16; + } + } + if(ch == 32){ //ոͣ + Printfangkuai(tetris); + while(1) + { + if(kbhit()) + { + ch == getch(); //ٰϷ + if(ch == 32) + { + goto label; + } + } + } + } + + if(ch == 27) //ESC˳˵ + { + system("cls"); + memset(a,0,6400*sizeof(int)); //ʼBOX + welcome(); + } + if(ifMove(tetris) == 0) //ɶЧ + { + tetris->x = temp1; + tetris->flag = temp2; + } + else + { + goto label; + } + } + tetris->y++; //޲ָ򷽿 + if(ifMove(tetris) == 0) //鲻ƶ򷽿ڴ + { + tetris->y--; + Printfangkuai(tetris); + Del_fullline(tetris); + break; + } + } + + for(i = tetris->y; i < tetris->y+1; i++) //鴥Ϸ + { + + if(i == FrameY) + { + system("cls"); + gotoxy(29,7); + printf(" \n"); + color(12); + printf("\t\t\t \n"); + printf("\t\t\t \n"); + printf("\t\t\t \n"); + printf("\t\t\t \n"); + printf("\t\t\t \n"); + gotoxy(17,18); + color(14); + printf("һҪ------1"); + gotoxy(44,18); + printf("Ҳ------2\n"); + int n; + gotoxy(32,20); + printf("ѡ1/2"); + color(11); + scanf("%d", &n); + switch(n) + { + case 1: + { + system("cls"); + Replay(tetris); //¿ʼϷ + break; + } + case 2: + exit(0); + break; + + } + } + + } + tetris->flag = tetris->next; //ұߴڵһ + tetris->x = FrameX + 2 * Frame_kuan +6; + tetris->y = FrameY + 10; + Cleanfangkuai(tetris); + } +} + + +/******¿ʼ******/ +void Replay(struct fangkuai *tetris) +{ + system("cls"); + memset(a,0,6400*sizeof(int)); //memsetʼ飨ݣ*ȣ + DrawGameframe(); + Gamebegin(); + } + +/*******˵*******/ +void explation() +{ + int i, j = 1; + system("cls"); + color(13); + gotoxy(32,3); + printf("˵"); + color(2); + for(i == 6; i <= 16; i++) //yֵ + { + for(j = 15; j <= 60; j++) + { + gotoxy(j,i); + if(i == 6 || i == 16) + { + printf("="); + + } + else if(j == 15 || j == 59) + { + printf("||"); + } + + } + } + color(3); + gotoxy(18,7); + printf("tip1ҿͨADҷƷ"); + color(10); + gotoxy(18,9); + printf("tip2ͨWϷʹʱת"); + color(14); + gotoxy(18,11); + printf("tip3ͨS·ٷ"); + color(11); + gotoxy(18,13); + printf("tip4ոͣϷٰո"); + color(4); + gotoxy(18,15); + printf("tip5ESC˳Ϸ"); + getch(); //˵ + system("cls"); + main(); + +} + + +/****˳Ϸ****/ +void close() +{ + exit(0); +} + + +int main(){ + title(); + welcome(); +} +