俄罗斯方块的问题!

Roy T 2006-05-23 05:01:06

这两天我用纯C的纯字符界面实现的,就是在控制台打印ASCII码。

主体功能已经弄好了,但是有一个问题,C语言没有多线程,那么下落,和接收键盘改变方块的位置和形态,这两个本身应该是线程的东西,应该怎么放在一块儿呢,我的东西现在只能在原地不动,接收键盘输入来玩,有无限的时间考虑:)

用dos.h提供的delay()函数可以实现下落的延时,可岩石过程中进程是挂起的,因此不能接受键盘输入;用getch()接受键盘输入,进程是阻塞的,同时也不能实现自动下落。。郁闷。。似乎无解了。可我看到过有人做过C语言的俄罗斯方块啊(但是似乎都达不到游戏机上那种自由的效果,在移动的时候会有不该有的延时显得很生硬),

我有这么个想法:那就是循环一定的次数,每一次循环中使用bios.h中提供的bioskey()函数来接收键盘,没有输入就继续进行,如果有输入就等待循环结束,按输入移动方块。这样下落的延时就实现了,可是问题又来了,这样不停的算着程序太累了吧?而且速度会不稳定,而且我的编译器没有bios.h :(

哪位能给点儿建设性的意见,谢谢
...全文
235 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
iamdavid0123 2006-05-24
  • 打赏
  • 举报
回复
mark
nysst_hxl 2006-05-24
  • 打赏
  • 举报
回复
做一个循环,在循环里进行:物体下落、键盘检测。
由于计算机运行得非常快,所以人感觉起来,就好象物体下落、键盘检测在同时进行。

可以参考这个的程序,包括源代码及详细的设计图及说明文档。
http://myafx.yeah.net
zhaomu 2006-05-24
  • 打赏
  • 举报
回复
程序好像有问题
「已注销」 2006-05-23
  • 打赏
  • 举报
回复
我同学写的,看对你有冒得帮助:
/*键值由bioskey获得
程序如下
#include<dos.h>
main()
{
int key;
while(1) {
key=bioskey(0);
printf("0x%x\n",key);
}
}
*/
#define KeyUp 0x4800 /*旋转*/
#define KeyDown 0x5000 /*速降*/
#define KeyLeft 0x4b00 /*左移*/
#define KeyRight 0x4d00 /*右移*/
#define KeySpace 0x3920 /*降至底部*/
#define KeyEnter 0x1c0d /*暂停*/
#define KeyEsc 0x011b /*退出*/
#define F1 0x3b00 /*开局*/
#define F2 0x3c00 /*重新开局*/
#define F3 0x3d00 /*存贮进度*/

#define Up -1 /*上*/
#define Down 1 /*下*/
#define Left -1 /*左*/
#define Right 1 /*右*/
#define Still 0 /*静止*/
#define Ture 1
#define false 0

int i,j,k,t,m,CanMove,CanMoveDown;
int score;
int fkshape[7][4][2]={1,1,1,2,1,3,1,4
1,1,1,2,1,3,2,3
1,3,2,1,2,2,2,3
1,1,1,2,2,1,2,2
1,2,1,3,2,1,2,2
1,1,1,2,2,2,2,3
1,1,1,2,1,3,2,2
}; /*存储方块形状*/
int oldfk[2][4],newfk[2][4];/*存储方块位置 0->x 1->y*/
/*
[][][][]

[]
[][][]

[][]
[][]

[][]
[][]

[][]
[]
[]

[][]
[]
[]

[][]
[][]
*/
main()
{
do{
/*接收下一个方块值
nextfk;
并将其显示在主窗口
*/
/*以下为控制部分*/
do{
tim=biostime(0,tim);/*return the clock ticks since midnight (18.2/sec)*/
delaytim=tim+10;
do{
key=bioskey(0);
switch(key){
case KeyUp:
turn();
break;
case KeyDown:
move(Still, Down);
break;
case KeyLeft:
move(Left, Still);
break;
case KeyRight:
move(Right, Still);
break;
case KeySpace:
while(CanMoveDown){
move(Still, Down);
};
break;
case KeyEnter:
getch();
break;
case KeyEsc:
savegame();
exitgame();
break;
};
tim=biostime(0,tim);
}while(tim<delaytim);
/*下移方块并设置CanMoveDown*/

}while(CanMoveDown);
/*检查有没有可消除的行有则消除
得分:
一行 100
两行 200
三行 500
四行 1000
*/
/*从刚落下的方块的最低点所在的行开始
数出该行的方块数 如为12 则该行满可消除
向方块所落下的最高点逼近
直至这1~4行均处理完
*/
}while(1);
}

int move(int dx, int dy)
{
clearfk;
CanMove=Ture;
CanMoveDown=Ture;
/*依次检查新位置是否已存在方块 或墙壁 或地板*/

if(CanMove)moveit;
showfk;
}

int nextfk()
{
/*随机产生一个1到 7的数
确定是那种方块
并返回该值
*/
/*在next框中显示该方块*/
}

int turn()
{
clearfk;
CanMove=Ture;
/*计算出新位置*/
/*依次检查新位置是否已存在方块 或墙壁 或地板*/
/*如过 能转动则
clearfk;
newxy=oldxy;
showfk;
*/
}
【Java版俄罗斯方块】 增加保存配置信息到文件的功能,声音设置、显示设置、关卡选择等配置信息在修改后将会保存在jar包同级目录下(以jar相同的文件名+.cfg后缀保存) 2010-10-05 【Java版俄罗斯方块】 这个程序是用Java开发的,需要安装JRE,应该不会说了吧 运行方式,也应该不会说了吧 解压,tetris.zhh.1.1.jar --> 右键 --> 打开方式 --> 点Java有关的那个选项 或者 开始 --> 运行 --> cmd --> 转到解压目录 --> java -jar tetris.zhh.1.1.jar 【菜单选项】 也做了不少菜单选项 可自定义控制键,可设置单色彩色显示,可设置网格是否显示网格 关卡有三组选择: 标准关卡:难度中等,7种基本形状,共分2级,50000分一级,速度递增,下落一格的速度每2000分减少10毫秒 速度关卡:难度较大,7种基本形状,共分10级,10000分一级,速度快且随着分数的增加而递增 复杂性关卡:难度较大,共分10级,8000分一级,随着级别越高复杂度越来越大,会出现随机填充的障碍物,以及难以应付的复杂形状,到第4级以后会出现16种基本形状,够你难受的了 【已知Bug】 1. 偶尔会出在现形状下落的过程中形状的某一块没有被擦除掉,原因不明 可能原因为,程序在刷新视图时并没有全部擦除重画,只是根据形状在上一次的显示位置将这一小块重画了一个空块以覆盖 仔细测试过,后台明明执行了这个过程,视图却没有被擦除掉,不知是不是JDK的问题 2. 一直按住回车键,程序将在开始游戏和结束游戏之间不停切换,偶尔会出现蒙层未盖住形状的问题 蒙层:程序会在游戏暂停时蒙上一层淡蓝色,而在游戏停止时蒙上一层淡红色 【关于俄罗斯方块游戏】 游戏简介 俄罗斯方块是一款益智方块类游戏, 这款游戏最初是由苏联的电脑科学家帕吉特诺夫(Alex Pajitnov)于1985年制作的, 作者给了他一个源自希腊字4(tetra)的名字Tetris。 1989年由任天堂于发行GameBoy版,推出后风靡全球,成为益智方块类型游戏中知名度最高的一款。 它看似简单但却变化无穷,上手极其容易,但是要熟练地掌握其中的操作与摆放技巧,难度却不低。 玩法简介 游戏具有一个用于摆放小方块的平面虚拟场地, 一组由几个小方块组成的规则形状(Tetromino), 游戏每次随机输出一种形状到场地顶部,自动以一定的速度下落, 用户在形状的过程中可以控制形状的左右移动及旋转以将形状填充到场地中, 直至形状下落至场地底部或被场地中已有的方块阻挡而不能再下落, 游戏再次输出一个形状,周而复始。 如果这次填充将场地的一行或多行完全填满,则组成这些行的所有方块将被消除, 并且以此来换取一定的积分奖励, 而未被消除的方块会一直累积,并对后来的形状摆放造成各种影响, 如果下一个形状的输出位置已经被未消除的方块所占据,则游戏结束。

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧