`
sylinx_yqg
  • 浏览: 139936 次
  • 性别: Icon_minigender_1
  • 来自: 福建 漳州
社区版块
存档分类
最新评论

dos平台下的俄罗斯方块游戏

阅读更多
当时在大一下学期学习c时和两位同学做的.这个也标志着我开始喜欢写程序.从中确实学到很多东西,感谢我的这些同学!========================================================================
      文件名:elsfk.c 和 elsfk.h

      文件描述:dos平台下的俄罗斯方块游戏(详见使用说明)
     
      开发工具:TURBOC2.0

      创建人:baojian yanqingguo  zuozhekui 2005年11月20日

      版本号:1.0

========================================================================



  
elsfk.c中包含开发此程序的原代码,elsfk.h是用来声明,所有代码在TURBOC2.0下调试通过。

本程序开发的难度在于没有图象库函数,所有的都是程序写作者自己写,采用的是直接读写视频
缓冲区的方法,大大加快了程序执行的效率。




/////////////////////////////////////////////////////////////////////////////



   在开发过程中分成两大模块:界面和方块的驱动。在这两个模块中用到了ROOM[14][22],NextFk,

totalscore,curscore作为两者的接口; 其中room[14][22]的值为0~7 ,分别对应7中方块颜色及背景

,NextFk值为1~7 下一个方块的样式,totalscore值为总得分,int curscore值为当前得分(100 300

500 1000),并且用showroom()对ROOM[14][22]进行扫描,ROOM[I][J]值为0,表示没有方块,这就将方

块的移动过程成功的显示在界面上来;




/////////////////////////////////////////////////////////////////////////////
开发的详细过程:

     在13模式下仿造WINDOWS的界面,在此曾对VB开发的界面配色进行分析,并用调色板相关的
      int palette(int index, int red, int green, int blue)(设置13H模式颜色调色板)

      int setpalette()函数配出需要的个种颜色。接下来写出在此图形模式下的图形库函数:

      int screen(char mode)(设置屏幕模式)

      int text(int cx, int cy, char *str, char c);(在03h和13h模式屏幕输出文本(单个字符))

      int pset(int x, int y, int color);(直接写视频缓冲区,即画点函数,
                                           首地址char far *p = (char far *(0x0a0000000L);)

      int pget(int x ,int y);(直接读视频缓冲区)

      void lineto(int x1,int y1,int x2,int y2,int color);(画直线函数,但不对称的直线处理不

好)

      void box(int x1,int y1,int x2,int y2,int color);(画框函数)

      void bkgroundset(int color);(背景设置函数)

      void fillflod(int x1,int y1,int x2,int y2,int color);(填充函数)

在这些图形函数下,有各种窗口组件(按钮,显示窗口,掌示台等);这些开发的组件结构良好,在屏幕

上的位置均用预定义设定坐标,只要改动均可对应的改变。如#define win1x 35  #define win1y 40 是

定义第一个窗口的坐标。
      对应的组件有如下函数:
      int showplat(int x,int y);(显示展示台),该函数画出方块的显示区域,为12*8 + 20*7像素



      void drawframe();(画框架)该函数用到前面的配色作出渐变的效果;

      int buttonset(int x1,int y1,int x2,int y2,int d,int *p);(显示按钮)int *p是保存汉字和

位图                                     的信; 

      int setbutton(int x1,int y1,int x2,int y2,char *p);(显示小按钮)上下左右,
                                     用来设置鼠标响应的区域;

      int showwindows(int x1,int y1,int x2,int y2);(显示分数的窗口);最后通过int

drawwidget()函                                    数画出各个组件。
      
       自此基本的界面已经出来;考虑到鼠标是一种重要的输入设备,在此程序中就加进来,下面是本

程序中用到的关于鼠标函数:
      static int xnow,ynow,button定义全局变量,保存鼠标此时的信息,方便对鼠标的操作;

      void initcursor();(鼠标的位图)


      void mousesetxy(int x,int y);(设置鼠标的XY)


      void on_mouse(int xnow,int ynow);(用来画鼠标,并保存鼠标所在地方的点的信息)


      void off_mouse(int xnow,int ynow);(将原来的鼠标隐藏,还原原来的点的值)


     int InitMs(void);(鼠标复位)

     int movemouse();(判断鼠标是否移动)

     int MouseRead();(读取鼠标新的信息)

     void button_press(int button,int *counter,int *x,int *y,int infor);(取得鼠标移动的信息

,INFOR为0是调用5,1时调用6号)后面通过该函数获得鼠标的移动距离


     int getinfor();(每次鼠标点击的信息,返回结果1-8为对应各个组件)

     程序通过一个死循环不断通过ovemouse()判断鼠标是否移动,是就off_mouse(int xnow,int ynow)


     on_mouse(int xnow,int ynow),并在此过程中通过getinfor()取得各种信息,实现对鼠标事件的响

应;
   
     下面是鼠标在本程序中用到的事件:
          各个组件对应的信息分别用1-8表示,当鼠标左键点击第一个按钮时(即1)被getinfor()捕获

,并返回其值,通过
        
       void dealclick();(处理每次的点击)

       void mousepast();(鼠标经过时引起的事件)

函数对对应的事件调用对应的函数进行处理,即dealclick()对对应的信息1开始游戏,
        其他的事件和此过程相同:
                 3----------------调用int changecolor(int color)函数实现换肤
                                       (即改变展示台的背景色)功能;
         
                 4----------------调用int screen(char mode)和exit(0)函数实现退出功能;

                 5----------------调用int getclick()(处理每次的点击)和void dealinput()(处

理键                                                                      盘和鼠标的输入)实

现变行的功能;

                 6----------------调用int getclick()(处理每次的点击)和void dealinput()(处

理键                                                                    盘和鼠标的输入)实现

左移的功能;

                 7----------------调用int getclick()(处理每次的点击)和void dealinput()(处

理键                                                                     盘和鼠标的输入)实

现右移的功能;

                
                 8----------------调用int getclick()(处理每次的点击)和void dealinput()(处

理键                                                                     盘和鼠标的输入)实

现移到底的功能;
                               
                 (具体过程可参考源程序)


          还有是拖动展示台和鼠标经过按钮浮动的效果通过以下函数实现

                      void mousepast();(鼠标经过时引起的事件)


                      void dragwindows()(拖动窗口)(详见源程序)

               
           下面是在开发过程中遇到鼠标方面的问题即解决方法:
              
               1. 鼠标热点的问题:为了让用户不至于盲点击按钮,我们采用到了对应按钮的热点即把

鼠标隐                                                        藏起来;
                                   
               2.鼠标一次点击停留的时间过长引起多次点击的问题:在程序中用到while()循环直到

鼠标的                                                         按键状态改变为止。(详见源程

序)



   具体的是:  用二维数组room[列][行](12列 20行),每一个数组单元对应于屏幕中的一个方块
   
                    更新屏幕时 就根据该二维数组的值来显示不同颜色的方块

         这样就使得 界面和内核基本只用数组room联系 将来如果要根改界面 或内核 都不用改变另一

半了
          
         旋转 int turn();
         方块的旋转部分 原设置了两个旋转方向 逆时针Left 顺时针Right 程序中采用了逆时针方向
        
            左旋则以左下角方块或空格的右上角为旋转中心

            右旋则以右下角方块或空格的左上角为旋转中心

         然后是下落部分的调整

           每次下落前都会留有一定时间,在这段时间内 可以旋转,左移或右移
  
           下落和旋转都是在数组room中进行的
 
           具体过程
              一般是先将方块在room中对应的单元置0
                 
              然后计算并测试 方块下一个位置,看看是否出界或与其它已有方块重叠
                 
              根据测试结果 来决定是恢复其在room中的值 还是在新位置写入颜色值

              最后更新屏幕显示

           其中 下落和左移 右移 采用函数int move(int dx, int dy);
         
              dx,dy分别 是指方块的运动方向的横向 和 纵向          
                
              其取值范围 dx为 -1, 0, 1  分别表示 左移 横向不动 右移
                        
                         dy 为 0, 1     分别表示 纵向不动 下移

方块的驱动:
           程序采用映射法每次更新屏幕中的每个方块 以便分工处理不同部分的程序块

      具体的是:  用二维数组room[列][行](12列 20行),每一个数组单元对应于屏幕中的一个方块
            更新屏幕时 就根据该二维数组的值来显示不同颜色的方块

            这样就使得 界面和内核基本只用数组room联系 将来如果要根改界面 或内核 都不用改变另

一半了
          
           旋转 int turn();
           方块的旋转部分 原设置了两个旋转方向 逆时针Left 顺时针Right 程序中采用了逆时针方向
        
           左旋则以左下角方块或空格的右上角为旋转中心

           右旋则以右下角方块或空格的左上角为旋转中心

           然后是下落部分的调整

           每次下落前都会留有一定时间,在这段时间内 可以旋转,左移或右移
  
           下落和旋转都是在数组room中进行的
 
      具体过程:
              一般是先将方块在room中对应的单元置0
                 
              然后计算并测试 方块下一个位置,看看是否出界或与其它已有方块重叠
                 
              根据测试结果 来决定是恢复其在room中的值 还是在新位置写入颜色值

              最后更新屏幕显示

              其中 下落和左移 右移 采用函数int move(int dx, int dy);
         
              dx,dy分别 是指方块的运动方向的横向 和 纵向          
                
              其取值范围 dx为 -1, 0, 1  分别表示 左移 横向不动 右移
                        
                         dy 为 0, 1     分别表示 纵向不动 下移



鼠标功能:

      右边八个按钮分别为:

            开始,暂停(只需移动鼠标到上面),改变展示台的颜色,退出游戏(均为鼠标左键);
   
             UP变形,DW快速下降,LF向左移动,RT向右移动;
   
      点击鼠标右键可以加上或去掉网格;


       展示台可以用鼠标左键拖动到其他地方;

键盘功能:
       ENTER 可以暂停;
       方向键用来控制方向;
       空格用来快速下降;


窗口说明:
        中间的为展示台,显示俄罗斯方块;
         左边的窗口分别为下一个方块的样式,总的得分,当前的得分(根据当前消去的行数来定);            
                
          
               

     
  • fk.rar (71.5 KB)
  • 描述: 源代码
  • 下载次数: 15
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics