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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

linux下c语言俄罗斯方块,c语言做俄罗斯方块

發布時間:2025/3/12 linux 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 linux下c语言俄罗斯方块,c语言做俄罗斯方块 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

我來對這段程序做一下注釋:

#include /*標準庫*/

#include /*繪圖庫*/

#include /*BIOS庫,輸入輸出,BIOS時間等*/

#define mDRAW 5 /*各種消息的宏定義*/

#define mLINE 6

#define mADOWN 7

#define mGEN 8

#define mLEFT 75

#define mRIGHT 77

#define mSPACE 57

#define mDOWN 80

#define mESC 1

#define TIMEINT 2 //下落間隔時間,即下落速度

#define MAXX 9 /*行列數,9×30的區域*/

#define MAXY 30

#define BACKCOLOR BLACK /*背景色*/

#define WINX 50 //游戲box所在的位置,單位為像素,下同

#define WINY 470

#define GAP 6 //間隙寬度

#define AREAX (WINX+GAP)

#define AREAY (WINY-GAP)

#define BOXW 15 //每一小格的寬度

int oldarea[MAXY+1][MAXX]; //為和當前游戲區域進行比較而保存的上一游戲區域信息

int area[MAXY+1][MAXX]; //游戲區域的方塊信息,有方塊計1,否則計0。

int actW,actH,actX,actY; //方塊可活動的X、Y、寬、高信息

int curX,curY,curColor,curW,curH; //方塊當前的X、Y、寬、高、顏色信息

int newX,newY,newColor,newW,newH; //方塊新的(或稱為接受控制消息后計算出的下一狀態的)X、Y、寬、高、顏色信息

int active; //游戲是否處于active狀態

int box[4][4]; /*方塊的二維數組,定義當前方塊*/

int FORCOLOR; /*前景色*/

int MESSAGE; //方塊位置控制消息

int BOX[7][4][4]={ /*7個不同的方塊定義成4×4的數組,可以看成產生方塊的模板*/

{

{1,1,1,1}, /*直棍*/

{0,0,0,0},

{0,0,0,0},

{0,0,0,0}

},{

{1,1,1,0},/*右彎*/

{1,0,0,0},

{0,0,0,0},

{0,0,0,0}

},{

{1,1,1,0}, /*左彎*/

{0,0,1,0},

{0,0,0,0},

{0,0,0,0}

},{

{1,1,1,0}, /*T型*/

{0,1,0,0},

{0,0,0,0},

{0,0,0,0}

},{

{1,1,0,0}, /*左Z*/

{0,1,1,0},

{0,0,0,0},

{0,0,0,0}

},{

{0,1,1,0}, /*右Z*/

{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}

}

};

//子函數下面詳細說明

void init(); //初始化

void draw(); //繪圖

int genBox();

int getKey();

void lineFull();

int moveLeft();

int moveRight();

int moveDown();

int rotate();

int getW();

int getH();

void clearOldBox();

void putNewBox();

int collisionRotate(int box[][4]);

void getMessage();

void dispatchMessage();

int timeCome();

void fallDown();

int gameOver();

/*------------主函數----------------*/

main()

{

int i;

init();

do //循環

{

getMessage(); //獲得方塊位置控制消息

dispatchMessage(); //根據不同的消息做出不同的動作

}

while(!gameOver()); //直到游戲結束

getch(); //使用getch()讓程序停在這里,按下任意鍵后

closegraph(); //就可關閉圖形,結束游戲

}

/*------------子函數--------------*/

void getMessage()

{

if(MESSAGE) return; //除接受鍵盤消息外,方塊的動作函數也會產生一些消息如果有一個消息尚未處理,則直接返回處理它

if(timeCome()) //計時時間到

{

MESSAGE=mADOWN; //控制消息=mADOWN,自動落下一格

return;

}

if(bioskey(1)) //查詢是否有鍵盤消息

{

MESSAGE=bioskey(0)>>8;/*bioskey(0)返回鍵盤按鍵低8位數的ASCII碼,因此右移8位,生成消息*/

return;

}

}

void dispatchMessage() //根據不同的消息做出不同的動作

{

switch(MESSAGE)

{

case mLEFT: moveLeft();break; //以下分別代表左、右、

case mRIGHT: moveRight();break;//下、旋轉、落下、繪圖、行滿、生成方塊等動作

case mADOWN: moveDown();break;

case mSPACE: rotate();break;

case mDOWN: fallDown(); break;

case mDRAW: draw();break;

case mLINE: lineFull();break;

case mGEN: genBox();break;

case mESC: closegraph(); exit(0);//退出

default: MESSAGE=0;

}

}

void fallDown()

{

while(active)//如果游戲active

{

moveDown(); draw(); //向下落,繪圖

}

MESSAGE=mLINE;

}

int timeCome() //計時函數

{

static long tm, old; //兩個時間,一個從BIOS中取得的新時間,一個上一次獲得的時間

tm=biostime(0,tm);

if(tm-old=MAXX)curX=MAXX-1-curW;//如果當前方塊的寬度+方塊的位置大于最大值,調整位置。

我認為這種情況是不會發生的,唯一的可能是直棍。

curY=MAXY-1-curH; //當前塊Y位置,開始總是從最上端落下

newX=curX; newY=curY; actX=curX;actY=curY;

actW=newW=curW; actH=newH=curH;

active=1;//游戲actice

if(collision(box)) return 0;//如果方塊一下來發生碰撞,返回0,游戲結束

putNewBox();//重構游戲區域

draw(); MESSAGE=0; //繪圖,清空消息

return 1;//產生成功,返回1

}

void lineFull()//每次有方塊落下后,都對方塊那幾行進行判斷

{

int row,col, rowEnd,full,i,j;

rowEnd=newY+newH; //計算方塊落在哪幾行

if(rowEnd>=MAXY-1) rowEnd=MAXY-2;

for(row=newY; rowcurH? newH:curH;

actW=curX+actH-newX;

actX=newX; actY=newY; curX=newX;

curY=newY; curW=newW; curH=newH;

MESSAGE=mDRAW;

return 1;

}

int getW() //獲得一個方塊的寬度

{

int i,j;

for(i=3;i>0;i--)

for(j=0;j0;j--)

for(i=0;i=MAXX) return 1;

if(newY=MAXX) newX=MAXX-1-newW;

if(newY+newH>=MAXY) newY=MAXY-1-newH;

if(collision(cbox)) return 1;

for(i=0;iMAXY-3)) return 1; //如果大于當前Y坐標+當前高度>最大Y坐標-3,游戲結束

else return 0;

} 。

全部

總結

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

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