OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5369|回复: 7

STM32 MINI V2.0学习板 俄罗斯方块游戏有问题啊!今天看了一天也没看出问题来啊,求帮助。

[复制链接]

43

主题

278

帖子

1

精华

高级会员

Rank: 4

积分
621
金钱
621
注册时间
2013-12-27
在线时间
0 小时
发表于 2014-10-30 22:05:42 | 显示全部楼层 |阅读模式
5金钱
问题图片


有的方块之间有间隔!
下面代码:
[mw_shl_code=c,true]#include "tetris.h" #include "stdlib.h" #include "lcd.h" #include "key.h" #include "chinese.h" #include "delay.h" #define SIZE_BOX 10//??????·??é??±??¤??10???????¨10*10??·??é?© #define MAX_BOXS 19//??????19????????????·??é #define SYS_X 10//???????·???÷??×ó????X×?±ê?¨?á×?±ê?© #define SYS_Y 100//???????·???÷??×ó????Y×?±ê?¨?ú×?±ê?© #define H_BOXS 10//?á·??ò??·??é?????????¤?? #define V_BOXS 15//?ú·??ò??·??é???????????? #define FIRST_BOX_X 4//??????·??é?????????? #define FALSE 0//????????·??é?? ???è???ú?ú??·??é #define TRUE 1//????????·??é ?è???ú?ú??·??é #define DOWN 0//×??????? #define RIGHT 1//???? #define TURN 2//??×? #define LEFT 3//×ó?? u8 CURRENT_BOX_X=SYS_X+FIRST_BOX_X*SIZE_BOX,CURRENT_BOX_Y=SYS_Y;//??·??±?°·??é??×?±ê u8 CURRENT_BOX_NUMBER;//?±?°·??é??±à?? u8 FLAG_NEWBOX=FALSE;//??·??è???ú?ú????·??é //???·???÷?á???? struct BOARD { u8 state;//??·?????×??? ????0??1 1±í??????±????? u16 color;//??·????????? }Table_Board[H_BOXS][V_BOXS];//?á×?±ê ?ú×?±ê?¨????????·??? ????·?????×????????? //·??é???á???? struct BOX { char box[2];//????·??é??2??×??????? /*0000 0000 0000 0000*/ u16 color;//·??é?????? u8 next;//??????·??é??±à?? }; //??????·??é??×? struct BOX SHAPES[MAX_BOXS]= { /* * ?? ?????? ???? ?? * ?? ?? ?? ?????? * ???? ?? */ {0x88, 0xc0, CYAN, 0}, {0xe8, 0x00, CYAN, 1}, {0xc4, 0x40, CYAN, 2}, {0x2e, 0x00, CYAN, 3}, /* * ?? ???? ?????? * ?? ?? ?? ?? * ???? ?????? ?? */ {0x44, 0xc0, MAGENTA, 4}, {0x8e, 0x00, MAGENTA, 5}, {0xc8, 0x80, MAGENTA, 6}, {0xe2, 0x00, MAGENTA, 7}, /* * ?? * ???? ???? * ?? ???? */ {0x8c, 0x40, YELLOW, 8}, {0x6c, 0x00, YELLOW, 9}, /* * ?? ???? * ???? ???? * ?? */ {0x4c, 0x80, BROWN, 10}, {0xc6, 0x00, BROWN, 11}, /* * ?? ?? ?? * ?????? ???? ?????? ???? * ?? ?? ?? */ {0x4e, 0x00, WHITE, 12}, {0x8c, 0x80, WHITE, 13}, {0xe4, 0x00, WHITE, 14}, {0x4c, 0x40, WHITE, 15}, /* ?? * ?? * ?? ???????? * ?? */ {0x88, 0x88, RED, 16}, {0xf0, 0x00, RED, 17}, /* * ???? * ???? */ {0xcc, 0x00, BLUE, 18}, }; // //???????·???? void Show_Face(void) { BACK_COLOR=BLACK; Test_Show_CH_Font16(139,105,7,WHITE);//·? Test_Show_CH_Font16(155,105,8,WHITE);//?? POINT_COLOR=WHITE; LCD_ShowString(171,105,":0000"); Test_Show_CH_Font16(139,126,9,WHITE);//?? Test_Show_CH_Font16(155,126,10,WHITE);//?? POINT_COLOR=WHITE; LCD_ShowString(171,126,":000"); Test_Show_CH_Font16(139,146,11,WHITE);//?? Test_Show_CH_Font16(155,146,12,WHITE);//?? Test_Show_CH_Font16(171,146,13,WHITE);//?? LCD_ShowString(5,303,"WK_UP:"); Test_Show_CH_Font16(53,303,14,WHITE);//×ó Test_Show_CH_Font16(68,303,16,WHITE);//?? LCD_ShowString(88,303,"KEY1:"); Test_Show_CH_Font16(128,303,17,WHITE);//?? Test_Show_CH_Font16(144,303,18,WHITE);//×? LCD_ShowString(164,303,"KEY0:"); Test_Show_CH_Font16(204,303,15,WHITE);//?? Test_Show_CH_Font16(220,303,16,WHITE);//?? Test_Show_CH_Font16(0,0,19,WHITE);//?í Test_Show_CH_Font16(16,0,20,WHITE);//?? Test_Show_CH_Font16(32,0,21,WHITE);//?? Test_Show_CH_Font16(48,0,22,WHITE);//·? Test_Show_CH_Font16(64,0,23,WHITE);//?é } //?????¤?????÷ void Show_Con_P(u8 x,u8 y,u8 nx,u8 ny) { u8 i,j,oldx; oldx=x; for(j=0;j<ny;j++) { for(i=0;i<nx;i++) { LCD_DrawLine(x,y,x+SIZE_BOX,y); LCD_DrawLine(x,y,x,y+SIZE_BOX); LCD_DrawLine(x,y+SIZE_BOX,x+SIZE_BOX,y+SIZE_BOX); LCD_DrawLine(x+SIZE_BOX,y,x+SIZE_BOX,y+SIZE_BOX); x+=SIZE_BOX; } y+=SIZE_BOX; x=oldx; } } //???????·???÷ void Show_Container(u8 x,u8 y,u8 h_boxs,u8 v_boxs) { u8 i,j,oldx; oldx=x; for(j=0;j<v_boxs;j++) { for(i=0;i<h_boxs;i++) { LCD_DrawLine(x,y,x+SIZE_BOX,y); LCD_DrawLine(x,y,x,y+SIZE_BOX); LCD_DrawLine(x,y+SIZE_BOX,x+SIZE_BOX,y+SIZE_BOX); LCD_DrawLine(x+SIZE_BOX,y,x+SIZE_BOX,y+SIZE_BOX); x+=SIZE_BOX; } y+=SIZE_BOX; x=oldx; } } //?ú?ú??·??é ?ú?ú??????·??é??·???·??é??±à?? u8 Made_NextBox(u8 box_number) { u8 place=0x80,t_boardx,t_boardy,n,m; //place??????·?×??ê16???? //t_boardx,t_boardy±í??x,y×?±ê??·??é?????? //n,m????????4*4??·??é t_boardx=(CURRENT_BOX_X-SYS_X)/SIZE_BOX;//·??é???±?°×?±ê????????×?±ê??????????·??é???????ó???á×?±ê??????·??é t_boardy=(CURRENT_BOX_Y-SYS_Y)/SIZE_BOX;//?ó??×?×?±ê??????·??é for(n=0;n<4;n++) { for(m=0;m<4;m++) { if(((SHAPES[CURRENT_BOX_NUMBER].box[n/2])&place)) { Table_Board[t_boardx+n][t_boardy+m].state=1; Table_Board[t_boardx+n][t_boardy+m].color=SHAPES[CURRENT_BOX_NUMBER].color; } place=place/2; if(place==0) place=0x80; } } CURRENT_BOX_X=SYS_X+FIRST_BOX_X*SIZE_BOX; CURRENT_BOX_Y=SYS_Y;//??????????×?±ê if(box_number==1) box_number=rand()%MAX_BOXS; CURRENT_BOX_NUMBER=box_number; return(rand()%MAX_BOXS); } //????·??ò ×?±ê ±à?? ???? void Show_NewBox(u16 x,u16 y,u16 n,u16 color) { u8 i,ii,ls_x=x; for(ii=0;ii<2;ii++) { u8 mask=128; for(i=0;i<8;i++) { if(i%4==0&&i!=0) { y+=SIZE_BOX; x=ls_x; } if(SHAPES[n].box[ii]&mask) { LCD_Fill(x,y,x+SIZE_BOX,y+SIZE_BOX,color); POINT_COLOR=LIGHTBLUE;//???·???÷???????? LCD_DrawLine(x,y,x+SIZE_BOX,y); LCD_DrawLine(x,y,x,y+SIZE_BOX); LCD_DrawLine(x,y+SIZE_BOX,x+SIZE_BOX,y+SIZE_BOX); LCD_DrawLine(x+SIZE_BOX,y,x+SIZE_BOX,y+SIZE_BOX); } x+=SIZE_BOX; mask/=2; } y+=SIZE_BOX; x=ls_x; } } //????·??é void EraseBox(u16 x,u16 y,u8 box_number) { u8 mask=128,n,m; for(n=0;n<4;n++) { for(m=0;m<4;m++) { if(((SHAPES[box_number].box[n/2])&mask)) { LCD_Fill(x+m*SIZE_BOX,y+n*SIZE_BOX,x+m*SIZE_BOX+SIZE_BOX,y+n*+SIZE_BOX+SIZE_BOX,BLACK); POINT_COLOR=LIGHTBLUE;//???·???÷???????? LCD_DrawLine(x+m*SIZE_BOX,y+n*SIZE_BOX,x+m*SIZE_BOX+SIZE_BOX,y+n*SIZE_BOX); LCD_DrawLine(x+m*SIZE_BOX,y+n*SIZE_BOX,x+m*SIZE_BOX,y+n*SIZE_BOX+SIZE_BOX); LCD_DrawLine(x+m*SIZE_BOX,y+n*SIZE_BOX+SIZE_BOX,x+m*SIZE_BOX+SIZE_BOX,y+n*SIZE_BOX+SIZE_BOX); LCD_DrawLine(x+m*SIZE_BOX+SIZE_BOX,y+n*SIZE_BOX,x+m*SIZE_BOX+SIZE_BOX,y+n*SIZE_BOX+SIZE_BOX); } mask=mask/(2); if(mask==0) mask=128; } } } //????·??é??·???????????·??é //????·??é??·????????? //x,y???±?°·??é???? //box_number???±?°·??é??±à?? //Direction??·??ò±ê?? //????·???TRUE?ò??FALSE u8 Judge_MoveCondition(u16 x,u16 y,u8 box_number,u8 Direction) { u8 n,m,t_boardx,t_boardy; u8 mask; if(Direction==LEFT)//??????×ó?? { mask=0x80; x-=SIZE_BOX; t_boardx=(x-SYS_X)/SIZE_BOX; t_boardy=(y-SYS_Y)/SIZE_BOX; for(n=0;n<4;n++) { for(m=0;m<4;m++) { if((SHAPES[CURRENT_BOX_NUMBER].box[n/2])&mask)//×?×ó±???·??é?????±?°???·???÷????·??é { if((x+SIZE_BOX*m)<SYS_X) return(FALSE);//????×?×ó±??? else if(Table_Board[t_boardx+n][t_boardy+m].state)//×ó??????·??é?ó ??4*4?????ò?????·°??????? { return(FALSE); } } mask=mask/(2); if(mask==0) mask=0x80; } } return(TRUE); } else if(Direction==RIGHT)//?????????? { x+=SIZE_BOX; t_boardx=(x-SYS_X)/SIZE_BOX; t_boardy=(y-SYS_Y)/SIZE_BOX; mask=0x80; for(n=0;n<4;n++) { for(m=0;m<4;m++)//??×???±????????? { if((SHAPES[CURRENT_BOX_NUMBER].box[n/2])&mask)//×???±???·??é?????±?°???·???÷????·??é { if((x+SIZE_BOX*m)>=(SYS_X+SIZE_BOX*H_BOXS)) return(FALSE);//????×???±??? else if(Table_Board[t_boardx+n][t_boardy+m].state) { return(FALSE); } } mask=mask/(2); if(mask==0) mask=128; } } return(TRUE); } else if(Direction==TURN)//??×? { t_boardx=(x-SYS_X)/SIZE_BOX; t_boardy=(y-SYS_Y)/SIZE_BOX; mask=0x80; for(n=0;n<4;n++) { for(m=0;m<4;m++) { if((SHAPES[CURRENT_BOX_NUMBER].box[n/2])&mask) { if((y+SIZE_BOX*n)>=(SYS_Y+SIZE_BOX*V_BOXS)) return(FALSE);//??????±??? if((x+SIZE_BOX*n)>=(SYS_X+SIZE_BOX*H_BOXS)) return(FALSE);//????×?×ó±??? if((x+SIZE_BOX*m)>=(SYS_X+SIZE_BOX*H_BOXS)) return(FALSE);//????×???±??? else if(Table_Board[t_boardx+n][t_boardy+m].state) { return(FALSE); } } mask=mask/(2); if(mask==0) mask=0x80; } } return(TRUE); } else if(Direction==DOWN)//?????????? { y+=SIZE_BOX; t_boardx=(x-SYS_X)/SIZE_BOX; t_boardy=(y-SYS_Y)/SIZE_BOX; mask=0x80; for(n=0;n<4;n++) { for(m=0;m<4;m++) { if((SHAPES[CURRENT_BOX_NUMBER].box[n/2])&mask)//×???±???·??é?????±?°???·???÷????·??é { if((y+SIZE_BOX*n)>=(SYS_Y+SIZE_BOX*V_BOXS)||Table_Board[t_boardx+n][t_boardy+m].state) { FLAG_NEWBOX=TURN;//?è???ú?ú????·??é break; } } mask=mask/(2); if(mask==0) mask=0x080; } } if(FLAG_NEWBOX) { return(FALSE); } else return(TRUE); } else { return(FALSE); } } //?????· void Play_Game(void) { u8 nextbox;//??????·??é±à?? u8 action=0;//·??é????×÷×??? 0±í??????×÷ ????±í??????×÷ u8 key;//°??ü?? Show_Face();//???·???? POINT_COLOR=LIGHTBLUE;//???·???÷???????? Show_Con_P(140,166,4,4);//?????¤?????÷ Show_Container(SYS_X,SYS_Y,H_BOXS,V_BOXS);//???????·???÷ nextbox=Made_NextBox(1);//?ú?ú??·??é Show_NewBox(CURRENT_BOX_X,CURRENT_BOX_Y,CURRENT_BOX_NUMBER,SHAPES[CURRENT_BOX_NUMBER].color); Show_NewBox(140,166,nextbox,SHAPES[nextbox].color); while(1) { key=KEY_Scan();//?????ü?? switch(key) { case 1: if(Judge_MoveCondition(CURRENT_BOX_X,CURRENT_BOX_Y,CURRENT_BOX_NUMBER,RIGHT))//?????????????????????????????? { EraseBox(CURRENT_BOX_X,CURRENT_BOX_Y,CURRENT_BOX_NUMBER); CURRENT_BOX_X+=SIZE_BOX; action=RIGHT; } break; case 2: if(Judge_MoveCondition(CURRENT_BOX_X,CURRENT_BOX_Y,CURRENT_BOX_NUMBER,TURN))//?????????????????????????????? { EraseBox(CURRENT_BOX_X,CURRENT_BOX_Y,CURRENT_BOX_NUMBER); CURRENT_BOX_NUMBER=SHAPES[CURRENT_BOX_NUMBER].next; action=TURN; } break; case 3: if(Judge_MoveCondition(CURRENT_BOX_X,CURRENT_BOX_Y,CURRENT_BOX_NUMBER,LEFT))//?????????????????????????????? { EraseBox(CURRENT_BOX_X,CURRENT_BOX_Y,CURRENT_BOX_NUMBER); CURRENT_BOX_X-=SIZE_BOX; action=LEFT; } break; } //????°??ü°?????×??????? if(!action) { if(Judge_MoveCondition(CURRENT_BOX_X,CURRENT_BOX_Y,CURRENT_BOX_NUMBER,DOWN)) { EraseBox(CURRENT_BOX_X,CURRENT_BOX_Y,CURRENT_BOX_NUMBER); CURRENT_BOX_Y+=SIZE_BOX; Show_NewBox(CURRENT_BOX_X,CURRENT_BOX_Y,CURRENT_BOX_NUMBER,SHAPES[CURRENT_BOX_NUMBER].color); action=DOWN; delay_ms(500); } } if(action) { Show_NewBox(CURRENT_BOX_X,CURRENT_BOX_Y,CURRENT_BOX_NUMBER,SHAPES[CURRENT_BOX_NUMBER].color); action=0; } if(FLAG_NEWBOX)//?ú?ú????·??é { EraseBox(140,166,nextbox); nextbox=Made_NextBox(nextbox); Show_NewBox(140,166,nextbox,SHAPES[nextbox].color); FLAG_NEWBOX=FALSE; } } } [/mw_shl_code]

水的比较多。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

43

主题

278

帖子

1

精华

高级会员

Rank: 4

积分
621
金钱
621
注册时间
2013-12-27
在线时间
0 小时
 楼主| 发表于 2014-11-1 18:36:14 | 显示全部楼层
哪位亲能帮忙看一下啊!这不是什么毕业设计也不是什么项目!这就是本人利用闲暇时间写着玩的。对本人来说没任何的价值,纯粹就是打消时间。帮忙看一下喽!
水的比较多。
回复

使用道具 举报

5

主题

154

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
205
金钱
205
注册时间
2013-6-8
在线时间
2 小时
发表于 2014-11-1 19:31:25 | 显示全部楼层
能不能把你的思路用图画下来呢?
贴代码没法看的哦
即使爬到最高的山上,一次也只能脚踏实地地迈一步。
回复

使用道具 举报

43

主题

278

帖子

1

精华

高级会员

Rank: 4

积分
621
金钱
621
注册时间
2013-12-27
在线时间
0 小时
 楼主| 发表于 2014-11-1 20:45:02 | 显示全部楼层
主函数说明


忘记把程序文件发上来了。
下面是:

俄罗斯方块1.zip

117.26 KB, 下载次数: 232

水的比较多。
回复

使用道具 举报

43

主题

278

帖子

1

精华

高级会员

Rank: 4

积分
621
金钱
621
注册时间
2013-12-27
在线时间
0 小时
 楼主| 发表于 2014-11-1 20:48:50 | 显示全部楼层
程序说明都很清楚,从图上来看,貌似有的方块画的正确,有的方块画的不正确。
今天我又试图修改一些参数,可是还是失败!
问题是方块一开始出现是在第二行出现,而不是第一行,我觉得问题在这里,可是我不知道错误在哪儿啊!
但是在预览方块中画的方块就正确,但是到了游戏容器里面就错了。
预览方块和游戏方块都是用的一个画图函数。
水的比较多。
回复

使用道具 举报

43

主题

278

帖子

1

精华

高级会员

Rank: 4

积分
621
金钱
621
注册时间
2013-12-27
在线时间
0 小时
 楼主| 发表于 2014-11-1 21:00:37 | 显示全部楼层






程序思路很清晰的。
水的比较多。
回复

使用道具 举报

43

主题

278

帖子

1

精华

高级会员

Rank: 4

积分
621
金钱
621
注册时间
2013-12-27
在线时间
0 小时
 楼主| 发表于 2014-11-1 21:02:36 | 显示全部楼层
另外一个帖子链接(本论坛的):
 http://www.openedv.com/posts/list/41325.htm
水的比较多。
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-11-1 21:09:00 | 显示全部楼层
帮顶....
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-29 16:32

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表