c语言编程俄罗斯方块分类编程,[转贴]C语言-游戏编程-《俄罗斯方块》程序编写详解...

本文介绍如何在编程中实现方块移动,通过覆盖原位置并重新绘制来实现移动效果,并提供了示例代码prog4.c。此外,讲解了如何利用时钟中断控制时间间隔,详细阐述了中断处理函数的使用,包括getvect()和setvect()函数,以及如何截获和恢复时钟中断。示例程序prog5.c展示了每秒输出一个整数并在10秒后结束,同时允许用户通过Esc键提前退出。
摘要由CSDN通过智能技术生成

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼

怎样控制方块的移动?

方块移动的实现很简单,将方块原来的位置用背景色画一个同样大小的方块,将原来的方块涂去。然后在新的位置上重新绘制方块就可以

了。这样就实现了方块的移动。完整的程序请参见prog4.c。这个用方向键控制一个黄色的小方块在屏幕上上、下、左、右移动。这个程序用到了前面几个问题讲的内容,如果你有点忘了,还要回头看看哦。:)

怎样控制时间间隔(用于游戏中控制形状的下落)?

解决这个问题要用到时钟中断。时钟中断大约每秒钟发生18.2次。截获正常的时钟中断后,在处理完正常的时钟中断后,将一个计时变量

加1。这样,每秒钟计时变量约增加18。需要控控制时间的时候,只需要看这个计时变量就行了。

截获时钟中断要用到函数getvect()和setvect()。

两个函数的声明如下:

?void interrupt (*getvect(int interruptno))();

?void setvect(int interruptno, void interrupt (*isr) ( ));

保留字interrupt指示函数是一个中断处理函数。在调用中断处理函数的时候,所有的寄存器将会被保存。中断处理函数的返回时的指令是iret,而不是一般函数用到的ret指令。

getvect()根据中断号interruptno获取中断号为interruptno的中断处理函数的入口地址。

setvect()将中断号为interruptno的中断处理函数的入口地址改为isr()函数的入口地址。即中断发生时,将调用isr()函数。

在程序开始的时候截获时钟中断,并设置新的中断处理。在程序结束的时候,一定要记着恢复时钟中断哦,不然系统的计时功能会出问题

的。具体演示程序请参见prog5.c。由于中断处理大家可能用的不多,所以我把prog5.c这个程序完整地贴在下面,并加上详细的解释。

/* prog5.c */

This is an interrupt service routine. You can NOT compile this

program with Test Stack Overflow turned on and get an execu

file which will operate correctly. */

/* 这个程序每隔1秒钟输出一个整数,10秒钟后结束程序。

按escape键提前退出程序 。*/

#include

#include

#include

/* Escape key */

#define VK_ESC 0x11b

#define TIMER 0x1c /* 时钟中断的中断号 */

/* 中断处理函数在C和C 中的表示略有不同。

如果定义了_cplusplus则表示在C 环境下,否则是在C环境下。 */

#ifdef __cplusplus

#define __CPPARGS ...

#else

#define __CPPARGS

#endif

int TimerCounter=0; /* 计时变量,每秒钟增加18。 */

/* 指向原来时钟中断处理过程入口的中断处理函数指针(句柄) */

void interrupt ( *oldhandler)(__CPPARGS);

/* 新的时钟中断处理函数 */

void interrupt newhandler(__CPPARGS)

{

/* increase the global counter */

TimerCounter ;

/* call the old routine */

oldhandler();

}

/* 设置新的时钟中断处理过程 */

void SetTimer(void interrupt (*IntProc)(__CPPARGS))

{

oldhandler=getvect(TIMER);

disable(); /* 设置新的时钟中断处理过程时,禁止所有中断 */

setvect(TIMER,IntProc);

enable(); /* 开启中断 */

}

/* 恢复原有的时钟中断处理过程 */

void KillTimer()

{

disable();

setvect(TIMER,oldhandler);

enable();

}

void main(void)

{

int key,time=0;

SetTimer(newhandler); /* 修改时钟中断 */

for (;;)

{

if (bioskey(1))

{

key=bioskey(0);

if (key==VK_ESC) /* 按escape键提前退出程序 */

{

printf("User cancel!\n");

break;

}

}

if (TimerCounter>18) /* 1秒钟处理一次 */

{

/* 恢复计时变量 */

TimerCounter=0;

time ;

printf("%d\n",time);

if (time==10) /* 10秒钟后结束程序 */

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值