日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

俄罗斯方块-C语言-完整代码

發布時間:2023/12/10 编程问答 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 俄罗斯方块-C语言-完整代码 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

效果圖如下





#ifndef _DAY7_H #define _DAY7_H #include<windows.h> #include<time.h> #include<stdbool.h> #include<conio.h>//控制臺輸入輸出函數getch通過鍵盤進行的操作 //游戲區域位置設計 #define COL_BEGIN 2 #define COL_END 14 #define ROW_BEGIN 4 #define ROW_END 26HANDLE Output;//控制臺輸出句柄//存儲游戲相關數據的結構體 typedef struct TetrisManager//俄羅斯管理 {unsigned int pool[28];//游戲池int x;//當前方塊的x坐標,左上角坐標int y;//int type[3];//當前,下一個,下下一個方塊的類型int orientation[3];//當前,下一個,下下一個方塊的旋轉狀態//左邊欄unsigned score;//得分unsigned erasedTotal;//消行總數unsigned erasedCount[4];//消幾行數unsigned tetrisTotal;//目前出現方塊總數unsigned tetrisCount[7];//目前出現各種方塊數bool dead;//掛 }Manager;//結構體別名//構造存儲游戲控制相關數據的結構體 typedef struct TetrisControl {bool pause;//暫停bool clockwise;//旋轉方向;順時針方向為tureint direction;//移動方向:0向左移動 1向右移動//游戲池內每格的顏色//此版本是彩色的,僅用游戲池數據無法存儲顏色int color[28][16]; }Control;//Control是結構體別名//初始狀態的游戲池 //每個元素表示游戲池的一行 //兩端各置兩個1,底部兩行全部為1,便于進行碰撞 //這樣一來游戲池的寬度為12列 共16列 //當某個元素為OXFFFF時,說明該行已經填滿 //頂部4行用于給方塊,不顯示 //底部2行不顯示,顯示出來的游戲池高度為22行 static const unsigned int gs_uInitialTetrisPool[28]= {0XC003,0XC003,0XC003,0XC003,0XC003,0XC003,0XC003,0XC003,0XC003,0XC003,0XC003,0XC003,0XC003,0XC003,0XC003,0XC003,0XC003,0XC003,0XC003,0XC003,0XC003,0XC003,0XC003,0XC003,0XC003,0XC003,0XFFFF,0XFFFF//C003 1100 0000 0000 0011};//7種方塊的4種旋轉狀態(4位一行) static const unsigned int TetrisTable[7][4]= {{ 0x00f0, 0x2222,0x00f0,0x2222 },//I{ 0x0072, 0x0262,0x0270,0x0232 },//T{ 0x0223, 0x0074,0x0622,0x0170 },//L{ 0x0226, 0x0470,0x0322,0x0071 },//J{ 0x0063, 0x0264,0x0063,0x0264 },//Z{ 0x006c, 0x0462,0x006c,0x0462 },//S{ 0x0660, 0x0660,0x0660,0x0660 },//O };//函數聲明 void printPoolBorder();//顯示游戲池邊界 void gotoxyWithFullwidth(short x,short y);//全角顯示鼠標定位函數 void printPrompting();//顯示按鍵提示信息 void printScore(const Manager *manager);void intiGame(Manager* manager,Control*control);//初始化游戲 void startGame(Manager *manager,Control *control); void printNextTetris(const Manager *manager); void printTetrisPool(const Manager *manager,Control *control);//顯示游戲池 void initTetris(Manager *manager);//初始化方塊 void insertTetris(Manager *manager);//插入方塊 bool checkCollision(const Manager *manager);//檢測碰撞 void setPoolColor(const Manager *manager,Control *control); void printCurrentTetris(const Manager *manager,const Control *control); void removeTetris(Manager *manager);//移除當前方塊 void moveDownTetris(Manager *manager, Control *control);//向下移動方塊 void runGame(Manager *manager, Control *control);//運行游戲 void horzMoveTetris(Manager *manager, Control *control);//水平移動方塊 void keydownControl(Manager *manager, Control *control,int key);//按鍵按下控制 void rotateTetris(Manager *manager, Control *control);//旋轉方塊 void dropDownTetris(Manager *manager, Control *control);//方塊直接落地 bool ifPlayAgain();//是否重玩 bool checkErasing(Manager *manager, Control *control);//消行檢測 #endif // _DAY7_H #include <stdio.h> #include <stdlib.h> #include"day7.h"int main() {Manager manager;Control control;intiGame(&manager,&control);//初始化游戲do{printPrompting();//按鍵提示信息printPoolBorder();//游戲池runGame(&manager,&control);if(ifPlayAgain()){SetConsoleTextAttribute(Output,0x07);system("cls") ;//清屏startGame(&manager,&control);//從新開始游戲}elsebreak;}while(1);intiGame(&manager,&control);//初始化游戲CloseHandle(Output);return 0; }//初始化游戲 void intiGame(Manager* manager,Control*control) {Output=GetStdHandle(STD_OUTPUT_HANDLE);//定義光標隱藏變量并初始化CONSOLE_CURSOR_INFO info;info.bVisible=FALSE;//FAlse為光標隱藏info.dwSize=1;//光標亮度為1-100//設置光標隱藏SetConsoleCursorInfo(Output,&info);//提取光標地址SetConsoleTitle("俄羅斯方塊");//控制臺句柄startGame(manager,control);//調用游戲 }//游戲池 void printPoolBorder() {int y;SetConsoleTextAttribute(Output,0xf0);for(y=4;y<26;y++){//兩條縱線gotoxyWithFullwidth(10,y-3);//鼠標定位printf("%2s"," ");gotoxyWithFullwidth(23,y-3);//鼠標定位printf("%2s"," ");}gotoxyWithFullwidth(10,y-3);//一條橫線printf("%28s"," ");} //顯示全角定位 void gotoxyWithFullwidth(short x,short y) {static COORD cd;cd.X= x*2;//移動1個坐標乘以2,改變2個像素點的 距離cd.Y=y;//移動光標到指定位置SetConsoleCursorPosition(Output,cd);//輸出句柄} //按鍵提示信息 void printPrompting() {//設置文字顏色,高亮SetConsoleTextAttribute(Output,0x0b);//設置文字位置gotoxyWithFullwidth(26,10);printf("█控制:");gotoxyWithFullwidth(27,12);printf("□向左移動: ← A 4");gotoxyWithFullwidth(27,13);printf("□向右移動: → D 6");gotoxyWithFullwidth(27,14);printf("□向下移動: ↓ S 2");gotoxyWithFullwidth(27,15);printf("□順時針轉: ↑ W 8 ");gotoxyWithFullwidth(27,16);printf("□逆時針轉: 0 ");gotoxyWithFullwidth(27,17);printf("□直接落地: 空格 ");gotoxyWithFullwidth(27,18);printf("□暫停游戲: 回車 ");gotoxyWithFullwidth(26,23);printf("▉By:briup"); } //顯示得分信息 void printScore(const Manager *manager) {static const char *tetrisName="ITLJZSO";int i;//設置文字顏色 文字顏色 高亮紅+綠=黃色SetConsoleTextAttribute(Output,0x0E);//得分gotoxyWithFullwidth(2,2);printf("█得分:%u",manager->score);//消行總數gotoxyWithFullwidth(1,6);printf("█消行總數:%u",manager->erasedTotal);//一次消1234行數紀錄for(i=0;i<4;i++) {gotoxyWithFullwidth(2,8+i);printf("□消%d:%u",i+1,manager->erasedCount[i]);}//目前出現的方塊總數gotoxyWithFullwidth(1,15);printf("█方塊總數:%u",manager->tetrisTotal);//目前出現的ITLJZSO類型的方塊數紀錄for(i=0;i<7;i++) {gotoxyWithFullwidth(2,17+i);printf("□%c形:%u",tetrisName[i],manager->tetrisCount[i]);}} //開始游戲 void startGame(Manager *manager,Control *control) {/*主要是初始化相關游戲值*///初始化結構體內存空間memset(manager,0,sizeof(Manager));//初始化游戲池memcpy(manager->pool,gs_uInitialTetrisPool,sizeof(unsigned [28]) );//使用時間作為種子參數srand((unsigned)time(NULL));//初始化下一個方塊manager->type[1]=rand()%7;manager->orientation[1]=rand()%4;manager->type[2]=rand()%7;manager->orientation[2]=rand()%3;memset(control,0,sizeof(Control));//初始化方塊initTetris(manager);//給下一個方塊setPoolColor(manager,control);//設置顏色 } //顯示下一個,下下一個 void printNextTetris(const Manager *manager) {int i;unsigned int tetris;//存儲下一個,下下一個類型//設置邊框SetConsoleTextAttribute(Output,0X0f);//高亮白色gotoxyWithFullwidth(26,1);printf("┏━━━━━━━━━┓ ┏━━━━━━━━━┓");gotoxyWithFullwidth(26,2);printf("┃%8s ┃ ┃%8s ┃"," " ," ");gotoxyWithFullwidth(26,3);printf("┃%8s ┃ ┃%8s ┃"," " ," ");gotoxyWithFullwidth(26,4);printf("┃%8s ┃ ┃%8s ┃"," " ," ");gotoxyWithFullwidth(26,5);printf("┃%8s ┃ ┃%8s ┃"," " ," ");gotoxyWithFullwidth(26,6);printf("┗━━━━━━━━━┛ ┗━━━━━━━━━┛");//下一個方格用相應的顏色顯示tetris=TetrisTable[manager->type[1]][manager->orientation[1]];SetConsoleTextAttribute(Output,manager->type[1]|8);//前景高亮for(i=0;i<16;i++){ //x初始位置是27 (i&3)0—15的值為 0123 0123 0123 0123//y初始位置是2 (i>>2)右移兩位0—15的值為0000111122223333gotoxyWithFullwidth((i&3)+27,(i>>2)+2);if((tetris>>i)&1)printf("■");elseprintf("%2s","");}tetris=TetrisTable[manager->type[2]][manager->orientation[2]];SetConsoleTextAttribute(Output,8);for(i=0;i<16;i++){ //x初始位置是33 (i&3)0—15的值為 0123 0123 0123 0123//y初始位置是2 (i>>2)右移兩位0—15的值為0000111122223333gotoxyWithFullwidth((i&3)+33,(i>>2)+2);if((tetris>>i)&1)printf("■");elseprintf("%2s","");} } #define gotoxyInPool(x,y) gotoxyWithFullwidth(x+9,y-3) //顯示游戲池里的方塊 void printTetrisPool(const Manager *manager,Control *control) {int x,y;for(y=ROW_BEGIN;y<ROW_END;y++)//4,26{ gotoxyInPool(2,y);//2+9=11.游戲池中光標定位// gotoxyWithFullwidth(11,y-3);//定點到游戲池中的方格2 14for(x=COL_BEGIN;x<COL_END;x++){if((manager->pool[y]>>x) &1)//1100 0000 0000 0011 >>2//用相應的顏色,顯示一個實心的方塊{SetConsoleTextAttribute(Output,control->color[y][x]);//control->color[y][x] 是一個數//一個方塊如0X00f0 只有0和1組成 若想有特定的顏色 就要擴展成4*4的數組//有1的地方 就賦值為特定的數 也就是特定的顏色//也就是說這xy坐標所確定的地方 不是1 而是一個特定的顏色數manager->type[0]|8設置高亮printf("■");}else{//沒有方塊,顯示空白SetConsoleTextAttribute(Output,0);printf("%2s","");}} } } //初始化方塊 void initTetris(Manager *manager) {unsigned int tetris;//16當前方塊存放manager->type[0]=manager->type[1];//下一個方塊置為當前manager->orientation[0]=manager->orientation[1];//下一個方塊旋轉狀態置為當前manager->type[1]=manager->type[2];//下下一個方塊manager->orientation[1]=manager->orientation[2];manager->type[2]=rand()%7;//隨機生成manager->orientation[2]=rand()%4;//tetris=TetrisTable[manager->type[0]][manager->orientation[0]];//設置當前方塊Y坐標,保證剛給出時只顯示方塊最下面一行 高位//這種方式使得玩家可以以很快的 速度將方塊落在不顯示出4行的位置if(tetris &0x000F)//俄羅斯方塊最先顯示最下面一行manager->y=0;elsemanager->y=(tetris &0x00FF)?1:2;manager->x=6;//設置當前方塊x坐標// manager->y=4;//設置當前方塊y坐標 實際出現游戲池內方塊出現坐標6,1if(checkCollision(manager)) //檢測碰撞manager->dead=true;//標記游戲結束elseinsertTetris(manager); //將當前方塊加入游戲池manager->tetrisTotal++;//方塊總數加起來manager->tetrisCount[manager->type[0]]++;//相應方塊數printNextTetris(manager);//顯示下一個和下下一個方塊printScore(manager);//顯示得分信息} //插入方塊 void insertTetris(Manager *manager) {//插入當前方塊unsigned int tetris;//16位tetris = TetrisTable[manager->type[0]][manager->orientation[0]];//(tetris >>0x0)&0x0f)當前方塊每四位取出,<< manager->x 左移6位 再與0xc003或,最終移到游戲池中央manager->pool[manager->y+0]|=(((tetris >>0x0)&0x0f)<< manager->x);manager->pool[manager->y+1]|=(((tetris>>0x4)&0x0f)<<manager->x);manager->pool[manager->y+2]|=(((tetris >>0x8)&0x0f)<< manager->x);manager->pool[manager->y+3]|=(((tetris>>0xc)&0x0f)<<manager->x); } //設置游戲池中方塊的顏色 void setPoolColor(const Manager *manager,Control *control) {//只做設置顏色,不需要清除//當移動方塊或給一個方塊時候在調用int x,y,i;unsigned int tetris;tetris=TetrisTable[manager->type[0]][manager->orientation[0]];for(i=0;i<16;i++){y=(i>>2)+manager->y;//0000 1111 2222 3333x=(i &3)+manager->x;//0123 0123 0123 0123 x=6 游戲池中間值if(y>ROW_END)//26break;if((tetris>>i) &1)//用相應的顏色,顯示一個實心的方塊control->color[y][x]=(manager->type[0]|8);//設置當前方塊顏色//有四行0 1 2 3 每行有四列0123} }//顯示當前方塊(左右下移動) void printCurrentTetris(const Manager *manager,const Control *control) {//顯示當前的方塊是移動后調用的,必須為擦除移動前的方塊,需要擴展顯示區域int x,y;y=(manager->y>ROW_BEGIN)?manager->y-1:ROW_BEGIN;//下移時向上擴展一格for(;y<ROW_END&&y<manager->y+4;y++){x=(manager->x>COL_BEGIN)?(manager->x-1):COL_BEGIN;//右移向左擴展一格for(;x<COL_END&&x<manager->x+5;x++)//向右擴展一格{gotoxyInPool(x,y);//gotoxyWithFullwidth(2+9,y-3)相對點控制臺//定點到游戲池內的方格if((manager->pool[y]>>x)&1){//用相應的顏色,顯示一個實心方塊SetConsoleTextAttribute(Output,control->color[y][x]);printf("▽");}else{SetConsoleTextAttribute(Output,0);printf("%2s","");}}} } //碰撞檢測 bool checkCollision(const Manager *manager)//空語句 { unsigned int dest=0;//16位//獲取當前方塊unsigned int tetris;tetris=TetrisTable[manager->type[0]][manager->orientation[0]];//獲取當前方塊在游戲池中的區域//游戲池坐標x,y處小方格信息,由低到高放在16位dest |=((((manager->pool[manager->y+0])>>manager->x)<<0x0)&0x000f);//取出游戲池中區域低4位,//如果碰撞到之前保存在游戲池中的方塊,則為1,如果沒有方塊為0dest |=((((manager->pool[manager->y+1])>>manager->x)<<0x4)&0x00f0);dest |=((((manager->pool[manager->y+2])>>manager->x)<<0x8)&0x0f00);dest |=((((manager->pool[manager->y+3])>>manager->x)<<0xc)&0xf000);return ((dest & tetris) !=0); } //移除當前方塊 void removeTetris(Manager *manager) {unsigned int tetris;tetris=TetrisTable[manager->type[0]][manager->orientation[0]];//當前方塊每4位取出按位取反后按位到游戲池相應位置manager->pool[manager->y+0]&=~(((tetris>>0x0)&0x000f)<<manager->x);manager->pool[manager->y+1]&=~(((tetris>>0x4)&0x000f)<<manager->x);manager->pool[manager->y+2]&=~(((tetris>>0x8)&0x000f)<<manager->x);manager->pool[manager->y+3]&=~(((tetris>>0xc)&0x000f)<<manager->x);} //向下移動方塊 void moveDownTetris(Manager *manager, Control *control) {int y;y=manager->y; //記錄原行位置removeTetris(manager);//移走當前方塊++manager->y;//向下移動if(checkCollision(manager))//檢測到碰撞{manager->y=y;//恢復原行位置insertTetris(manager);//放入當前方塊,由于位置沒變不需要設置顏色if(checkErasing(manager,control)) //檢測到消行printTetrisPool(manager,control);//刷新游戲池} else {insertTetris(manager);//放入當前方塊setPoolColor(manager,control);//設置顏色printCurrentTetris(manager,control);//顯示當前方塊,擴展printTetrisPool(manager,control);//顯示游戲池 }} //運行游戲 void runGame(Manager *manager, Control *control) {clock_t clocknow,clocklast;//clock_t長整型clocklast=clock();//clock()返回CPU啟動到調用clock()時的硬件滴答數while(!manager->dead){ while(_kbhit())//有鍵按下{keydownControl(manager,control,getch());//處理按鍵}if(!control->pause)//未暫停{clocknow=clock();if(clocknow-clocklast>0.45*CLOCKS_PER_SEC)//*1000{moveDownTetris(manager,control);clocklast=clocknow;}}} } //水平移動方塊 void horzMoveTetris(Manager *manager, Control *control) {int x=manager->x;//記錄原列位置removeTetris(manager);//移走當前方塊if(control->direction==0)//左移為0,右移為1--manager->x; //左移else++manager->x; //右移if(checkCollision(manager)){manager->x=x;//恢復為原列位置insertTetris(manager);//還是原行的位置顏色不用設置}else{insertTetris(manager);//放入當前方塊setPoolColor(manager,control);//設置顏色printCurrentTetris(manager,control);//顯示當前方塊,擴展} } //旋轉方塊 void rotateTetris(Manager *manager, Control *control) {int ori=manager->orientation[0];//記錄旋轉狀態removeTetris(manager);//移走當前方塊//順/逆時針旋轉if(control->clockwise)manager->orientation[0]=(ori+1)&3;//順時針elsemanager->orientation[0]=(ori+3)&3;//逆時針if(checkCollision(manager)){manager->orientation[0]=ori;insertTetris(manager);}else{insertTetris(manager);//插入當前方塊setPoolColor(manager,control);//設置顏色printCurrentTetris(manager,control);//顯示當前方塊} } // 方塊直接落地 void dropDownTetris(Manager *manager, Control *control) {// 移走當前方塊removeTetris(manager);//從上往下檢測,方塊下移,最大位置不超過下邊界for (;manager->y<ROW_END;manager->y++){//如果檢測到碰撞,結束執行函數體if(checkCollision(manager)){//跳出for循環函數break;}}// 由于檢測到碰撞,需上移一格沒有碰撞的方塊manager->y--; //上移一格insertTetris(manager); // 放入當前方塊 函數調用實現setPoolColor(manager,control); // 設置顏色 函數調用實現checkErasing(manager,control); // 檢測消行 函數調用實現printTetrisPool(manager,control); // 顯示游戲池 函數調用實現 } // 重玩一次 bool ifPlayAgain() {//設置按鍵接收變量int ch;//設置游戲結束提示信息顏色SetConsoleTextAttribute();SetConsoleTextAttribute(Output,0xf0); //背景顏色//移動到指定位置,打印文字(15,10);gotoxyWithFullwidth(15, 10);printf("游戲結束");gotoxyWithFullwidth(13,11);printf("按Y重玩,按N退出");do {//按鍵接收字符 getch()實現ch=getch();//判斷按鍵鍵值,y 返回trueif(ch=='y'||ch=='Y'){return true;}//判斷按鍵鍵值,n 返回falseelse if(ch=='n'||ch=='N'){return false;}}while (1); } //按鍵按下控制 void keydownControl(Manager *manager, Control *control,int key) { if (key == 13) // 暫停/解除暫停{control->pause = !control->pause;}if (control->pause) // 暫停狀態,不作處理{return;//起到終止語句的作用}switch(key){case 's':case 'S':case '2':case 80: // 下 掃描鍵moveDownTetris(manager, control); // 向下移動方塊break;case 'A':case 'a':case '4':case 75 : //左移control->direction=0;horzMoveTetris(manager, control);break;case 'D':case 'd':case '6':case 77 ://右移control->direction=1;horzMoveTetris(manager, control);break;case 'W':case 'w':case '8':case 72 ://上按鍵,順時針control->clockwise=true;rotateTetris(manager,control);break;case '0' ://逆時針control->clockwise=false;rotateTetris(manager,control);break;//直接落地 ' 'case ' ': // 直接落地// 調用直接落地函數dropDownTetris(manager, control);//返回break;default:break;} } //消行檢測 bool checkErasing(Manager *manager, Control *control) {static const unsigned scores[5]={0,10,30,90,100};//消行總分int count=0;//從下往上檢測int y=manager->y+3;//有效區域內且一行已被填滿do{if(y<ROW_END&&manager->pool[y]==0xffff){count++;//消除一行方塊memmove(manager->pool+1,manager->pool,sizeof(unsigned int)*y);//顏色數組的元素隨之改動memmove(control->color[1],control->color[0],sizeof( int [16])*y);}elsey--;}while(y>=manager->y);manager->erasedTotal+=count; //消行總數manager->score+=scores[count];//得分信息if(count>0){manager->erasedCount[count-1]++;//消行}initTetris(manager);//初始化方塊setPoolColor(manager,control);//設置顏色if(count>0)return true;elsereturn false;}

總結

以上是生活随笔為你收集整理的俄罗斯方块-C语言-完整代码的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。