溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

C語(yǔ)言Turbo C下實(shí)現(xiàn)俄羅斯方塊

發(fā)布時(shí)間:2020-10-15 18:18:07 來(lái)源:腳本之家 閱讀:165 作者:lijiao 欄目:編程語(yǔ)言

本文實(shí)例為大家分享了C語(yǔ)言俄羅斯方塊的具體代碼,供大家參考,具體內(nèi)容如下

#include <stdio.h>
#include <dos.h>
#include <conio.h>
#include <graphics.h>
#include <stdlib.h>

#ifdef __cplusplus 
#define __CPPARGS ...
#else
#define __CPPARGS
#endif
#define MINBOXSIZE 15 /* 單方塊的大小 */
#define BGCOLOR 7 /* 背景著色 */
#define GAMEX 200
#define GAMEY 10
#define LEVA 300 /* 每當(dāng)玩家打到三百分等級(jí)加一級(jí)*/

/* 按鍵碼*/
#define VK_LEFT 0x4b00
#define VK_RIGHT 0x4d00
#define VK_DOWN 0x5000
#define VK_UP 0x4800
#define VK_HOME 0x4700
#define VK_END 0x4f00
#define VK_SPACE 0x3920
#define VK_ESC 0x011b
#define VK_ENTER 0x1c0d

/* 定義俄羅斯方塊的方向*/
#define F_S 0
#define STARTCOL 20 /* 要出的下一個(gè)方塊的縱坐標(biāo)*/
#define STARTROW 12 /* 要出的下一個(gè)方塊的橫從標(biāo)*/
#define WINSROW 14 /* 游戲屏幕大小*/
#define WINSCOL 20
#define LWINSCOL 100 /*游戲屏幕大顯示器上的相對(duì)位置*/
#define LWINSROW 60


int gwins[22][16]; /* 游戲屏幕坐標(biāo)*/
int col=1,row=7; /* 當(dāng)前方塊的橫縱坐標(biāo)*/
int nbx=0,nbs=0; /* 當(dāng)前寺塊的形壯和方向*/
int nextnbx=0,nextnbs=0,maxcol=22;/*下一個(gè)方塊的形壯和方向*/
int minbscolor=6,nextminbscolor=6;
int num=0; /*游戲分*/
int leav=0,gameleav[10]={18,16,14,12,10,8,6,4,2,1};/* 游戲等級(jí)*/
/* 以下我用了一個(gè)3維數(shù)組來(lái)紀(jì)錄方塊的最初形狀和方向*/
int boxstastu[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}}

};

/* 隨機(jī)得到當(dāng)前方塊和下一個(gè)方塊的形狀和方向*/
void boxrad(){
  minbscolor=nextminbscolor;
  nbs=nextnbs;
  nbx=nextnbx;
  nextminbscolor=random(14)+1;
  if(nextminbscolor==4||nextminbscolor==7||nextminbscolor==8)
   nextminbscolor=9;
  nextnbx=F_S;
  nextnbs=random(7);
}
/*初始化圖形模試*/
void init(int gdrive,int gmode){
  int errorcode;
  initgraph(&gdrive,&gmode,"c:\tc");
  errorcode=graphresult();
  if(errorcode!=grOk){
   printf("error of: %s",grapherrormsg(errorcode));
   exit(1);
  }
}

/* 在圖形模式下的清屏 */
void cls()
{
  setfillstyle(SOLID_FILL,0);
  setcolor(0);
  bar(0,0,640,480);
}
/*在圖形模式下的高級(jí)清屏*/
void clscr(int a,int b,int c,int d,int color)
{
  setfillstyle(SOLID_FILL,color);
  setcolor(color);
  bar(a,b,c,d);
}
/*最小方塊的繪制*/
void onebox(int asc,int bsc,int color,int bdcolor)
{
  int a=0,b=0;
  a=LWINSCOL+asc;
  b=LWINSROW+bsc;
  clscr(a+1,b+1,a-1+MINBOXSIZE,b-1+MINBOXSIZE,color);
  if(color!=BGCOLOR)
  {
   setcolor(bdcolor);
   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);
  }
}

/*游戲中出現(xiàn)的文字*/
void texts(int a,int b,char *texts,int font,int color)
{
  setcolor(color);
  settextstyle(0,0,font);
  outtextxy(a,b,texts);
}
/*windows 繪制*/
void win(int a,int b,int c,int d,int bgcolor,int bordercolor)
{
  clscr(a,b,c,d,bgcolor);
  setcolor(bordercolor);
  line(a,b,c,b);
  line(a,b,a,d);
  line(a,d,c,d);
  line(c,b,c,d);
}

/* 當(dāng)前方塊的繪制*/
void funbox(int a,int b,int color,int bdcolor)
{
  int i,j;
  int boxz[4][4];
  for(i=0;i<16;i++)
   boxz[i/4][i%4]=boxstastu[nbs][nbx][i];
  for(i=0;i<4;i++)
  for(j=0;j<4;j++)
  if(boxz[i][j]==1)
   onebox((j+row+a)*MINBOXSIZE,(i+col+b)*MINBOXSIZE,color,bdcolor);
}
/*下一個(gè)方塊的繪制*/
void nextfunbox(int a,int b,int color,int bdcolor)
{
  int i,j;
  int boxz[4][4];
  for(i=0;i<16;i++)
   boxz[i/4][i%4]=boxstastu[nextnbs][nextnbx][i];
  for(i=0;i<4;i++)
  for(j=0;j<4;j++)
  if(boxz[i][j]==1)
   onebox((j+a)*MINBOXSIZE,(i+b)*MINBOXSIZE,color,bdcolor);
}
/*時(shí)間中斷定義*/
#define TIMER 0x1c
int TimerCounter=0;
void interrupt( *oldhandler)(__CPPARGS);

void interrupt newhandler(__CPPARGS)
{
  TimerCounter++;
  oldhandler();
}
void SetTimer(void interrupt (*IntProc)(__CPPARGS))
{
  oldhandler=getvect(TIMER);
  disable();
  setvect(TIMER,IntProc);
  enable();
}
/*由于游戲的規(guī)則,消掉都有最小方塊的一行*/
void delcol(int a)
{
  int i,j;
  for(i=a;i>1;i--)
  for(j=1;j<15;j++)
  {
   onebox(j*MINBOXSIZE,i*MINBOXSIZE,BGCOLOR,BGCOLOR);
   gwins[i][j]=gwins[i-1][j];
   if(gwins[i][j]==1)
    onebox(j*MINBOXSIZE,i*MINBOXSIZE,minbscolor,0);
  }
}

/*消掉所有都有最小方塊的行*/
void delete(){
  int i,j,zero,delgx=0;
  char *nm="00000";
  for(i=1;i<21;i++){
   zero=0;
   for(j=1;j<15;j++)
   if(gwins[i][j]==0)
    zero=1;
   if(zero==0){
    delcol(i);
    delgx++;
    }
   }
   num=num+delgx*delgx*10;
   leav=num/10000;

   sprintf(nm,"%d",num);
   clscr(456,173,500,200,4);
   texts(456,173,"Number:",1,15);
   texts(456,193,nm,1,15);
}
/*時(shí)間中斷結(jié)束*/
void KillTimer()
{
  disable();
  setvect(TIMER,oldhandler);
  enable();
}
/* 測(cè)試當(dāng)前方塊是否可以向下落*/
int downok()
{
 int i,j,k=1,a[4][4];
 for(i=0;i<16;i++)
  a[i/4][i%4]=boxstastu[nbs][nbx][i];
 for(i=0;i<4;i++)
 for(j=0;j<4;j++)
   if(a[i][j] && gwins[col+i+1][row+j])
    k=0;
 return(k);
}
/* 測(cè)試當(dāng)前方塊是否可以向左行*/
int leftok()
{
 int i,j,k=1,a[4][4];
 for(i=0;i<16;i++)
  a[i/4][i%4]=boxstastu[nbs][nbx][i];
 for(i=0;i<4;i++)
 for(j=0;j<4;j++)
   if(a[i][j] && gwins[col+i][row+j-1])
   k=0;
 return(k);
}
/* 測(cè)試當(dāng)前方塊是否可以向右行*/
int rightok()
{
 int i,j,k=1,a[4][4];
 for(i=0;i<16;i++)
   a[i/4][i%4]=boxstastu[nbs][nbx][i];
 for(i=0;i<4;i++)
 for(j=0;j<4;j++)
  if(a[i][j] && gwins[col+i][row+j+1])
   k=0;
 return(k);
}
/* 測(cè)試當(dāng)前方塊是否可以變形*/
int upok()
{
 int i,j,k=1,a[4][4];
 for(i=0;i<4;i++)
 for(i=0;i<16;i++)
   a[i/4][i%4]=boxstastu[nbs][nbx+1][i];
 for(i=3;i>=0;i--)
 for(j=3;j>=0;j--)
   if(a[i][j] && gwins[col+i][row+j])
    k=0;
 return(k);
}
/*當(dāng)前方塊落下之后,給屏幕坐標(biāo)作標(biāo)記*/
void setgwins()
{
  int i,j,a[4][4];
  funbox(0,0,minbscolor,0);
  for(i=0;i<16;i++)
   a[i/4][i%4]=boxstastu[nbs][nbx][i];
  for(i=0;i<4;i++)
  for(j=0;j<4;j++)
   if(a[i][j])
   gwins[col+i][row+j]=1;
  col=1;row=7;
}
/*游戲結(jié)束*/
void gameover()
{
  int i,j;
  for(i=20;i>0;i--)
  for(j=1;j<15;j++)
   onebox(j*MINBOXSIZE,i*MINBOXSIZE,2,0);
  texts(103,203,"Game Over",3,10);
}
/*按鍵的設(shè)置*/
void call_key(int keyx)
{
  switch(keyx){
   case VK_DOWN: { /*下方向鍵,橫坐標(biāo)加一。*/
    if(downok()){
      col++;
      funbox(0,0,minbscolor,0);
    }
    else{
      funbox(0,0,minbscolor,0);
      setgwins();
      nextfunbox(STARTCOL,STARTROW,4,4);
      boxrad();
      nextfunbox(STARTCOL,STARTROW,nextminbscolor,0);
      delete();
    }
    break;
   }
   case VK_UP: { /*上方向鍵,方向形狀旋轉(zhuǎn)90度*/
    if(upok())
      nbx++;
    if(nbx>3)
      nbx=0;
    funbox(0,0,minbscolor,0);
    break;
   }
   case VK_LEFT:{ /*左方向鍵,縱坐標(biāo)減一*/
    if(leftok())
     row--;
    funbox(0,0,minbscolor,0);
    break;
   }
   case VK_RIGHT:{ /*右方向鍵,縱坐標(biāo)加一*/
    if(rightok())
      row++;
    funbox(0,0,minbscolor,0);
    break;
   }
   case VK_SPACE: /*空格鍵,直接落到最后可以落到的們置*/
    while(downok())
      col++;
    funbox(0,0,minbscolor,0);
    setgwins();
    nextfunbox(STARTCOL,STARTROW,4,4);
    boxrad();
    nextfunbox(STARTCOL,STARTROW,nextminbscolor,0);
    delete();
    break;
    default:
    {
      texts(423,53,"worng key!",1,4);
      texts(428,80,"Plese Enter Anly Key AG!",1,4);
      getch();
      clscr(420,50,622,97,BGCOLOR);
    }
   }
}

/*時(shí)間中斷開(kāi)始*/
void timezd(void)
{
  int key;
  SetTimer(newhandler);
  boxrad();
  nextfunbox(STARTCOL,STARTROW,nextminbscolor,0);
  for(;;){
   if(bioskey(1)){
    key=bioskey(0);
    funbox(0,0,BGCOLOR,BGCOLOR);
    if(key==VK_ESC)
     break;
     call_key(key);
   }
   if(TimerCounter>gameleav[leav]){
    TimerCounter=0;
    if(downok()){
     funbox(0,0,BGCOLOR,BGCOLOR);
     col++;
     funbox(0,0,minbscolor,0);
    }
    else {
     if(col==1){
      gameover();
      getch();
      break;
     }
     setgwins();
     delete();
     funbox(0,0,minbscolor,0);
     col=1;row=7;
     funbox(0,0,BGCOLOR,BGCOLOR);
     nextfunbox(STARTCOL,STARTROW,4,4);
     boxrad();
     nextfunbox(STARTCOL,STARTROW,nextminbscolor,0);
    }
   }
  }
}

/*主程序開(kāi)始*/
void main(void)
{
  int i,j;
  char *nm="00000";
  init(VGA,VGAHI);
  cls();
  /*屏幕坐標(biāo)初始化*/
  for(i=0;i<=WINSCOL+1;i++)
  for(j=0;j<=WINSROW+1;j++)
  gwins[i][j]=0;
  for(i=0;i<=WINSCOL+1;i++) {
   gwins[i][0]=1;
   gwins[i][15]=1;
  }
  for(j=1;j<=WINSROW;j++){
   gwins[0][j]=1;
   gwins[21][j]=1;
  }
  clscr(0,0,640,480,15);
  win(1,1,639,479,4,15);
  win(LWINSCOL+MINBOXSIZE-2,LWINSROW+MINBOXSIZE-2,LWINSCOL+15*MINBOXSIZE+2,LWINSROW+21*MINBOXSIZE+2,BGCOLOR,0);
  nextnbs=random(8);
  nextnbx=random(4);
  sprintf(nm,"%d",num);
  texts(456,173,"Number:",1,15);
  texts(456,193,nm,1,15);
  texts(456,243,"Next Box:",1,15);
  timezd();
  KillTimer();
  closegraph();
} 

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

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI