经济金融论文| 计算机论文| 电子信息论文| 社会哲学论文| 新闻传媒论文| 机械工程论文| 农林经济论文| 自动控制论文| 管理科学论文| 通信技术论文| 法律论文
土木工程论文| 道路桥梁论文| 施工技术论文| 物流营销论文| 电力电气论文| 项目管理论文| 会计审计论文| 公共管理论文| 教育教学论文| 能源动力论文| 英语论文
我的登陆
用户名
密  码
 站内搜索:
 
 
 

【推荐】图形模式下的俄罗斯方块游戏-C语言
[发布日期]2008-11-9  [浏览次数]266

/*程序功能:C图形模式下的俄罗斯方块游戏.
*作者:漏网之鱼
*日期:20080123
*版本:V2.00
*包含:Mover.h
*注释:
*这个程序是完善了一下去年在学校的一个作业,可能还有些bug.
*我愿意现在停下来是因为我觉得继续下去我也不会学到太多东西.
*还可以加一些功能,比如说计分,以及提示.但大伙都明白,那些没
*有什么技术含量.非常简单,几乎不需要计算.我也留了右半边的
*空白.如果你发现有更好的实现,我十分愿意知道,并且会十分感谢,
*请mail:zhponly@gmail.com
*/
#include<stdio.h>
#include <graphics.h>
#include <stdlib.h>
#include <dos.h>
#include"Mover.h"
#define LEFT 0x4b00
#define RIGHT 0x4d00   
#define DOWN 0x5000
#define UP 0x4800
#define ESC 0x011b
#define STEP 20
int key;         /*记录按键值*/
const int switchlist[19][2]={1,2,2,1,3,4,4,3,5,6,6,5,7,8,8,9,9,10,10,7,11,12,12,13,13,14,14,11,15,15,16,18,17,16,18,19,19,17};
/*一个常量的转义表,每次按下转换键,都会依本表进行转换,共有十九种不同的方块*/
long int delaytime=123456;    /*迟延时间*/
int stateNum;          /*状态序号,大于等于一,小于等于十九*/
static int i=0;         /*表示一个方块变换的行数*/
static int li=0;         /*记录左移的次数*/
static int ri=0;         /*记录右移的次数*/
int sRecder[22][12]={0};     /*记录整个画面的数组,它的值代表方块的有无及颜色*/
void Init(void);         /*初使化函数*/
void Close(void);        /*关闭图形界面*/
void GameOver(void);       /*游戏结束提示*/
void GamePlay(void);       /*游戏运行过程函数*/
void DrawRec(void);       /*画方块的函数*/
void InitDraw(void);       /*初使化的一些画线*/
void SwitchIt(int);       /*把一个方块由代表数字转变为参数*/
int BorderTestL(int);      /*检查是否到了左边界*/
int BorderTestR(int);      /*检查是否到了右边界*/
int HaveFallen(int);       /*检查是否到了底边*/
void CheckFull(int);       /*检查一行是否已经满*/
void RecordIt(int,int);     /*记录方块的位置*/
void TestServer(void);      /*辅助调试的一个函数,打印sRecder数组的所有值.*/
int TestOver(void);       /*检查是否到最上面一行,游戏是否结束*/
void LineIt(void);        /*如其名字所示,画线*/
int main()
{
Init();
GamePlay();           /*主函数比较简单*/
GameOver();
Close();
}
void GamePlay(void)
{
cleardevice();
InitDraw();
LineIt();           /*初使化画几条线*/
while(1)
   {
    int o=TestOver();
    if(o)
    break;
    if(ESC==key)
    break;
    srand(time(NULL));   /*不停地产生方块直到抵达最高一行或按下ESC*/
    stateNum=rand()%19+1;
    SwitchIt(stateNum);
    DrawRec();
    }
}
int first,second,third,forth,matchColor,j;
/*四个参数表示每个方块由四个正方形组成,其值代表初使位置.每种方块有不同颜色,j为循环用*/
void DrawRec()
{
while(1)
{
int notBorderR,notBorderL,fallen=0;
while((!kbhit())&&(!fallen))
     {
     DrawSqu(first+12*i,matchColor);
     DrawSqu(second+12*i,matchColor);
     DrawSqu(third+12*i,matchColor);
     DrawSqu(forth+12*i,matchColor);
     delay(delaytime);
     DrawSqu(first+12*i,9);     /*画一个方块,一定时间后,用背景色画一个*/
     DrawSqu(second+12*i,9);    /*然后在它的下面再画一下,表示它是下降的*/
     DrawSqu(third+12*i,9);
     DrawSqu(forth+12*i,9);
     InitDraw();
     i++;
     fallen=HaveFallen(i-1);
     if(fallen)
      {
      DrawSqu(first+12*(i-1),matchColor);
      DrawSqu(second+12*(i-1),matchColor);
      DrawSqu(third+12*(i-1),matchColor);
      DrawSqu(forth+12*(i-1),matchColor);
      RecordIt(i-1,matchColor);  /*停了以后,把数组中相应位置写为该块的颜色值*/
      break;
      }
     }
  if(fallen)
    {
    li=0;
    ri=0;
    CheckFull(i-1); /*检查一下是否一行满,准备下一方块*/
    break;
    }
  key=bioskey(0);
  notBorderR=BorderTestR(i-1);
  notBorderL=BorderTestL(i-1);
  if(UP==key)
   {
    for(j=1;j<20;j++)
     {
      if(switchlist[j][0]==stateNum)
       {
        stateNum=switchlist[j][1];
        SwitchIt(switchlist[j][1]);
        first=first-ri+li;
        second=second-ri+li;    /*如果变换,则在相应位置出现变换以后的块*/
        third=third-ri+li;
        forth=forth-ri+li;
        DrawRec();
        break;
       }
     }
    }
  else if((RIGHT==key)&&(notBorderR))
    {
    first++;
    second++; /*如果该块右边没有边界或其它块,可以右移*/
    third++;
    forth++;
    ri++;
    }
  else if((LEFT==key)&&(notBorderL))
    {
    first--;
    second--;
    third--;  /*如果该块左边没有边界或其它块,可以左移*/
    forth--;
    li++;
    }
  else if(ESC==key)
    {
    break;   /*按ESC退出*/
    }  
if(fallen)
break;
}
i=0;
}
/*********************************************************************************************************/
/*Mover.h*/
#define STEP 20
#define Irow 40
#define Iline 40
#define Erow 280
#define Eline 480
/*以上是对图形初使化时用的一组数据*/
extern long int delaytime;
extern int key;
extern int matchColor;
extern int first;
extern int second;
extern int third;
extern int forth;
extern int sRecder[22][12];
void DrawSqu(int a,int b);
void DisSqu(int a,int b);
void Changer(int);
void LineIt(void);
void Init(void)
{   
  int n;
  int gd=DETECT,gm;
  registerbgidriver(EGAVGA_driver);
  initgraph(&gd,&gm,"f:\\tc");
  cleardevice();
  setbkcolor(9);
  setlinestyle(SOLID_LINE,0,THICK_WIDTH);
  printf("\n\n\n\n\n\n\n\n\n\n\n\n\t\t\t Powered by Library of Hitwh");
  for(n=0;n<5;n++)
   delay(delaytime);
}
/*上面的函数初使化,宣传一下我们学校:-)*/
void GameOver(void)
{
  getch();
  cleardevice();    /*结束游戏*/
  setcolor(12);
  settextstyle(0,0,4);
  outtextxy(200,200,"GAMEOVER");
}
void Close(void)
{  
  getch();
  closegraph();    /*关闭图形界面*/
}
void InitDraw(void)
{
setcolor(7);           /*初使化*/
rectangle(Irow,Iline,Erow,Eline);
}
void DrawSqu(int position,int color)
{
int line,num;
setfillstyle(1,color);
line=position/12;     /*把数据转换成行列值,用相就颜色画出*/
num=position%12;
bar3d(Irow+num*STEP,Iline+line*STEP,Irow+STEP+num*STEP,Iline+STEP+line*STEP,2,2);
}
void DisSqu(int position,int color)
{
int line,num;
setfillstyle(1,color);   /*把数据转换成行列值,用相就颜色画出*/
line=position/12;
num=position%12;
bar(Irow+num*STEP,Iline+line*STEP,Irow+STEP+num*STEP,Iline+STEP+line*STEP);
}
int BorderTestL(int i)
{
int recI,recS,recT,recF;
if((first)&&(second%12)&&(third%12)&&(forth%12))
  {
  recI=sRecder[i+first/12][first%12-1];
  recS=sRecder[i+second/12][second%12-1];
  recT=sRecder[i+third/12][third%12-1];
  recF=sRecder[i+forth/12][forth%12-1];
  if((recI)||(recS)||(recT)||(recF))
    return 0;
  return 1;
  }       /*如果到了最左边或左边有方块,则为真*/
return 0;
}
int BorderTestR(int i)
{
int recI,recS,recT,recF;
if(((first+1)%12)&&((second+1)%12)&&((third+1)%12)&&((forth+1)%12))
  {
   recI=sRecder[i+first/12][first%12+1];
   recS=sRecder[i+second/12][second%12+1];
   recT=sRecder[i+third/12][third%12+1];
   recF=sRecder[i+forth/12][forth%12+1];
   if((recI)||(recS)||(recT)||(recF))
    return 0;
   return 1;
   }      /*感觉这个和上个函数可以用不同参数调用同一函数,唉...*/
return 0;
}
int HaveFallen(int i)
{
int unfall,recI,recS,recT,recF;
unfall=21-(forth/12+i);
recI=sRecder[i+1+first/12][first%12];
recS=sRecder[i+1+second/12][second%12];
recT=sRecder[i+1+third/12][third%12];
recF=sRecder[i+1+forth/12][forth%12];
if((!unfall)||(recI)||(recS)||(recT)||(recF))
return 1;
return 0;    /*本来只用一个函数可以的,我用了三个,好理解些吧*/
}
void CheckFull(int i)
{
int state,isFull=1;
for(state=0;state<12;state++)
  {
   if(0==sRecder[state])
   isFull=0;
   }
if(isFull)
Changer(i);           /*这个得得多费些口舌,如果first和second是同一行*/
isFull=1;            /*消去一次就可以了*/
for(state=0;state<12;state++)
  {
  if(0==sRecder[i+second/12][state])
  isFull=0;
  }
if(isFull)
Changer(i+second/12);
isFull=1;
for(state=0;state<12;state++)
  {
  if(0==sRecder[i+third/12][state])
  isFull=0;
  }          /*在一行十二个正方形中,如果有一个为空,则该行不为满*/
if(isFull)
Changer(i+third/12);
isFull=1;
for(state=0;state<12;state++)
  {
  if(0==sRecder[i+forth/12][state])
  isFull=0;
  }
if(isFull)
Changer(i+forth/12);
}
void Changer(int i)
{
int l,m;
LineIt();
/* printf("changer has been called and i is %d\n",i);本句调试用*/
for(m=0;m<12;m++)
  DrawSqu(12*i+m,9); /*先用背景色把该行画去*/
for(l=i;l>0;l--)    /*这儿不能到第0行,唉,耗了我不少时间*/
  {
   for(m=0;m<12;m++)
    {
     DrawSqu(l*12+m,9);
     sRecder[l][m]=sRecder[l-1][m]; /*根据上一行情况画本行的正方形*/
     if(sRecder[l][m])
      DrawSqu(l*12+m,sRecder[l][m]);
    }
  }
}
void RecordIt(int i,int color)
{
sRecder[first]=color;
sRecder[i+second/12][second%12]=color;
sRecder[i+third/12][third%12]=color;  /*用该方块颜色值记录之*/
sRecder[i+forth/12][forth%12]=color;
}
void TestServer()
{
int a,b;
for(a=0;a<12;a++)
  {                /*调试用函数*/
   for(b=0;b<22;b++)
    {
    printf("%d",sRecder[a]);
    }
  printf("\n");
  }
getch();
}
int TestOver()
{
int t,o;
for(t=0;t<12;t++)
   if(sRecder[0][t])
    o=1;
o=0;           /*第0行有方块,游戏结束*/
return o;
}
void LineIt()
{
int x,y;
for(x=0;x<12;x++)
   for(y=0;y<22;y++)
     DrawSqu(12*y+x,9);
}
void SwitchIt(int n)
{                /*转换表*/
switch (n)
{
case 1:
   first=4;second=5;third=6;forth=7;
   matchColor=5;
   break;
case 2:
   first=5;second=17;third=29;forth=41;
   matchColor=5;
   break;
case 3:
   first=5;second=6;third=16;forth=17;
   matchColor=6;
   break;
case 4:
   first=5;second=17;third=18;forth=30;
   matchColor=6;
   break;
case 5:
   first=6;second=17;third=18;forth=29;
   matchColor=10;
   break;
case 6:
   first=5;second=6;third=18;forth=19;
   matchColor=10;
   break;
case 7:
   first=5;second=17;third=28;forth=29;
   matchColor=11;
   break;
case 8:
   first=5;second=6;third=7;forth=17;
   matchColor=11;
   break;
case 9:
   first=5;second=6;third=18;forth=30;
   matchColor=11;
   break;
case 10:
   first=7;second=17;third=18;forth=19;
   matchColor=11;
   break;
case 11:
   first=6;second=18;third=29;forth=30;
   matchColor=13;
   break;
case 12:
   first=5;second=17;third=18;forth=19;
   matchColor=13;
   break;
case 13:
   first=5;second=6;third=17;forth=29;
   matchColor=13;
   break;
case 14:
   first=5;second=6;third=7;forth=19;
   matchColor=13;
   break;
case 15:
   first=5;second=6;third=17;forth=18;
   matchColor=2;
   break;
case 16:
   first=5;second=17;third=18;forth=29;
   matchColor=14;
   break;
case 17:
   first=6;second=17;third=18;forth=19;
   matchColor=14;
   break;
case 18:
   first=5;second=6;third=7;forth=18;
   matchColor=14;
   break;
case 19:
   first=6;second=17;third=18;forth=30;
   matchColor=14;
}
}

www.51xueshu.com

      
 
  论文搜索  
  最近更新  
贸易营销学术课题 上海交通大学营销专业毕业论文选题
管理类学术课题 天津理工大学高自考本科项目管理专..
管理类学术课题 北京航空航天大学上海学习中心20..
电子信息类学术课题 【推荐】图形模式下的俄罗斯方块游..
电子信息类学术课题 【推荐】图形模式下的俄罗斯方块游..
电子信息类学术课题 【推荐】微宏观经济学好书推荐(从..
管理类学术课题 点评英国大学的经济系
管理类学术课题 【推荐】国内外统计相关网址
法律类学术课题 【推荐】法律网站大全
电子信息类学术课题 提供10个重要的算法C语言实现源..
机电类学术课题 三相异步电动机常见故障分析与处理
机电类学术课题 PLC系统故障分类和故障诊断
  代写导读  
 

    代写论文网提供最专业的论文服务,凭借深厚的专业知识和丰富的写作经验,为您提供一个专业的论文服务平台。     代写承诺:我们不会在未提供给您关于您课题任何资料和思路前收取任何定金,本站会给你一个关于您课题满意的规划和思路。在您接受本站服务的过程中,我们负责给您提供服务直至您满意为止,包括后期免费修改、免费指导答辩等,让您知道所以然。

  服务优势  

    (一) 组成人员实力强,学术层次高,不仅仅提供一篇论文,而是一个论文服务,来更合适你自己的背景和情况。
    (二) 专业性强,提供的专业论文不是空谈泛谈,不空洞,更切合您学科发展方向。
    (三) 论文原创性强,不是组合,拼凑,剽窃而来,是思想和你的背景结合而来。
    (四) 时间响应快,适合处理急活、难活。

 
 
友情链接         代写论文   论文代写   上海论文代写   北京论文代写   硕士论代写文   本科论文代写   职称论文代写   无忧学术网   无忧论文网
 
 
 


客服电话:15901884694(全天) QQ在线客服:228257100 410838131 在线MSN:paper-designer@hotmail.com 网站地图
邮箱:paperdesigner@yahoo.cn(国内客户) ; paper-designer@hotmail.com(国外客户)    地址(上海):中国·上海·华山路 邮编:200030     
  
版权所有(2006-2009)  论文代写网(专业代写论文,提供各类论文代写服务)    沪ICP 20070768号   map    友情链接  自助链接