请教俄罗斯方块程序中不明白的地方,请热心的朋友帮一下忙,谢谢。

summersrest 2011-11-17 09:35:30
前面定义的枚举类型
enum DRAW
{
SHOW, // 显示方块
HIDE, // 隐藏方块
FIX // 固定方块
};

前面定义的结构体
struct BLOCKINFO
{
byte id; // 方块 ID
char x, y; // 方块在游戏区中的坐标
byte dir:2; // 方向
} g_CurBlock, g_NextBlock;

// 画方块的程序
void DrawBlock(BLOCKINFO _block, DRAW _draw)
{
WORD b = g_bBlocks[_lock.id].dir[_block.dir];
int x, y;

int color = BLACK;
switch(_draw)
{
case SHOW: color = g_Blocks[_block.id].color; break;
case HIDE: color = BLACK; break;
case FIX: color = g_Blocks[_block.id].color / 3; break;
}
setfillstyle(color);

for(int i=0; i<16; i++)
{
if (b & 0x8000)
{
x = _block.x + i % 4;
y = _block.y - i / 4;
if (y < HEIGHT)
{
if (_draw != HIDE)
bar3d(x * SIZE + 2, (HEIGHT - y - 1) * SIZE + 2, (x + 1) * SIZE - 4, (HEIGHT - y) * SIZE - 4, 3, true);
else
bar(x * SIZE, (HEIGHT - y - 1) * SIZE, (x + 1) * SIZE - 1, (HEIGHT - y) * SIZE - 1);
}
}
b <<= 1;
}
}




1.WORD b = g_Blocks[_block.id].dir[_block.dir];这一行不明白,id和dir应该是两个数怎么能都赋给一个WORD类型的变量?中间加的那个点什么意思?
2.可能因为上一句不明白,if (b & 0x8000)这一句我也不明白什么意思?b与0x8000会得到什么结果?对程序有什么影响?
3.最后一句b <<= 1;什么意思?有什么意义?

我是新手大家别笑话我,这些问题对我来说很难可能对高手来说就是喽一眼的事,真心的求教。我已经给出我能给的最高分了。求大家帮忙教我一下。
...全文
315 15 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
summersrest 2011-11-17
  • 打赏
  • 举报
回复
9楼的前辈的意思我大概可以理解,如果g_bBlocks这个数组有7个元素,里面的成员第_block.id个元素里面都是有5个元素,是不是也就是说b代表的是g_bBlocks数组的第_block.id个元素的成员dir的第_block.dir位。
举个例子理解:如果g_bBlocks这个数组的block.id是2,也就是这个数组的第二个元素,然后这个元素里面dir是3,也就是这个元素里面包括的4个元素的第3个元素。那么这个b的值是多少?是3吗?是3和0x8000与吗?
不知道我这么表达别人能不能理解清楚。
雲哉 2011-11-17
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 cloudzay 的回复:]

引用 8 楼 summersrest 的回复:

能告诉我WORD b = g_bBlocks[_block.id].dir[_block.dir];这一句的结果是把dir[_block.dir]的值赋给b对吗?
还有把b左移一位有什么意义?
有人能给我解答一下吗?

nope..分解一下吧
g_bBlocks[_block.id].dir[_block.dir]
先看_bloc……
[/Quote]
另外。。发现一个问题 block.dir貌似不能用[]操作吧??能编译通过么?
Phoenix Slade 2011-11-17
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 cloudzay 的回复:]
引用 8 楼 summersrest 的回复:

能告诉我WORD b = g_bBlocks[_block.id].dir[_block.dir];这一句的结果是把dir[_block.dir]的值赋给b对吗?
还有把b左移一位有什么意义?
有人能给我解答一下吗?

nope..分解一下吧
g_bBlocks[_block.id].dir[_block.dir]
先看_block……
[/Quote]WORD 32位
雲哉 2011-11-17
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 summersrest 的回复:]

能告诉我WORD b = g_bBlocks[_block.id].dir[_block.dir];这一句的结果是把dir[_block.dir]的值赋给b对吗?
还有把b左移一位有什么意义?
有人能给我解答一下吗?
[/Quote]
nope..分解一下吧
g_bBlocks[_block.id].dir[_block.dir]
先看_block.dir
dir是一个两位大小的位组,单独使用.表示将其当成一个数,就是说_block.dir是_block变量里的dir成员的值,暂且将其当成x,所以数组符号[]表示取的是dir的第x位。前面的_block.id可以类似的理解。所以整体理解起来就是g_bBlocks数组的第_block.id个元素的成员dir的第_block.dir位。
第二个问题,左移一位可以理解成乘以2,这种方法在嵌入式编程里用的比较多,作用,提高效率。。。
summersrest 2011-11-17
  • 打赏
  • 举报
回复
能告诉我WORD b = g_bBlocks[_block.id].dir[_block.dir];这一句的结果是把dir[_block.dir]的值赋给b对吗?
还有把b左移一位有什么意义?
有人能给我解答一下吗?
ryfdizuo 2011-11-17
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 summersrest 的回复:]

结构体这个用法我在课本上从来没有见过!还是不太明白,这个结果得到的是把dir的值赋给b吗?我是不是有点笨!
[/Quote]只能说你基础不够扎实啊,呵呵
summersrest 2011-11-17
  • 打赏
  • 举报
回复
结构体这个用法我在课本上从来没有见过!还是不太明白,这个结果得到的是把dir的值赋给b吗?我是不是有点笨!
ryfdizuo 2011-11-17
  • 打赏
  • 举报
回复
g_bBlocks的定义没有给出
访问结构体对象的成员 一直就是用.操作符啊。
shuoshuo_mt 2011-11-17
  • 打赏
  • 举报
回复
一楼都说了,点表示结构体的成员。dir[_block.dir]是g_Blocks[_block.dir]的一个成员!不是LZ理解的两个数。
pengzhixi 2011-11-17
  • 打赏
  • 举报
回复
g_Blocks[_block.id]得到的是一个BLOCKINFO结构体。然后.dir[_block.dir]是得到这个结构体里面dir成员的值。
summersrest 2011-11-17
  • 打赏
  • 举报
回复
我的理解是g_Blocks[_block.id]代表一个数dir[_block.dir]也代表一个数。两个数之间怎么能加一个点,而且怎么能两个数一起赋给b,我的理解错在哪里?
雲哉 2011-11-17
  • 打赏
  • 举报
回复
1.点表示一个结构体的成员
2.按位与操作,就是将b和0x8000的每一位进行与操作,得到最后结果如果等于0则不执行if下面的语句,反之执行if
3.b左移一位,相当于b*2,效率比b*2高很多
summersrest 2011-11-17
  • 打赏
  • 举报
回复
虽然问题没有彻底解决,大家已经给我很大的启发了,我已经明白了很多了。衷心的感谢大家。
赵4老师 2011-11-17
  • 打赏
  • 举报
回复
注意dir是位域!
赵4老师 2011-11-17
  • 打赏
  • 举报
回复
VC调试(TC或BC用TD调试)时按Alt+8、Alt+6和Alt+5,打开汇编窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应内存和寄存器变化,这样过一遍不就啥都明白了吗。
(Linux或Unix下可以在用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。)

不要迷信书、考题、老师、回帖;
要迷信CPU、编译器、调试器、运行结果。
并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。
summersrest 2011-11-17
  • 打赏
  • 举报
回复
没有人回答我了我自己顶一下吧,愁死我了。

70,020

社区成员

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

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