`
sylinx_yqg
  • 浏览: 143404 次
  • 性别: 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
分享到:
评论

相关推荐

    Dos俄罗斯方块游戏

    【标签】"Dos俄罗斯方块游戏"再次强调了游戏的平台和类型。DOS作为标签,意味着游戏的运行环境;而俄罗斯方块是游戏的核心内容,是一款风靡全球的益智游戏,玩家需要通过旋转和排列下落的方块来消除行,以达到得分和...

    dos界面下的俄罗斯方块游戏

    dos界面下的俄罗斯方块游戏

    16位8086汇编实现DOS下汇编俄罗斯方块程序

    在8086汇编语言编程领域,创建一个在DOS环境下运行的俄罗斯方块程序是一项挑战性的任务,它涉及到大量的低级系统调用和内存管理。以下是对这个项目的详细解析: 1. **8086汇编语言**:8086是Intel公司推出的一种16...

    俄罗斯方块DOS版

    DOS版的《俄罗斯方块》则是将这个游戏经典移植到了早期个人电脑的操作系统——MS-DOS上,让玩家在那个年代也能享受到这款游戏的魅力。 在MS-DOS环境下,游戏通常以命令行界面运行,没有图形用户界面。《俄罗斯方块...

    DOS版俄罗斯方块源码

    在DOS版的俄罗斯方块游戏中,EasyX库可能被用来绘制游戏界面,包括方块、背景、得分和其他用户界面元素。 C++面向对象编程是这个项目的核心技术。面向对象编程(OOP)是一种编程范式,它将数据和操作数据的方法封装...

    C++纯DOS俄罗斯方块

    《C++纯DOS俄罗斯方块》是一款基于C++编程语言,在DOS环境下实现的经典游戏。这个项目的主要目的是为了在C++课程设计中提供一个简单的实践案例,帮助学习者理解和运用C++的基本语法以及控制台界面的游戏开发。下面将...

    Dos界面俄罗斯方块代码完整版

    此俄罗斯方块游戏是基于C语言编写的一个简易版本,可在DOS环境下运行。游戏的核心逻辑包括方块生成、移动、旋转以及消除满行等基本功能。 #### 二、全局变量定义 在代码中,定义了多个全局变量来存储游戏状态及...

    俄罗斯方块游戏代码(DOS下TurboC2.0编译)

    【标题】"俄罗斯方块游戏代码(DOS下TurboC2.0编译)"涉及到的知识点主要涵盖了两个核心领域:经典游戏开发和DOS环境下的编程语言——TurboC2.0。 首先,我们来讨论“俄罗斯方块”这款游戏。俄罗斯方块是一款由俄罗斯...

    俄罗斯方块游戏课程设计(TC下实现)

    注意:要在windows xp下运行 如果想在windows7或8下通过Dosbox运行 需要自行修改方块的下降速度 自己修改下源代码就行了) ">俄罗斯方块游戏课程设计 用c语言在TC的图形界面下实现 设计文档(设计思想 算法描述 ...

    俄罗斯方块程序,DOS游戏,

    《俄罗斯方块》最初就是在这样的环境下运行,玩家需要在DOS环境下启动游戏文件tetris.exe来开始游戏。DOS游戏通常对硬件要求较低,因此即使在当时的低配置电脑上也能流畅运行。 游戏的基本玩法是不同形状的方块从...

    俄罗斯方块游戏源代码

    【俄罗斯方块游戏源代码】是一个编程学习资源,包含了实现经典游戏俄罗斯方块的源代码。这个项目可能适合那些对游戏开发、C语言编程或图形界面设计感兴趣的IT初学者和爱好者。通过研究这些源代码,你可以了解到游戏...

    C语言俄罗斯方块 C语言 俄罗斯方块

    ### C语言实现的俄罗斯方块游戏解析 #### 一、项目背景与介绍 在学习编程的过程中,通过实际项目来理解编程语言的特点是非常重要的一个环节。本篇文档将深入解析一个用C语言编写的俄罗斯方滴游戏源代码。该源代码...

    c语言-俄罗斯方块小游戏

    《C语言实现的俄罗斯方块小游戏》 C语言是一种基础且强大的编程语言,它以其简洁、高效的特性在软件开发领域占据着重要的地位。本项目是一个使用C语言编写的俄罗斯方块小游戏,它展现了C语言在游戏开发中的应用,...

    C# 写的俄罗斯方块 超经典

    总的来说,这个“C#编写的俄罗斯方块”项目展示了C#在游戏开发中的应用,涵盖了面向对象编程、事件处理、图形界面设计和游戏逻辑实现等多个核心知识点。通过学习和分析这个项目,开发者不仅可以掌握C#编程技能,还能...

    els.rar_TC 俄罗斯方块_dos tc

    《TC版俄罗斯方块——dos系统下的经典游戏重现》 在电脑游戏发展的早期阶段,有一款游戏以其简单而富有挑战性的玩法风靡全球,那就是“俄罗斯方块”。它由俄罗斯程序员阿列克谢·帕基特诺夫在1984年创作,随后成为...

    C语言编写的俄罗斯方块游戏源码

    /* 定义俄罗斯方块的方向(我定义他为4种)*/ #define F_DONG 0 #define F_NAN 1 #define F_XI 2 #define F_BEI 3 #define NEXTCOL 20 /* 要出的下一个方块的纵坐标*/ #define NEXTROW 12 /* 要出的下一个...

Global site tag (gtag.js) - Google Analytics