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语言做俄罗斯方块的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java基本数据类型_Java 中有几种
- 下一篇: 有机发光二极管显示器测试方法_研究人员证