當前位置:編程學習大全網 - 編程語言 - c編程俄羅斯方塊

c編程俄羅斯方塊

#i包括& ltstdio.h & gt

#i包括& ltdos.h & gt

#i包括& ltconio.h & gt

#i包括& ltgraphics.h & gt

#i包括& ltstdlib.h & gt

#ifdef __cplusplus

#define __CPPARGS...

#否則

#define __CPPARGS

#endif

#define MINBOXSIZE 15 /*最小方形尺寸*/

#定義背景顏色7 /*背景顏色*/

#定義GX 200

#定義GY 10

#define SJNUM 10000 /*玩家每打到壹萬級,加壹級*/

/*鍵碼*/

#定義VK _左0x4b00

#定義VK _右0x4d00

#定義VK_DOWN 0x5000

#定義VK_UP 0x4800

#定義VK_HOME 0x4700

#定義VK_END 0x4f00

#定義VK空間0x3920

#定義VK_ESC 0x011b

#定義VK _輸入0x1c0d

/*定義俄羅斯方塊的方向(我定義為四)*/

#定義F_DONG 0

#定義F_NAN 1

#定義F_XI 2

#定義F_BEI 3

#define NEXTCOL 20 /*要打印的下壹個框的縱坐標*/

#define NEXTROW 12 /*要繪制的下壹個框的水平標簽*/

#define MAXROW 14 /*遊戲屏幕大小*/

#定義MAXCOL 20

#定義SCCOL 100 /*在遊戲屏幕大監視器上的相對位置*/

#定義SCROW 60

int gril[22][16];/*遊戲屏幕坐標*/

int col=1,row = 7;/*當前框的水平和垂直坐標*/

int boxfx=0,box GS = 0;/*當前神廟塊的形狀和方向*/

int nextboxfx=0,nextboxgs=0,maxcol = 22/*下壹個方塊的形狀和方向*/

int minboxcolor=6,nextminboxcolor = 6;

int num = 0;/*遊戲分數*/

int dj=0,gamedj[10]={18,16,14,12,10,8,6,4,2,1 };/*遊戲等級*/

/*我使用壹個3D數組來記錄盒子的初始形狀和方向*/

int boxstr[7][4][16]={{

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

{0,1,0,0,1,1,0,0,1,0,0,0,0,0,0,0}},

{

{0,1,1,0,1,1,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},

{0,1,1,0,1,1,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,0,0,1,0,0,0,1,0,0,0,0,0,0},

{1,1,1,0,1,0,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,1,0,1,1,1,0,0,0,0,0,0,0,0,0}},

{

{1,1,0,0,1,0,0,0,1,0,0,0,0,0,0,0},

{1,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0},

{0,1,0,0,0,1,0,0,1,1,0,0,0,0,0,0},

{1,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0}},

{

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

{0,0,0,0,1,1,1,1,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},

{1,1,0,0,1,1,0,0,0,0,0,0.0,0,0,0}},

{

{0,0,0,0,1,1,1,0,0,1,0,0,0,0,0,0},

{1,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0},

{0,1,0,0,1,1,1,0,0,0,0,0.0,0,0,0},

{0,1,0,0,1,1,0,0,0,1,0,0,0,0,0,0}}

};

/*隨機獲取當前方塊和下壹個方塊的形狀和方向*/

void boxrad(){

minboxcolor = nextminboxcolor

boxgs = nextboxgs

boxfx = nextboxfx

nextminboxcolor = random(14)+1;

if(nextminboxcolor = = 4 | | nextminboxcolor = = 7 | | nextminboxcolor = = 8)

nextminboxcolor = 9;

nextboxfx = F _ DONG

nextbox GS = random(7);

}

/*初始化圖形模塊測試*/

void init(int gdrive,int gmode){

int錯誤代碼;

init graph(& amp;g drive & amp;gmode," e:\ \ TC ");

error code = graph result();

if(errorcode!=grOk){

printf("的錯誤:%s ",grapherrormsg(error code));

退出(1);

}

}

/*在圖形模式下清除屏幕*/

void cls()

{

setfillstyle(SOLID_FILL,0);

set color(0);

巴(0,0,640,480);

}

/*圖形模式下的高級屏幕清除*/

void clscr(int a,int b,int c,int d,int color){

setfillstyle(SOLID_FILL,color);

setcolor(顏色);

酒吧(甲、乙、丙、丁);

}

/*最小正方形的繪制*/

void minbox(int asc,int bsc,int color,int bdcolor){

int a=0,b = 0;

a = sc col+ASC;

b = SCROW+BSC;

clscr(a+1,b+1,a-1+MINBOXSIZE,b-1+MINBOXSIZE,color);

如果(色!=BGCOLOR){

set color(BD color);

line(a+1,b+1,a-1+MINBOXSIZE,b+1);

line(a+1,b+1,a+1,b-1+MINBOXSIZE);

line(a-1+MINBOXSIZE,b+1,a-1+MINBOXSIZE,b-1+MINBOXSIZE);

line(a+1,b-1+MINBOXSIZE,a-1+MINBOXSIZE,b-1+MINBOXSIZE);

}

}

/*遊戲中出現的文本*/

void txt(int a,int b,char *txt,int font,int color){

setcolor(顏色);

settextstyle(0,0,font);

outtextxy(a,b,txt);

}

/*windows繪圖*/

void win(int a,int b,int c,int d,int bgcolor,int bordercolor){

clscr(a,b,c,d,bgcolor);

set color(border color);

線(a,b,c,b);

線(a,b,a,d);

線(a,d,c,d);

線(丙,乙,丙,丁);

}

/*當前框的繪制*/

void funbox(int a,int b,int color,int bdcolor){

int i,j;

int boxz[4][4];

for(I = 0;我& lt16;i++)

boxz[I/4][I % 4]= boxstr[boxgs][boxfx][I];

for(I = 0;我& lt4;i++)

for(j = 0;j & lt4;j++)

if(boxz[i][j]==1)

minbox((j+row+a)*MINBOXSIZE,(i+col+b)*MINBOXSIZE,color,BD color);

}

/*繪制下壹個框*/

void nextfunbox(int a,int b,int color,int bdcolor){

int i,j;

int boxz[4][4];

for(I = 0;我& lt16;i++)

boxz[I/4][I % 4]= boxstr[nextboxgs][nextboxfx][I];

for(I = 0;我& lt4;i++)

for(j = 0;j & lt4;j++)

if(boxz[i][j]==1)

minbox((j+a)*MINBOXSIZE,(i+b)*MINBOXSIZE,color,BD color);

}

/*時間中斷的定義*/

#定義定時器0x1c

int timer counter = 0;

void中斷(* old handler)(_ _ CPPARGS);

void中斷newhandler(__CPPARGS){

timer counter++;

old handler();

}

void SetTimer(void interrupt(* int proc)(_ _ CPPARGS)){

old handler = get vect(TIMER);

disable();

setvect(TIMER,int proc);

enable();

}

/*因為遊戲規則,消除方塊最小的線*/

void delcol(int a){

int i,j;

for(I = a;我& gt1;我-)

for(j = 1;j & lt15;j++){

minbox(j*MINBOXSIZE,i*MINBOXSIZE,BGCOLOR,BGCOLOR);

gril[I][j]= gril[I-1][j];

if(gril[i][j]==1)

minbox(j*MINBOXSIZE,i*MINBOXSIZE,minboxcolor,0);

}

}

/*用最小的正方形消除所有行*/

void delete(){

int i,j,zero,delgx = 0;

char * nm = " 00000

for(I = 1;我& lt21;i++){

零= 0;

for(j = 1;j & lt15;j++)

if(gril[i][j]==0)

零= 1;

if(零==0){

德爾科爾(壹);

delgx++;

}

}

num = num+delgx * delgx * 10;

DJ = num/10000;

sprintf(nm," %d ",num);

clscr(456,173,500,200,4);

txt(456,173,"編號:",1,15);

txt(456,193,nm,1,15);

}

/*中斷結束時間*/

void KillTimer(){

disable();

setvect(TIMER,old handler);

enable();

}

/*測試當前方塊是否可以向下下落*/

int downok(){

int i,j,k=1,a[4][4];

for(I = 0;我& lt16;i++)

a[I/4][I % 4]= boxstr[boxgs][boxfx][I];

for(I = 0;我& lt4;i++)

for(j = 0;j & lt4;j++)

如果(a[I][j]& amp;& ampgril[col+i+1][row+j])

k = 0;

返回(k);

}

/*測試當前方塊是否可以向左*/

int leftok(){

int i,j,k=1,a[4][4];

for(I = 0;我& lt16;i++)

a[I/4][I % 4]= boxstr[boxgs][boxfx][I];

for(I = 0;我& lt4;i++)

for(j = 0;j & lt4;j++)

如果(a[I][j]& amp;& ampgril[col+i][row+j-1])

k = 0;

返回(k);

}

/*測試當前方塊是否可以向右對齊*/

int rightok(){

int i,j,k=1,a[4][4];

for(I = 0;我& lt16;i++)

a[I/4][I % 4]= boxstr[boxgs][boxfx][I];

for(I = 0;我& lt4;i++)

for(j = 0;j & lt4;j++)

如果(a[I][j]& amp;& ampgril[col+i][row+j+1])

k = 0;

返回(k);

}

/*測試當前方塊是否可以變形*/

int upok(){

int i,j,k=1,a[4][4];

for(I = 0;我& lt4;i++)

for(I = 0;我& lt16;i++)

a[I/4][I % 4]= boxstr[boxgs][boxfx+1][I];

for(I = 3;我& gt=0;我-)

for(j = 3;j & gt=0;j -)

如果(a[I][j]& amp;& ampgril[col+i][row+j])

k = 0;

返回(k);

}

/*當前框落下後,標記屏幕坐標*/

void setgril(){

int i,j,a[4][4];

funbox(0,0,minboxcolor,0);

for(I = 0;我& lt16;i++)

a[I/4][I % 4]= boxstr[boxgs][boxfx][I];

for(I = 0;我& lt4;i++)

for(j = 0;j & lt4;j++)

if(a[i][j])

gril[col+I][row+j]= 1;

col = 1;row = 7;

}

/*遊戲結束*/

void gameover(){

int i,j;

for(I = 20;我& gt0;我-)

for(j = 1;j & lt15;j++)

minbox(j*MINBOXSIZE,i*MINBOXSIZE,2,0);

txt(103,203,《遊戲結束》,3,10);

}

/*鍵的設置*/

void call_key(int keyx){

開關(keyx){

案例VK向下:{/*向下箭頭,在橫坐標上加壹。*/

if(downok()){

col++;

funbox(0,0,minboxcolor,0);}

否則{

funbox(0,0,minboxcolor,0);

setgril();

nextfunbox(NEXTCOL,NEXTROW,4,4);

boxrad();

nextfunbox(NEXTCOL,NEXTROW,nextminboxcolor,0);

delete();

}

打破;

}

大小寫VK _向上:{/*向上箭頭鍵,方向形狀旋轉90度*/

if(upok())

box fx++;

if(box FX & gt;3)

box FX = 0;

funbox(0,0,minboxcolor,0);

打破;

}

大小寫VK _左:{ /*左箭頭鍵,在縱坐標上減壹*/

if(leftok())

行-;

funbox(0,0,minboxcolor,0);

打破;

}

大小寫VK _右:{ /*右箭頭鍵,加壹*/

if(rightok())

row++;

funbox(0,0,minboxcolor,0);

打破;

}

案例VK_SPACE: /*空格鍵,直接下降到最後壹個可以下降的地方*/

while(downok())

col++;

funbox(0,0,minboxcolor,0);

setgril();

nextfunbox(NEXTCOL,NEXTROW,4,4);

boxrad();

nextfunbox(NEXTCOL,NEXTROW,nextminboxcolor,0);

delete();

打破;

默認值:

{

txt(423,53," worng key!",1,4);

txt(428,80,"請輸入壹個唯壹的密鑰AG!",1,4);

getch();

clscr(420,50,622,97,BGCOLOR);

}

}

}

/*中斷開始時間*/

void timezd(void){

int鍵;

SetTimer(new handler);

boxrad();

nextfunbox(NEXTCOL,NEXTROW,nextminboxcolor,0);

for(;;){

if(bioskey(1)){

key = BIOS key(0);

funbox(0,0,BGCOLOR,BGCOLOR);

if(key==VK_ESC)

打破;

call_key(鍵);

}

if(timer counter & gt;gamedj[dj]){

timer counter = 0;

if(downok()){

funbox(0,0,BGCOLOR,BGCOLOR);

col++;

funbox(0,0,minboxcolor,0);

}

否則{

if(col==1){

game over();

getch();

打破;

}

setgril();

delete();

funbox(0,0,minboxcolor,0);

col = 1;row = 7;

funbox(0,0,BGCOLOR,BGCOLOR);

nextfunbox(NEXTCOL,NEXTROW,4,4);

boxrad();

nextfunbox(NEXTCOL,NEXTROW,nextminboxcolor,0);

}

}

}

}

/*主程序啟動*/

無效主(無效){

int i,j;

char * nm = " 00000

init(VGA,VGA hi);

cls();

/*屏幕坐標初始化*/

for(I = 0;我& lt= max col+1;i++)

for(j = 0;j & lt= MAXROW+1;j++)

gril[I][j]= 0;

for(I = 0;我& lt= max col+1;i++) {

gril[I][0]= 1;

gril[I][15]= 1;

}

for(j = 1;j & lt= MAXROWj++){

gril[0][j]= 1;

gril[21][j]= 1;

}

clscr(0,0,640,480,15);

win(1,1,639,479,4,15);

win(SCCOL+MINBOXSIZE-2,SCROW+MINBOXSIZE-2,SCCOL+15*MINBOXSIZE+2,SCROW+21*MINBOXSIZE+2,BGCOLOR,0);

nextbox GS = random(8);

nextboxfx = random(4);

sprintf(nm," %d ",num);

txt(456,173,"編號:",1,15);

txt(456,193,nm,1,15);

txt(456,243,"下壹個盒子:",1,15);

timezd();

kill timer();

closegraph();

}

  • 上一篇:華為C語言字符串試題
  • 下一篇:白盒測試與黑盒測試的優缺點是什麽?
  • copyright 2024編程學習大全網