当时在大一下学期学习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系统特别编写。
注意:要在windows xp下运行 如果想在windows7或8下通过Dosbox运行 需要自行修改方块的下降速度 自己修改下源代码就行了) ">俄罗斯方块游戏课程设计 用c语言在TC的图形界面下实现 设计文档(设计思想 算法描述 ...
俄罗斯方块游戏代码(DOS下TurboC2.0编译)
简单的C语言基础制作的俄罗斯方块 完整代码都在txt里面 可以直接编译 链接 运行
经典的俄罗斯,怀旧的dos游戏,解压后直接运行即可,WINDOWS下可运行DOSBOX来模拟DOS环境运行
/* 定义俄罗斯方块的方向(我定义他为4种)*/ #define F_DONG 0 #define F_NAN 1 #define F_XI 2 #define F_BEI 3 #define NEXTCOL 20 /* 要出的下一个方块的纵坐标*/ #define NEXTROW 12 /* 要出的下一个...
俄罗斯方块,程序,DOS游戏,WINDOWSXP
C语言实例 (贪吃蛇,俄罗斯方块,扫雷,学生管理系统)包括源代码 和编译后的文件 和可运行的。exe
dos版的俄罗斯方块 /*定义常量*/ #define MAX_BOX 19 /*总共有19种各形态的方块*/ #define BSIZE 20 /*方块的边长是20个象素*/ #define Sys_x 160 /*显示方块界面的左上角x座标*/ #define Sys_y 25 /*显示方块界面的...
俄罗斯方块游戏课程设计 用c语言在TC的图形界面下实现 设计文档(设计思想 算法描述 用到的数据结构和功能介绍)和源代码(加注释)齐全 游戏有四个主模块:新游戏 上次游戏 排行榜和退出游戏 注意:要在windows ...
3种模式中游戏功能均由3个核心cpp文件(block.cpp allblocks.cpp terix.cpp),提供旋转,左右移动,直接下移到底,查看下一个方块等功能,3个文件仅包含iostream time.h 2个额外头文件,可轻松移植到任何C++ 图形...
自己大二时候写的 ,功能不是很全,对于刚学习C的可能有帮助,可以看看dos下的作图函数,和简单游戏设计的基本思路,呵呵
俄罗斯方块程序原代码,C语言程序,DOS游戏
自己以前用C写的一个俄罗斯方块游戏源代码 纯DOS游戏,完美按俄罗斯方块规则实现游戏功能。
游戏功能均由3个核心cpp文件(block.cpp allblocks.cpp terix.cpp),提供旋转,左右移动,直接下移到底,查看下一个方块等功能 自动下移功能通过线程同步中的Windows API函数CreateWaitableTimer等实现 图形显示...
今年刚毕业的,自从学习C语言以来,一直有一个小小的愿望——“自己动手写一个俄罗斯方块”,今天终于实现了,查了很多资料,包括DOS下的编程、SDL、OPENGL等等,最后还是确定用Windows API来做,刚好要学习Windwos...