C语言写俄罗斯方块,可上机运行
生活随笔
收集整理的這篇文章主要介紹了
C语言写俄罗斯方块,可上机运行
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
?當(dāng)年初學(xué)C語言寫下的俄羅斯方塊,沒有華麗的代碼,都是一步一步循序漸進(jìn)寫下的。代碼絕對唯一!!!(還有會(huì)變色的正方形方塊噢)
本人思路如下圖:
操作方法:? 使用英文輸入法,字母小寫,通過w a s?d 四個(gè)按鍵控制。
空格暫停游戲,Esc退出游戲。下面復(fù)制代碼開始上機(jī)運(yùn)行吧!!!
廢話不多說,上代碼。同時(shí)歡迎有問題的小伙伴在評論區(qū)留言。
#include <stdio.h> #include <windows.h> #include <time.h> #include <conio.h> #include <stdlib.h>#define left 'a' #define right 'd' #define down 's' #define change 'w'int xy[55][25]={0};void shape(); //方塊隨機(jī)形狀 void wall(); //游戲邊框 void move(); //物塊移動(dòng) void Change(); //物塊改變形狀 void Down(); //物塊一直做下落運(yùn)動(dòng) void gotoxy(int a, int b); //光標(biāo)跳轉(zhuǎn) void gotoprint(int x, int y); //打印物塊 void gotodelete(int x, int y); //打印空格來消除物塊 void clickcontrol(); // 判斷鍵盤輸入 void pause(); //游戲暫停 int color(int c); //顏色 void remove(); //消行 void explation(); //游戲說明 void end(); //游戲結(jié)束int i, j, a, b, w_shape, score=0; char click; //鍵盤輸入的值int main() {explation();wall();gotoxy(55,3);while (1){ color(6);printf("你的得分是:%d",score);shape();Down();remove();gotoxy(55,3);for(i=12;i<50;i++)if (xy[i][1]==1) {end();break; //只end一個(gè)循環(huán)}}return 0; }void explation() {int i,j = 1;system("cls"); //實(shí)現(xiàn)清屏color(13);gotoxy(26,4);printf("按鍵說明");color(2);for (i = 6; i <= 18; i++) //輸出上下邊框==={for (j = 15; j <= 60; j++) //輸出左右邊框||{gotoxy(j-6, i);if (i == 6 || i == 18) printf("=");else if (j == 15 || j == 59) printf("||");}}color(3);gotoxy(12,7);printf("tip1: 玩家可以通過 a,d方向鍵來移動(dòng)方塊");color(10);gotoxy(12,9);printf("tip2: 通過 w使方塊旋轉(zhuǎn)");color(14);gotoxy(12,11);printf("tip3: 通過 s加速方塊下落");color(11);gotoxy(12,13);printf("tip4: 按空格鍵暫停游戲,再按空格鍵繼續(xù)");color(4);gotoxy(12,15);printf("tip5: 按ESC退出游戲");color(7);gotoxy(35,17);printf("按任意鍵進(jìn)入游戲");getch(); //按任意鍵返回主界面system("cls"); } void wall() {gotoxy(5, 22);color(5);for (i = 10; i < 50; i+=2){gotoxy(i, 22);printf("■");xy[i][22]=1; //有問題xy[i+1][22]=1;gotoxy(50,1);printf("■");}for (i = 1; i < 23; i++){gotoxy(50, i);printf("■");xy[50][i] = 1;xy[51][i] = 1;gotoxy(10,i);printf("■");xy[11][i] = 1;xy[10][i]=1;} } void shape() {srand((unsigned)time(0));w_shape=rand()%7+1; // w_shape=1; } void gotoxy(int x, int y) {// 更新光標(biāo)位置 //句柄就好像一個(gè)指針?COORD pos; //COORD是一個(gè)結(jié)構(gòu)體,表示一個(gè)坐標(biāo)。定義包含在window.s的頭文件里HANDLE hOutput = GetStdHandle(STD_OUTPUT_HANDLE);//HANDLE就是句柄數(shù)據(jù)類型。GetStdHandle(STD_OUTPUT_HANDLE)固定格式,獲取一個(gè)標(biāo)準(zhǔn)輸出函數(shù)的句柄。pos.X = x;pos.Y = y; //設(shè)置坐標(biāo)SetConsoleCursorPosition(hOutput, pos); //設(shè)置控制臺光標(biāo)位置。API中定位光標(biāo)位置的函數(shù)。// 把光標(biāo)和句柄聯(lián)系起來?// 隱藏光標(biāo)CONSOLE_CURSOR_INFO cursor;cursor.bVisible = FALSE;cursor.dwSize = sizeof(cursor);SetConsoleCursorInfo(hOutput, &cursor); }void Down() {a = 28;b = 0;for (i = 0; i <= 10; i++){ // clickcontrol(); // for(j=0;j<400000000;j++);b = b + 1;gotoprint(a, b); // pause();for (j = 0; j < 320000000; j++);if (1){if(w_shape==1){ //形狀1if (xy[a-4][b + 1] || xy[a - 2][b + 1] || xy[a ][b + 1] || xy[a + 3][b + 1]){for(i=-4;i<4;i++)xy[a+i][b]= 1;break;}}if (w_shape==2){ //形狀2if (xy[a][b + 2] ){for(i=-2;i<2;i++){xy[a][b+i] = 1;xy[a+1][b+i]=1;}break;}}if(w_shape==3){ //形狀3if(xy[a][b+2]||xy[a+2][b+2]){for(i=0;i<4;i++){xy[a+i][b]=1;xy[a+i][b+1]=1;}break;}}if(w_shape==4){ //形狀4if(xy[a-2][b+2]||xy[a][b+2]||xy[a+2][b+2]){xy[a][b]=1;xy[a+1][b]=1;for(i=0;i<6;i++){xy[a+i-2][b+1]=1;}break;}}if(w_shape==5){ //形狀5if(xy[a-2][b+1]||xy[a-1][b+1]||xy[a][b+2]||xy[a+1][b+2]){xy[a-2][b]=1;xy[a-1][b]=1;for(i=-1;i<2;i++){xy[a][b+i]=1;xy[a+1][b+i]=1;}break;}}if(w_shape==6){ //形狀6if(xy[a-2][b]||xy[a][b+1]||xy[a+2][b]){xy[a][b]=1;xy[a+1][b]=1;for(i=-2;i<4;i++){xy[a+i][b-1]=1;}break;}}if(w_shape==7){ //形狀7if(xy[a+2][b+1]||xy[a+1][b+1]||xy[a][b+2]||xy[a+1][b+2]){xy[a+2][b]=1;xy[a+1][b]=1;for(i=-1;i<2;i++){xy[a][b+i]=1;xy[a+1][b+i]=1;}break;}}} // clickcontrol(); // pause();gotodelete(a, b);for(j=0;j<10;j++)clickcontrol();} }void clickcontrol() {if (_kbhit()){click = _getch();if(click == ' '){gotoprint(a,b+1);pause();}else if (click==27){ //ESC結(jié)束游戲end();}elsemove();} } void pause() {char a;while(1){if(_kbhit){a = _getch();if (a==' ')break;}} }int color(int c) {SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), c); //更改文字顏色return 0; }void gotoprint(int x, int y) {int c,b;gotoxy(x, y);color(01);if(w_shape==1){ //形狀1 ----gotoxy(x-4,y);for (i = -2; i < 6; i+=2)printf("■");}color(06);if(w_shape==2) //形狀2 |for (i = -2; i < 2; i++){gotoxy(x, y + i);printf("■");}color(02);if(w_shape==3) //形狀3 田for (i = 0; i < 2; i++){c=rand()%13+1;color(c);gotoxy(x, y + i);printf("■");b=rand()%6+1;color(b);gotoxy(x+2,y+i);printf("■");}color(2);if(w_shape==4){ //形狀4 _|_gotoxy(x,y);printf("■");for(i=0;i<6;i+=2){gotoxy(x+i-2,y+1);printf("■");}}color(9);if(w_shape==5){ //形狀5 -|gotoxy(x-2,y);printf("■");for(i=-1;i<2;i++){gotoxy(x,y+i);printf("■");}}color(6);if(w_shape==6){ //形狀6 -_-gotoxy(x,y);printf("■");for(i=-2;i<4;i+=2){gotoxy(x+i,y-1);printf("■");}}color(4);if(w_shape==7){ //形狀7 |-gotoxy(x+2,y);printf("■");for(i=-1;i<2;i++){gotoxy(x,y+i);printf("■");}} }void gotodelete(int x, int y) {gotoxy(x, y);if(w_shape==1)for (i = -2; i < 6; i+=2){gotoxy(x-2+i,y);printf(" ");}if(w_shape==2)for (i = -2; i < 2 ; i++){gotoxy(x, y + i);printf(" ");}if(w_shape==3)for (i = 0; i < 2; i++){gotoxy(x, y + i);printf(" ");}if(w_shape==4){gotoxy(x,y);printf(" ");for(i=0;i<6;i+=2){gotoxy(x+i-2,y+1);printf(" ");}}if(w_shape==5){gotoxy(x-2,y);printf(" ");for(i=-1;i<2;i++){gotoxy(x,y+i);printf(" ");}}if(w_shape==6){gotoxy(x,y);printf(" ");for(i=-2;i<4;i+=2){gotoxy(x+i,y-1);printf(" ");}}if(w_shape==7){gotoxy(x+2,y);printf(" ");for(i=-1;i<2;i++){gotoxy(x,y+i);printf(" ");}}} //要改 void move() {if (w_shape==1)switch (click){case left:if (!xy[a - 5][b + 1] && !xy[a - 6][b + 1])a -= 2;break;case right:if (!xy[a + 4][b + 1] && !xy[a + 5][b + 1])a += 2;break;case down:if(!xy[a-4][b+2]&&!xy[a-2][b+2]&&!xy[a][b+2]&&!xy[a+2][b+2])b += 1;break;case change:if(!xy[a][b+1] && !xy[a][b+2])Change();break;}else if (w_shape==2)switch (click){case left:if (!xy[a - 2][b + 2] && !xy[a - 1][b + 2])a -= 2;break;case right:if (!xy[a + 2][b + 2] && !xy[a + 1][b + 2])a += 2;break;case down:if(!xy[a][b+3])b += 1;break;case change:if(a>=14&&(!xy[a-4][b+1]&&!xy[a-2][b+1])&&!xy[a][b+1]&&!xy[a+2][b])Change();break;}else if (w_shape==3)switch (click){case left:if (!xy[a - 2][b + 2] && !xy[a - 1][b + 2])a -= 2;break;case right:if (!xy[a + 3][b + 2] && !xy[a + 4][b + 2])a += 2;break;case down:if (!xy[a][b+3]&&!xy[a+1][b+3])b += 1;break;case change:Change();break;}else if(w_shape==4)switch (click){case left:if (!xy[a - 4][b + 2] && !xy[a - 3][b + 2])a -= 2;break;case right:if (!xy[a + 4][b + 2] && !xy[a + 5][b + 2])a += 2;break;case down:if (!xy[a-2][b+3] &&!xy[a][b+3]&&!xy[a+2][b+3])b += 1;break;case change:Change();break;}else if(w_shape== 5)switch (click){case left:if (!xy[a - 3][b + 1] && !xy[a - 4][b + 1] &&!xy[a-1][b+2]&&!xy[a - 1][b + 1])a -= 2;break;case right:if ( !xy[a + 2][b + 1] && !xy[a+2][b+2] &&!xy[a+2][b])a += 2;break;case down:if (!xy[a-2][b+2] &&!xy[a][b+3])b += 1;break;case change:Change();break;}else if(w_shape== 6)switch (click){case left:if (!xy[a - 4][b] && !xy[a - 3][b] &&!xy[a - 1][b + 1] && !xy[a][b + 1])a -= 2;break;case right:if ( !xy[a + 2][b + 1] && !xy[a+2][b+2] &&!xy[a+2][b])a += 2;break;case down:if (!xy[a-2][b+2] &&!xy[a][b+3]&&!xy[a+2][b+2])b += 1;break;case change:Change();break;}else if(w_shape== 7)switch (click){case left:if (!xy[a - 2][b ] && !xy[a - 2][b + 1] &&!xy[a-2][b+2])a -= 2;break;case right:if ( !xy[a + 4][b + 1] && !xy[a+2][b+2] &&!xy[a+2][b])a += 2;break;case down:if (!xy[a+2][b+2] &&!xy[a][b+3])b += 1;break;case change:Change();break;} }void Change() {if (w_shape == 1)w_shape = 2;else if (w_shape == 2)w_shape = 1;else if (w_shape == 3)w_shape = 3;else if (w_shape == 4)w_shape = 5;else if (w_shape == 5)w_shape = 6;else if (w_shape == 6)w_shape = 7;else if (w_shape == 7)w_shape = 4; }void remove() {int store[55][25]; //point!!!int _i=0;int count=0;for(i=10;i<22;i++){count=0;for(j=12;j<50;j++)if(xy[j][i])count+=1;if(count>=38){_i=i;i=22;break;}}if(count>=38){score+=100;for(j=12;j<50;j++)for(i=0;i<22;i++){store[j][i]=xy[j][i]; //point 因?yàn)橘x值是單個(gè)進(jìn)行而非一段進(jìn)行(動(dòng)態(tài)) eg.a[][]={0,1,0}; a[j+1][i]=a[j][i]的結(jié)果為a[][]={0,0,0}gotoxy(j,i); // if(j!=49)printf(" ");}for(j=12;j<50;j++)for(i=0;i<_i;i++){gotoxy(j,i);xy[j][i+1]=store[j][i]; // printf("%d",xy[j][i]);}for(j=12;j<50;j+=2)for(i=2;i<22;i++)if(xy[j][i]==1){ color(j%5+1);gotoxy(j,i);printf("■");}} }void end() {color(8);gotoxy(12,4); printf(" ");gotoxy(12,5); printf(" ■■■■ ■ ■ ■■ ");gotoxy(12,6); printf(" ■ ■■ ■ ■ ■ ");gotoxy(12,7); printf(" ■■■ ■ ■ ■ ■ ■ ");gotoxy(12,8); printf(" ■ ■ ■■ ■ ■ ");gotoxy(12,9); printf(" ■■■■ ■ ■ ■■ ");gotoxy(12,10); printf(" ");gotoxy(0,24);while(1); }運(yùn)行結(jié)果:
?
三人行,則必有我?guī)煛g迎小伙伴們一起交流學(xué)習(xí)。
制作不易,小伙伴們記得給個(gè)關(guān)注+三連噢!
總結(jié)
以上是生活随笔為你收集整理的C语言写俄罗斯方块,可上机运行的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: CMake 入门与进阶
- 下一篇: 状态机模型