⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 c语言版.txt

📁 游戏主类
💻 TXT
📖 第 1 页 / 共 2 页
字号:
    
       完整的程序请参见prog2.c、prog3.c。   
  prog2.c获取按键的按键码,按Escape键退出程序。   
  prog3.c根据不同的按键进行不同的操作,按Escape键退出程序。   
    
    
  怎样控制方块的移动?   
       方块移动的实现很简单,将方块原来的位置用背景色画一个同样大小的方块,将原来的方块涂去。然后在新的位置上重新绘制方块就可以   
  了。这样就实现了方块的移动。完整的程序请参见prog4.c。这个用方向键控制一个黄色的小方块在屏幕上上、下、左、右移动。这个程序用到了前面几个问题讲的内容,如果你有点忘了,还要回头看看哦。:)   
    
    
  怎样控制时间间隔(用于游戏中控制形状的下落)?   
       解决这个问题要用到时钟中断。时钟中断大约每秒钟发生18.2次。截获正常的时钟中断后,在处理完正常的时钟中断后,将一个计时变量   
  加1。这样,每秒钟计时变量约增加18。需要控控制时间的时候,只需要看这个计时变量就行了。   
    
    
       截获时钟中断要用到函数getvect()和setvect()。   
  两个函数的声明如下:   
  ?void   interrupt   (*getvect(int   interruptno))();   
  ?void   setvect(int   interruptno,   void   interrupt   (*isr)   (   ));   
    
    保留字interrupt指示函数是一个中断处理函数。在调用中断处理函数的时候,所有的寄存器将会被保存。中断处理函数的返回时的指令是iret,而不是一般函数用到的ret指令。   
    
  getvect()根据中断号interruptno获取中断号为interruptno的中断处理函数的入口地址。   
  setvect()将中断号为interruptno的中断处理函数的入口地址改为isr()函数的入口地址。即中断发生时,将调用isr()函数。   
    
    
       在程序开始的时候截获时钟中断,并设置新的中断处理。在程序结束的时候,一定要记着恢复时钟中断哦,不然系统的计时功能会出问题   
  的。具体演示程序请参见prog5.c。由于中断处理大家可能用的不多,所以我把prog5.c这个程序完整地贴在下面,并加上详细的解释。   
    
  
Top

7 楼mfs(玩命蚂蚁)回复于 2006-03-04 21:39:54 得分 0 /*   prog5.c   */   
  This   is   an   interrupt   service   routine.   You   can   NOT   compile   this   
  program   with   Test   Stack   Overflow   turned   on   and   get   an   executable   
  file   which   will   operate   correctly.   */   
    
  /*   这个程序每隔1秒钟输出一个整数,10秒钟后结束程序。   
  按escape键提前退出程序   。*/   
    
  #include   <stdio.h>   
  #include   <dos.h>   
  #include   <conio.h>   
    
  /*   Escape   key   */   
  #define   VK_ESC   0x11b     
    
  #define   TIMER   0x1c   /*   时钟中断的中断号   */   
    
  /*   中断处理函数在C和C++中的表示略有不同。   
  如果定义了_cplusplus则表示在C++环境下,否则是在C环境下。   */   
    
  #ifdef   __cplusplus   
  #define   __CPPARGS   ...   
  #else   
  #define   __CPPARGS   
  #endif   
    
  int   TimerCounter=0;   /*   计时变量,每秒钟增加18。   */   
    
  /*   指向原来时钟中断处理过程入口的中断处理函数指针(句柄)   */   
  void   interrupt   (   *oldhandler)(__CPPARGS);   
    
  /*   新的时钟中断处理函数   */   
  void   interrupt   newhandler(__CPPARGS)   
  {   
  /*   increase   the   global   counter   */   
  TimerCounter++;   
    
  /*   call   the   old   routine   */   
  oldhandler();   
  }   
    
  /*   设置新的时钟中断处理过程   */   
  void   SetTimer(void   interrupt   (*IntProc)(__CPPARGS))   
  {   
  oldhandler=getvect(TIMER);   
  disable();   /*   设置新的时钟中断处理过程时,禁止所有中断   */   
  setvect(TIMER,IntProc);   
  enable();   /*   开启中断   */   
  }   
    
  /*   恢复原有的时钟中断处理过程   */   
  void   KillTimer()   
  {   
  disable();   
  setvect(TIMER,oldhandler);   
  enable();   
  }   
    
    
  void   main(void)   
  {   
  int   key,time=0;   
    
  SetTimer(newhandler);   /*   修改时钟中断   */   
    
  for   (;;)   
  {   
  if   (bioskey(1))   
  {   
  key=bioskey(0);   
  if   (key==VK_ESC)   /*   按escape键提前退出程序   */   
  {   
  printf("User   cancel!\n");   
  break;   
  }   
  }   
  if   (TimerCounter>18)   /*   1秒钟处理一次   */   
  {   
  /*   恢复计时变量   */   
  TimerCounter=0;   
  time++;   
  printf("%d\n",time);   
  if   (time==10)   /*   10秒钟后结束程序   */   
  {   
  printf("Program   terminated   normally!\n");   
  break;   
  }   
  }   
  }   
  KillTimer();   /*   恢复时钟中断   */   
    
  }   
    
    
  游戏中的各种形状及整个游戏空间怎么用数据表示?   
    
  以后我提到的形状都是指下面七种形之一及它们旋转后的变形体。   
    
  □□□□   □□□□   □□□□   □□□□     
  □■□□   □■■□   □□□□   □□□□     
  □■□□   □■□□   □■□□   □■■□     
  □■■□   □■□□   ■■■□   ■■□□     
    
  □□□□   □■□□   □□□□     
  □□□□   □■□□   □□□□     
  ■■□□   □■□□   □■■□     
  □■■□   □■□□   □■■□     
    
  我定义了一个结构来表示形状。   
  struct   shape   
  {   
  int   xy[8];   
  int   color;   
  int   next;   
  }   
  -1   0   1   2   
  -3□□□□   
  -2□□□□   
  -1□□□□   
  0□■□□   
    
    所有的各种形状都可以放在4x4的格子里。假定第二列,第四行的格子坐标为(0,0)(如上图中黑块所示),则每个形状的四个方块都可以用4   
  个数对来表示。坐标x从左向右依次增加,y从上到下依次增加。表示的时候,组成该形状的四个方块从左到右,从上到下(不一定非要按这个顺   
  序)。如上面七种形状的第一个用数对来表示就是(-2,0)、(-1,0)、(0,0)、(1,0)。结构shape中的xy就是用来表示这4个数对的。为了简化程序,用一维数组xy[8]来表示。xy[0]、xy[1]表示第一个数对,xy[2]、xy[3]表示第二个数对,依次类推。   
       shape中的color表示形状的颜色,不同的形状有不同的颜色。七种形状及它们旋转后的变形体一共有19种形状,用一个全局数组表示。假定旋转的方向是逆时针方向(顺时针方向道理一样)。shape中的next就表示当前形状逆时针旋转后的下一个形状的序号。例如:第一种形状及其旋   
  转变形的形状用结构表示如下。   
    
  □□□□   □□□□   □□□□   □□□□     
  □■□□   □□□□   □■■□   □□□□     
  □■□□   □□■□   □□■□   ■■■□     
  □■■□   ■■■□   □□■□   ■□□□     
    
  

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -