应用程序在第二楼有下载
俄罗斯方块的源代码:
#包含 “习语言系统.接口”
#包含 “习语言视窗.接口”
#定义 宽 14 //游戏区域宽度
#定义 高 26 //游戏区域高度
#定义 宽1 6 //右边状态栏宽度
#定义 边长 25 //游戏方格边长
#定义 甲 6 //放置照片的纵坐标
#定义 乙 12 //分数显示栏顶端纵坐标
#定义 丙 15 //等级显示栏顶端纵坐标
#定义 丁 21 //帮助栏顶端纵坐标
#定义 初始横坐标 宽 除 2-1 //游戏方块初始状态左上角横坐标
#定义 初始纵坐标 1 //初始状态左上角纵坐标
#定义 背景颜色 红绿蓝(255,255,255)
#定义 前景颜色 红绿蓝(255,153,204) //粉红
#定义 红色 红绿蓝(255,0,0)
#定义 橘色 红绿蓝(250,128,10)
#定义 黄色 红绿蓝(255,255,0)
#定义 绿色 红绿蓝(0,255,0)
#定义 灰色 红绿蓝(0,255,255)
#定义 亮绿色 红绿蓝(0xA6,0xCA,0xF0)
#定义 粉色 红绿蓝(255,0,255)
#定义 产生新方框 视窗消息_用户 加 1 // 消息ID,产生新的【方块】
整数类型 得分=0,等级=0,等级跨度=100; //分数等级以及每等级所需分数的定义及初始化
整数类型 顶=高-1; //最顶端的纵坐标
整数类型 横坐标,纵坐标; //方块当前位置的横坐标及纵坐标
整数类型 当前方块编号,下个方块编号;
结构类型 板块
{
整数类型 状态; //状态,1代表已被占用,0代表未被占用
整数类型 颜色; //颜色
}板[高][宽]; //定义游戏主板,H行N列
结构类型 区块
{
整数类型 方块形状[4][2]; //定义方块形状的数组
整数类型 颜色; //方块颜色
整数类型 下一个; //下一个方块的号码
};
结构类型 区块 游戏方块[19]=
{ //初始化各个游戏方块
{1,1,1,2,1,3,2,3,红色,1},
{0,2,1,2,2,2,0,3,红色,2},
{0,1,1,1,1,2,1,3,红色,3},
{2,1,0,2,1,2,2,2,红色,0},
{1,1,1,2,0,3,1,3,橘色,5},
{0,1,0,2,1,2,2,2,橘色,6},
{1,1,2,1,1,2,1,3,橘色,7},
{0,2,1,2,2,2,2,3,橘色,4},
{1,1,0,2,1,2,2,2,黄色,9},
{1,1,1,2,2,2,1,3,黄色,10},
{0,2,1,2,2,2,1,3,黄色,11},
{1,1,0,2,1,2,1,3,黄色,8},
{1,1,1,2,2,2,2,3,绿色,13},
{1,2,2,2,0,3,1,3,绿色,12},
{2,1,1,2,2,2,1,3,灰色,15},
{0,2,1,2,1,3,2,3,灰色,14},
{1,0,1,1,1,2,1,3,亮绿色,17},
{0,2,1,2,2,2,3,2,亮绿色,16},
{1,1,2,1,1,2,2,2,粉色,18},
};
无类型 进行绘画(画笔类型 画笔) //此函数用于初始化界面
{
整数类型 计数1,计数2;
画笔类型 画笔1; //定义画笔,用于绘制分隔线
画刷类型 画刷;//定义画刷并赋初值,画刷颜色采用背景色
图形获取画笔(&画笔1);
画笔1.颜色 = 前景颜色;
画笔1.风格 = 0;
图形设置画笔(&画笔1);
图形画线(宽*边长,0,宽*边长,高*边长);
图形获取画刷(&画刷);
画刷.颜色=背景颜色;
图形设置画刷(&画刷);
图形设置背景色(背景颜色);
步进循环(计数1=1;计数1 小于 高-1;计数1 加加 ) //绘制游戏区域方格线
步进循环(计数2=1;计数2 小于 宽-1;计数2 加加 )
图形画方框(计数2*边长,计数1*边长,(计数2 加 1)*边长,(计数1 加 1)*边长);
步进循环(计数1=1;计数1 小于 5;计数1 加加 ) //绘制右边状态栏游戏预览区域方格线
步进循环(计数2=宽 加 1;计数2 小于 宽 加 宽1-1;计数2 加加 )
图形画方框(计数2*边长,计数1*边长,(计数2 加 1)*边长,(计数1 加 1)*边长);
图形画方框(边长,边长,(宽-1)*边长, (高-1)*边长);
图形画方框((宽 加 1)*边长,乙*边长,(宽 加 宽1-1)*边长,(乙 加 2)*边长); //绘制分数栏方格线
图形画方框((宽 加 1)*边长,丙*边长,(宽 加 宽1-1)*边长,(丙 加 2)*边长); //绘制等级栏方格线
图形画方框((宽 加 1)*边长,丁*边长,(宽 加 宽1-1)*边长,(丁 加 4)*边长); //绘制帮助栏方格线
图形输出文字((宽 加 2)*边长,(乙 加 0.2)*边长,“分数”); //输出文字
图形输出文字((宽 加 2)*边长,(丙 加 0.2)*边长,“等级”); //同上
}
无类型 显示分数(【HDC hdc】) //显示分数的函数
{
字符类型 分数字符[4]; //定义字符串用于保存分数值
格式化(分数字符,20,“%3整”,得分); //将数字score转换成字符串后保存到score_str之中
图形输出文字((宽 加 2.5)*边长,(乙 加 1.2)*边长,分数字符); //在游戏板上显示分数
}
无类型 显示等级(【HDC hdc】) //显示等级的,具体同上
{
字符类型 等级字符[4];
格式化(等级字符,20,“%3整”,等级);
图形输出文字((宽 加 2.5)*边长,(丙 加 1.2)*边长,等级字符);
}
无类型 显示帮助(【HDC hdc】) //显示帮助的,该函数只在初始化界面时调用
{
字符类型 帮助1[]=“↑ - 旋转”,
帮助2[]=“↓ - 下移”,
帮助3[]=“← - 左移”,
帮助4[]=“→ - 右移”;
图形输出文字((宽 加 1.8)*边长,(丁 加 0.2)*边长,帮助1);
图形输出文字((宽 加 1.8)*边长,(丁 加 1.2)*边长,帮助2);
图形输出文字((宽 加 1.8)*边长,(丁 加 2.2)*边长,帮助3);
图形输出文字((宽 加 1.8)*边长,(丁 加 3.2)*边长,帮助4);
}
无类型 擦除方块(画笔类型 画笔,整数类型 横坐标,整数类型 纵坐标,整数类型 编号)
{
整数类型 计数1;
画笔类型 画刷;
图形获取画笔(&画刷);
画刷.颜色 = 背景颜色;
图形设置画笔(&画刷);
步进循环(计数1=0;计数1 小于 4;计数1 加加 ) //用背景色填充方块所在区域,使方块隐藏
图形画矩形((横坐标 加 游戏方块[编号].方块形状[计数1][0])*边长,(纵坐标 加 游戏方块[编号].方块形状[计数1][1])*边长,
(横坐标 加 游戏方块[编号].方块形状[计数1][0] 加 1)*边长,(纵坐标 加 游戏方块[编号].方块形状[计数1][1] 加 1)*边长);
}
无类型 显示方块(画笔类型 画笔,整数类型 横坐标,整数类型 纵坐标,整数类型 编号) //显示(横坐标,纵坐标)处编号为编号,的方块
{
整数类型 计数1;
画刷类型 画刷;
图形获取画刷(&画刷);
画刷.颜色 = 红绿蓝(0,0,255);
图形设置画刷(&画刷);
步进循环(计数1=0;计数1 小于 4;计数1 加加 ) //显示方块的过程
图形画矩形((横坐标 加 游戏方块[编号].方块形状[计数1][0])*边长,(纵坐标 加 游戏方块[编号].方块形状[计数1][1])*边长,
(横坐标 加 游戏方块[编号].方块形状[计数1][0] 加 1)*边长,(纵坐标 加 游戏方块[编号].方块形状[计数1][1] 加 1)*边长);
进行绘画(画笔);
}
无类型 满行处理(画笔类型 画笔) //满行处理函数
{
整数类型 计数1,临时计数,计数2;
整数类型 区域_顶=顶;
整数类型 标识=0;
画刷类型 画刷;
图形获取画笔(&画笔);
画笔.颜色 = 背景颜色;
图形设置画笔(&画笔);
步进循环(计数1=纵坐标;计数1 小于 纵坐标 加 4;计数1 加加 ) //从 纵坐标 行开始,从上到下遍历游戏区域
{
如果(计数1 小于等于 0 或 计数1 大于等于 高-1) 继续; //越界了,就跳出本次循环
步进循环(计数2=1;计数2 小于 宽-1;计数2 加加 )
如果( 非 板[计数1][计数2].状态) 跳出; //一旦该行有一个为空,即跳出
如果(计数2 等于 宽-1) //找到满行了
{
步进循环(临时计数=计数1;临时计数 大于等于 顶;临时计数 减减 ) //重置游戏区域各个方格的状态,顶为最顶端,计数1为找到的满行
步进循环(计数2=1;计数2 小于 宽-1;计数2 加加 )
板[临时计数][计数2]=板[临时计数-1][计数2];
顶 加加 ;
得分 加等 10; //分数加10
标识=1; //标志符
}
}
如果(标识) //如果有满行,则重绘主板
{
步进循环(计数1=区域_顶;计数1 小于 纵坐标 加 4;计数1 加加 ) //原来的最顶端
{
如果(计数1 小于等于 0 或 计数1 大于等于 高-1) 继续; //越界了,就跳出本次循环
步进循环(计数2=1;计数2 小于 宽-1;计数2 加加 )
{
图形获取画刷(&画刷);
画刷.颜色 = 板[计数1][计数2].颜色;
图形设置画刷(&画刷);
图形画矩形(计数2*边长,计数1*边长,(计数2 加 1)*边长,(计数1 加 1)*边长);
}
}
如果(等级 不等于 得分 除 等级跨度) //这里是程序优化部分,也可省略
等级=得分 除 等级跨度;
显示分数(); //更新分数
显示等级(); //更新等级
}
}
无类型 改变游戏面板状态(无类型) //改变游戏主板的状态
{
整数类型 计数1;
步进循环(计数1=0;计数1 小于 4;计数1 加加 )
{
板[纵坐标 加 游戏方块[当前方块编号].方块形状[计数1][1]][横坐标 加 游戏方块[当前方块编号].方块形状[计数1][0]].状态=1; //状态置1,表示有方块填充
板[纵坐标 加 游戏方块[当前方块编号].方块形状[计数1][1]][横坐标 加 游戏方块[当前方块编号].方块形状[计数1][0]].颜色=游戏方块[当前方块编号].颜色;
}
}
整数类型 可否移动(无类型) //判断方块是否能移动
{
整数类型 计数1;
步进循环(计数1=0;计数1 小于 4;计数1 加加 )
如果(板[纵坐标 加 游戏方块[当前方块编号].方块形状[计数1][1]][横坐标 加 游戏方块[当前方块编号].方块形状[计数1][0]].状态) //如果该位置以及有方块填充,则不能移动
返回 0;
返回 1;
}
整数类型 定时器处理主函数(双字类型 定时器号)
{
返回 0;
}
整数类型 显示器消息主处理( 自然数类型 消息, 双字类型 参数1, 双字类型 参数2 );
整数类型 主函数( )
{
图形初始化显示器(“习语言 简单俄罗斯方块
by
花心胡萝卜”,(宽 加 宽1)*边长,(高)*边长,空指针,0,显示器消息主处理 );
图形打开显示器(0);
【====用户代码开始==】
图形初始化定时器(定时器处理主函数);
图形创建定时器(定时器1,500);
【====用户代码结束==】
图形等待显示器关闭(); //进入消息循环,处理视窗消息,消息代码中调用 图形关闭显示器(0) 关闭显示器,返回。
返回 0;
}
整数类型 显示器消息主处理( 自然数类型 消息, 双字类型 参数1, 双字类型 参数2 )
{
【====用户消息处理开始==】
//用户已经处理的消息,返回1,系统不再处理此消息,没处理的消息,返回0,让系统处理
整数类型 计数1,计数2;
整数类型 老方块编号; //用于保存之前的方块号
时间类型 时间;
画笔类型 画笔;//选择画刷,用背景色作画刷
图形获取画笔(&画笔);
画笔.风格 = 0;
图形设置画笔(&画笔);
分支(消息) //消息处理的过程
{
若等于 视窗消息_创建: ////当一个应用程序使用函数CreateWindow或CreateWindowEx来创建一个窗口时,
//系统将发送该消息给此新建窗口过程。该消息将在创建窗口之后,显示窗口
//之前发送该消息,该消息将在CreateWindow或CreateWindowEx函数返回之前发送。
步进循环(计数1=1;计数1 小于 高;计数1 加加 ) //初始化状态,讲两竖边状态初始化为1
板[计数1][0].状态=板[计数1][宽-1].状态=1;
步进循环(计数2=1;计数2 小于 宽-1;计数2 加加 ) //将最底部状态置1
板[高-1][计数2].状态=1;
步进循环(计数1=1;计数1 小于 高-1;计数1 加加 ) //将游戏区域状态置0
步进循环(计数2=1;计数2 小于 宽-1;计数2 加加 )
{
板[计数1][计数2].状态=0;
板[计数1][计数2].颜色=背景颜色;
}
时间 = 当前时间();
初始化随机数((自然数类型)当地时间(&时间));
当前方块编号= 取随机数() 模除 19; //赋初值
下个方块编号= 取随机数() 模除 19; //赋初值
横坐标=初始横坐标; //初始化方块横坐标
纵坐标=初始纵坐标; //初始化方块纵坐标
返回 1; //直接退出窗口过程函数
若等于 视窗消息_绘图: //绘制界面,当应用程序适用UpdateWindow刷新窗口时,第一次发送该消息
画笔.风格 = 0;
画笔.颜色 = 红绿蓝(0,0,255);
图形设置画笔(&画笔);
进行绘画(画笔);
显示分数(); //显示分数
显示等级(); //显示等级
显示帮助(); //显示帮助栏
显示方块(画笔,横坐标,纵坐标,当前方块编号); //显示游戏区域中的游戏方块
显示方块(画笔,宽 加 1,1,下个方块编号); //显示右边状态栏的游戏方块
返回 1;
若等于 视窗消息_定时到: //定时器消息,每0.5秒接受到一次
纵坐标 加加 ;
如果(可否移动()) //如果能移动,则擦除原来位置方块,显示新位置方块,相当于是方块下落
{
擦除方块(画笔,横坐标,纵坐标-1,当前方块编号);
显示方块(画笔,横坐标,纵坐标,当前方块编号);
}
否则 //如果不能移动,则到底了,纵坐标 恢复之前的值,并发送
产生新方框
产生新的方块
{
纵坐标 减减 ;
发送消息( 0,产生新方框,0,0);
}
返回 1;
若等于 视窗消息_键按下: //当按下键时,会发送该消息
分支((整数类型)参数1) //判断具体按下的键
{
若等于 0x26【VK_UP】:
老方块编号=当前方块编号; //保存当前方块号
当前方块编号=游戏方块[当前方块编号].下一个; //方块号变为下一个方块号
如果(可否移动())
{
擦除方块(画笔,横坐标,纵坐标,老方块编号);
显示方块(画笔,横坐标,纵坐标,当前方块编号);
}
否则
当前方块编号=老方块编号; //恢复之前的值
跳出;
若等于 0x28【VK_DOWN】:
纵坐标 加加 ;
如果(可否移动())
{
擦除方块(画笔,横坐标,纵坐标-1,当前方块编号);
显示方块(画笔,横坐标,纵坐标,当前方块编号);
}
否则
{
纵坐标 减减 ;
发送消息( 0,产生新方框,0,0);
}
跳出;
若等于 0x25【VK_LEFT】:
横坐标 减减 ; //横坐标减小1
如果(可否移动()) //如果能移动,则下移,不能移动则恢复之前坐标
{
擦除方块(画笔,横坐标 加 1,纵坐标,当前方块编号);
显示方块(画笔,横坐标,纵坐标,当前方块编号);
}
否则
横坐标 加加 ;
跳出;
若等于 0x27【VK_RIGHT】: //同上
横坐标 加加 ;
如果(可否移动())
{
擦除方块(画笔,横坐标-1,纵坐标,当前方块编号);
显示方块(画笔,横坐标,纵坐标,当前方块编号);
}
否则
横坐标 减减 ;
跳出;
}
返回 1;
若等于 产生新方框:
如果(顶 大于 纵坐标 加 游戏方块[当前方块编号].方块形状[0][1])
顶=纵坐标 加 游戏方块[当前方块编号].方块形状[0][1]; //确定最高点
改变游戏面板状态(); //改变游戏主板状态
满行处理(画笔); //满行处理
当前方块编号=下个方块编号;
横坐标=初始横坐标; //重置方块坐标
纵坐标=初始纵坐标;
画笔.颜色 = 前景颜色;
画笔.风格 = 0;
图形设置画笔(&画笔);
初始化随机数(取随机数());
下个方块编号=取随机数() 模除 19;
擦除方块(画笔,宽 加 1,1,当前方块编号); //清除右边状态栏的方块
显示方块(画笔,宽 加 1,1,下个方块编号); //显示右边状态栏的方块
显示方块(画笔,初始横坐标,初始纵坐标,当前方块编号); //显示游戏主板顶部方块
如果( 非 可否移动()) //刚移开始就不能移动,则结束程序退出
{
图形销毁定时器(定时器1);
消息框(“游戏结束了!”,“退出”,64);
}
返回 1;
若等于 视窗消息_销毁: //退出游戏
图形销毁定时器(定时器1);
返回 0;
}
【====用户消息处理结束==】
返回 0;
}