欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C語言實(shí)現(xiàn)俄羅斯方塊小游戲

 更新時(shí)間:2020年04月01日 14:04:37   作者:半片瓜  
這篇文章主要為大家詳細(xì)介紹了Linux下C語言實(shí)現(xiàn)俄羅斯方塊小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

C語言實(shí)現(xiàn)俄羅斯方塊小游戲的制作代碼,具體內(nèi)容如下

#include <stdio.h> 
#include <stdlib.h> 
#include <unistd.h> 
 
 
#define TTY_PATH "/dev/tty" 
#define STTY_ON "stty raw -echo -F" 
#define STTY_OFF "stty -raw echo -F" 
 
int map[21][14]; 
char direct; 
 
int node[7][4][16]={ 
 {{0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0},//長(zhǎng)方形 
 {0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0}, 
 {0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0}, 
 {0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0}}, 
 {{1,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0},//正方形 
 {1,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0}, 
 {1,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0}, 
 {1,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0}}, 
 {{0,1,0,0,1,1,1,0,0,0,0,0,0,0,0,0},//3邊加一中點(diǎn) 
 {0,1,0,0,0,1,1,0,0,1,0,0,0,0,0,0}, 
 {0,0,0,0,1,1,1,0,0,1,0,0,0,0,0,0}, 
 {0,1,0,0,1,1,0,0,0,1,0,0,0,0,0,0}}, 
 {{0,1,1,0,0,1,0,0,0,1,0,0,0,0,0,0},//右鋤頭型 
 {0,0,0,0,1,1,1,0,0,0,1,0,0,0,0,0}, 
 {0,1,0,0,0,1,0,0,1,1,0,0,0,0,0,0}, 
 {1,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0}}, 
 {{1,1,0,0,0,1,0,0,0,1,0,0,0,0,0,0},//左鋤頭型 
 {0,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0}, 
 {0,1,0,0,0,1,0,0,0,1,1,0,0,0,0,0}, 
 {0,0,0,0,1,1,1,0,1,0,0,0,0,0,0,0}}, 
 {{0,1,0,0,0,1,1,0,0,0,1,0,0,0,0,0},//右曲折型 
 {0,1,1,0,1,1,0,0,0,0,0,0,0,0,0,0}, 
 {0,1,0,0,0,1,1,0,0,0,1,0,0,0,0,0}, 
 {0,1,1,0,1,1,0,0,0,0,0,0,0,0,0,0}}, 
 {{0,1,0,0,1,1,0,0,1,0,0,0,0,0,0,0},//左曲折型 
 {1,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0}, 
 {0,1,0,0,1,1,0,0,1,0,0,0,0,0,0,0}, 
 {1,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0}} 
 }; 
 
typedef struct block 
{ 
 int x; 
 int y; 
 int blockType; 
 int blockDirect; 
}Block; 
Block bl; 
 
void init_map()//初始化邊框 
{ 
 int i,j; 
 for(i=0; i<21; i++) 
 for(j=0; j<14; j++) 
 { 
 if(j==0 || j==13) 
 map[i][j] = 200; 
 else if(i==20) 
 map[i][j] = 201; 
 else 
 map[i][j] = 0; 
 } 
} 
void new_block()//生成隨機(jī)的俄羅斯方塊 
{ 
 int blockType = rand()%7; 
 int blockDirect = rand()%4; 
 int x = 1; 
 int y = 5; 
 bl.x = x; 
 bl.y = y; 
 bl.blockType = blockType; 
 bl.blockDirect = blockDirect; 
} 
 
void input()//將移動(dòng)后的俄羅斯方塊,導(dǎo)入地圖中作標(biāo)記 
{ 
 int i, j; 
 for(i=0; i<4; i++) 
 for(j=0; j<4; j++) 
 if(node[bl.blockType][bl.blockDirect][i*4+j]==1) 
 { 
 map[bl.x+i][bl.y+j] = 1; 
 } 
} 
void output()//移動(dòng)時(shí),將之前俄羅斯方塊在地圖信息清空。 
{ 
 int i, j; 
 for(i=0; i<4; i++) 
 for(j=0; j<4; j++) 
 if(node[bl.blockType][bl.blockDirect][i*4+j]==1) 
 { 
 map[bl.x+i][bl.y+j] = 0; 
 } 
} 
 
void change()//俄羅斯方格在碰撞后融入,固定 
{ 
 int i, j; 
 for(i=0; i<4; i++) 
 for(j=0; j<4; j++) 
 if(node[bl.blockType][bl.blockDirect][i*4+j]==1) 
 { 
 map[bl.x+i][bl.y+j] = 10; 
 } 
 for(j=1; j<13; j++) 
 if(map[5][j] == 10) 
 { 
 system("clear"); 
 printf("game over !!!!!!!!!\n"); 
 exit(1); 
 } 
} 
 
 
void print_map()//打印地圖,顯示信息 
{ 
 int i,j; 
 for(i=5; i<21; i++) 
 { 
 for(j=0; j<14; j++) 
 { 
 if(map[i][j]==200)//左右邊界 
 printf("#"); 
 else if(map[i][j]==201)//下邊界 
 printf(" # "); 
 else if(map[i][j]==0)//空白地 
 printf(" "); 
 else if(map[i][j]==1)//移動(dòng)的俄羅斯方塊 
 printf(" * "); 
 else if(map[i][j]==10)//固定的俄羅斯方塊 
 printf(" @ "); 
 } 
 printf("\n"); 
 } 
} 
void delLine(int n)//消行 
{ 
 int i,j; 
 for(j = 1; j<13; j++) 
 map[n][j] = 0; 
 for(i = n; i>5 ; i--) 
 for(j = 1; j<13; j++) 
 if(map[i-1][j] != 1) 
 map[i][j] = map[i-1][j]; 
} 
 
void isFillLine()//是否滿足消行條件 
{ 
 
 int i,j; 
 int fals; 
 for(i=19; i>5; i--) 
 { 
 fals = 1; 
 for(j=1; j<13; j++) 
 { 
 if(map[i][j] != 10) 
 { 
 fals = 0; 
 continue; 
 } 
 } 
 if(fals) 
 { 
 delLine(i); 
 } 
 } 
} 
void down()//下移 
{ 
 int i, j; 
 int fale = 1; 
 for(i=3; i>=0; i--) 
 for(j=0; j<4; j++) 
 if(node[bl.blockType][bl.blockDirect][i*4+j] == 1) 
 if(map[bl.x+i+1][bl.y+j] == 10 || map[bl.x+i+1][bl.y+j] == 201) 
 { 
 change(); 
 fale = 0; 
 new_block(); 
 isFillLine(); 
 return; 
 } 
 if(fale) 
 { 
 output(); 
 bl.x += 1; 
 input(); 
 } 
 
} 
void right()//右移 
{ 
 int i, j; 
 int fale = 1; 
 for(i=3; i>=0; i--) 
 for(j=0; j<4; j++) 
 if(node[bl.blockType][bl.blockDirect][i*4+j] == 1) 
 if(map[bl.x+i][bl.y+j+1] == 10 || map[bl.x+i][bl.y+j+1] == 200) 
 { 
 fale = 0; 
 return; 
 } 
 if(fale) 
 { 
 output(); 
 bl.y += 1; 
 input(); 
 } 
 
} 
void left()//左移 
{ 
 int i, j; 
 int fale = 1; 
 for(i=3; i>=0; i--) 
 for(j=0; j<4; j++) 
 if(node[bl.blockType][bl.blockDirect][i*4+j] == 1) 
 if(map[bl.x+i][bl.y+j-1] == 10 || map[bl.x+i][bl.y+j-1] == 200) 
 { 
 fale = 0; 
 return; 
 } 
 if(fale) 
 { 
 output(); 
 bl.y -= 1; 
 input(); 
 } 
 
} 
 
void change_block()//俄羅斯方塊變形 
{ 
 int i,j; 
 output(); 
 int fals = 1; 
 bl.blockDirect += 1; 
 bl.blockDirect %= 4; 
 for(i=0; i<4; i++) 
 for(j=0; j<4; j++) 
 if(node[bl.blockType][bl.blockDirect][i*4+j]==1) 
 if(map[bl.x+i][bl.y+j] != 0 ) 
 { 
 fals = 0; 
 break; 
 } 
 if(fals) 
 { 
 input(); 
 }else 
 { 
 bl.blockDirect -= 1; 
 input(); 
 } 
} 
 
char in_direct()//非堵塞輸入 
{ 
 fd_set fd; 
 struct timeval tv; 
 char ch; 
 FD_ZERO(&fd); 
 FD_SET(0, &fd); 
 tv.tv_sec = 0; 
 tv.tv_usec = 10; 
 if(select(1, &fd ,NULL, NULL, &tv) > 0) 
 { 
 ch = getchar(); 
 } 
 return ch; 
} 
int main()//q 退出游戲,a,d 左右移動(dòng),空格變形 
{ 
 srand(time(NULL)); 
 init_map(); 
 new_block(); 
 input(); 
 char ch; 
 int num = 0; 
 while(1) 
 { 
 usleep(500000); 
 system(STTY_ON TTY_PATH); 
 ch = in_direct(); 
 system(STTY_OFF TTY_PATH); 
 system("clear"); 
 if(ch == 'a' && num <= 1) 
 { 
 left(); 
 print_map(); 
 num++; 
 continue; 
 }else if(ch == 'd' && num <= 1) 
 { 
 right(); 
 print_map(); 
 num++; 
 continue; 
 }else if(ch == ' ' && num <= 1 ) 
 { 
 change_block(); 
 print_map(); 
 num++; 
 continue; 
 }else if(ch == 'q') 
 { 
 system("clear"); 
 printf("gave over!!!!!\n"); 
 exit(0); 
 } 
 down(); 
 print_map(); 
 num = 0; 
 
 } 
 return 0; 
}

更多俄羅斯方塊精彩文章請(qǐng)點(diǎn)擊專題:俄羅斯方塊游戲集合 進(jìn)行學(xué)習(xí)。

更多有趣的經(jīng)典小游戲?qū)崿F(xiàn)專題,分享給大家:

C++經(jīng)典小游戲匯總

python經(jīng)典小游戲匯總

JavaScript經(jīng)典游戲 玩不停

java經(jīng)典小游戲匯總

javascript經(jīng)典小游戲匯總

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • 計(jì)時(shí)器的time_t和clock_t 的兩種實(shí)現(xiàn)方法(推薦)

    計(jì)時(shí)器的time_t和clock_t 的兩種實(shí)現(xiàn)方法(推薦)

    下面小編就為大家?guī)硪黄?jì)時(shí)器的time_t和clock_t 的兩種實(shí)現(xiàn)方法(推薦)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2016-10-10
  • GCC 編譯使用動(dòng)態(tài)鏈接庫(kù)和靜態(tài)鏈接庫(kù)的方法

    GCC 編譯使用動(dòng)態(tài)鏈接庫(kù)和靜態(tài)鏈接庫(kù)的方法

    根據(jù)鏈接時(shí)期的不同,庫(kù)又有靜態(tài)庫(kù)和動(dòng)態(tài)庫(kù)之分,有別于靜態(tài)庫(kù),動(dòng)態(tài)庫(kù)的鏈接是在程序執(zhí)行的時(shí)候被鏈接的
    2013-03-03
  • C/C++語言中全局變量重復(fù)定義問題的解決方法

    C/C++語言中全局變量重復(fù)定義問題的解決方法

    這篇文章主要給大家介紹了關(guān)于C/C++語言中全局變量重復(fù)定義問題的解決方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。
    2018-01-01
  • C++結(jié)構(gòu)體字節(jié)對(duì)齊和共用體大小

    C++結(jié)構(gòu)體字節(jié)對(duì)齊和共用體大小

    這篇文章主要介紹了C++結(jié)構(gòu)體字節(jié)對(duì)齊和共用體大小,結(jié)構(gòu)體內(nèi)存對(duì)齊在筆試和面試中經(jīng)常被問到,所以這篇文章做個(gè)總結(jié),首先通過代碼驗(yàn)證不同結(jié)構(gòu)體的內(nèi)存大小,需要的朋友可以參考下
    2021-11-11
  • C語言數(shù)據(jù)結(jié)構(gòu)之判斷循環(huán)鏈表空與滿

    C語言數(shù)據(jù)結(jié)構(gòu)之判斷循環(huán)鏈表空與滿

    這篇文章主要介紹了C語言數(shù)據(jù)結(jié)構(gòu)之判斷循環(huán)鏈表空與滿的相關(guān)資料,希望通過本文能幫助到大家,讓大家掌握這部分內(nèi)容,需要的朋友可以參考下
    2017-10-10
  • Qt定時(shí)器類QTimer使用詳解與注意事項(xiàng)

    Qt定時(shí)器類QTimer使用詳解與注意事項(xiàng)

    Qt提供了兩種定時(shí)器,一種是QObject類的定時(shí)器,另一種是QTimer類的定時(shí)器,這篇文章主要給大家介紹了關(guān)于Qt定時(shí)器類QTimer使用與注意事項(xiàng)的相關(guān)資料,需要的朋友可以參考下
    2023-10-10
  • C語言實(shí)現(xiàn)銷售管理系統(tǒng)

    C語言實(shí)現(xiàn)銷售管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了C語言實(shí)現(xiàn)銷售管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • C++空類詳解

    C++空類詳解

    以下是對(duì)C++中的空類進(jìn)行了詳細(xì)的介紹,需要的朋友可以過來參考下
    2013-09-09
  • 在matlab中實(shí)現(xiàn)for循環(huán)的方法

    在matlab中實(shí)現(xiàn)for循環(huán)的方法

    for循環(huán)用來循環(huán)處理數(shù)據(jù),break用于終止離它最近的一層for循環(huán),continue用于跳過離它最近的一層for循環(huán),接著執(zhí)行下一次循環(huán),本文重點(diǎn)給大家介紹在matlab中實(shí)現(xiàn)for循環(huán)的方法,感興趣的朋友一起看看吧
    2021-11-11
  • 深入分析C++中類的大小

    深入分析C++中類的大小

    本篇文章深入分析了C++中類的大小問題。需要的朋友參考下
    2013-05-05

最新評(píng)論