最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時(shí)間:2018年02月26日 08:30:23   投稿:lijiao  
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言Turbo C下寫的俄羅斯方塊,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

本文實(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í)間中斷開始*/
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);
    }
   }
  }
}

/*主程序開始*/
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í)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • C++利用socket傳輸大文件的實(shí)現(xiàn)代碼

    C++利用socket傳輸大文件的實(shí)現(xiàn)代碼

    這篇文章主要為大家詳細(xì)介紹了C/C++如何使用socket傳輸大文件的實(shí)現(xiàn)代碼,文中的示例代碼講解詳細(xì),具有一定的學(xué)習(xí)價(jià)值,感興趣的小伙伴可以了解一下
    2023-10-10
  • C++基類指針和派生類指針之間的轉(zhuǎn)換方法講解

    C++基類指針和派生類指針之間的轉(zhuǎn)換方法講解

    今天小編就為大家分享一篇關(guān)于C++基類指針和派生類指針之間的轉(zhuǎn)換方法講解,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧
    2019-04-04
  • C語(yǔ)言UDP傳輸系統(tǒng)源碼

    C語(yǔ)言UDP傳輸系統(tǒng)源碼

    這篇文章主要為大家分享了C語(yǔ)言UDP傳輸系統(tǒng)的源碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-02-02
  • C語(yǔ)言修煉之路初識(shí)分支句?循環(huán)助本心上篇

    C語(yǔ)言修煉之路初識(shí)分支句?循環(huán)助本心上篇

    現(xiàn)實(shí)生活中我們經(jīng)常需要根據(jù)不同的條件做出不同的選擇。程序設(shè)計(jì)中也需要根據(jù)條件來(lái)選擇不同的程序進(jìn)行處理,這稱之為分支結(jié)構(gòu),當(dāng)條件表達(dá)式不存在時(shí),它被假設(shè)為真。您也可以設(shè)置一個(gè)初始值和增量表達(dá)式,一般情況下,C?程序員偏向于使用?for(;;)?結(jié)構(gòu)來(lái)表示一個(gè)無(wú)限循環(huán)
    2022-03-03
  • 華為機(jī)試題之統(tǒng)計(jì)單詞個(gè)數(shù)實(shí)例代碼

    華為機(jī)試題之統(tǒng)計(jì)單詞個(gè)數(shù)實(shí)例代碼

    這篇文章主要介紹了華為機(jī)試題之統(tǒng)計(jì)單詞個(gè)數(shù)實(shí)例代碼的相關(guān)資料,需要的朋友可以參考下
    2017-05-05
  • C語(yǔ)言手寫多級(jí)時(shí)間輪定時(shí)器

    C語(yǔ)言手寫多級(jí)時(shí)間輪定時(shí)器

    這篇文章主要為大家詳細(xì)介紹了如何利用C語(yǔ)言實(shí)現(xiàn)手寫多級(jí)時(shí)間輪定時(shí)器,文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,需要的可以參考一下
    2022-09-09
  • C++ 實(shí)現(xiàn)求最大公約數(shù)和最小公倍數(shù)

    C++ 實(shí)現(xiàn)求最大公約數(shù)和最小公倍數(shù)

    這篇文章主要介紹了c++ 實(shí)現(xiàn)求最大公約數(shù)和最小公倍數(shù)的相關(guān)資料,需要的朋友可以參考下
    2017-05-05
  • C++List容器常用函數(shù)接口刨析

    C++List容器常用函數(shù)接口刨析

    最近我學(xué)習(xí)了C++中的STL庫(kù)中的list容器,對(duì)于常用容器,我們不僅要會(huì)使用其常用的函數(shù)接口,我們還有明白這些接口在其底層是如何實(shí)現(xiàn)的。所以特意整理出來(lái)一篇博客供我們學(xué)習(xí)
    2022-08-08
  • 在clion上配置libtorch開發(fā)環(huán)境的圖文詳解

    在clion上配置libtorch開發(fā)環(huán)境的圖文詳解

    這篇文章主要介紹了在clion上配置libtorch開發(fā)環(huán)境的圖文詳解,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-11-11
  • C語(yǔ)言課程設(shè)計(jì)之停車場(chǎng)管理問(wèn)題

    C語(yǔ)言課程設(shè)計(jì)之停車場(chǎng)管理問(wèn)題

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言課程設(shè)計(jì)之停車場(chǎng)管理問(wèn)題,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-03-03

最新評(píng)論

西宁市| 新郑市| 扎赉特旗| 黔江区| 永济市| 宣城市| 拜泉县| 任丘市| 宣化县| 隆德县| 昌平区| 九江县| 商洛市| 吉水县| 藁城市| 鄯善县| 肇庆市| 曲水县| 南丹县| 肃宁县| 铜鼓县| 开平市| 佛冈县| 崇文区| 北辰区| 手机| 清镇市| 灵山县| 阳西县| 天全县| 茶陵县| 子洲县| 静宁县| 泾阳县| 禹城市| 嘉黎县| 双鸭山市| 安岳县| 白沙| 武陟县| 盱眙县|