鱼C论坛

 找回密码
 立即注册
查看: 2141|回复: 10

俄罗斯方块正在进行时,求高手帮着看看哪里错了,附思路

[复制链接]
发表于 2014-11-12 10:19:06 | 显示全部楼层 |阅读模式
100鱼币
本帖最后由 漠水 于 2014-11-12 11:10 编辑

(1)建立一个二维数组利用结构体space->a[][]作为存储空间,首次初始化令数组空间存储为0,当存储为1时显示
(2)应用结构体变量存储方块在矩阵中的位置p->a1,p->a2和偏移p->x,p->y
(3)利用链表节点作为方块,判断遍历,输出和判断方块的位置和是否碰底或接触
(4)接触后到达底部或者即将碰撞则直接存储入二维数组,利用横坐标p->a+p->x和纵坐标p->a2+p->y判断

问题是,碰底后消失?看不出问题在哪里,(问题应该在judge函数中)求解答?第一个是显示的界面,第二个是测试的界面界面,发现测试的结果是
循环停止在判断条件成立的时候,求解释
已完成旋转(进行),左右下的位移,下面是显示界面代码
  1. #include<stdio.h>
  2. #include<conio.h>
  3. #include<malloc.h>
  4. #include<graphics.h>
  5. #define NULL 0
  6. #define kuan 15
  7. #define gao 30

  8. typedef struct h //构建节点,a1,a2代表在矩阵中的坐标(a1,a2),x,y代表位移
  9. {
  10. int a1,a2,x,y;
  11. struct h *next;
  12. }h;

  13. typedef struct space //定义空间
  14. {
  15. int a[kuan][gao];
  16. }space;


  17. space *creatspace() //创建初始化空间,a[30][15]=0
  18. {
  19. int x,y;
  20. space *p;
  21. p=(space *)malloc(sizeof(space));
  22. for(x=0;x<kuan;x++)
  23. for(y=0;y<gao;y++)
  24. p->a[x][y]=0;
  25. return p;
  26. }


  27. void out(space *p) //空间输出
  28. {
  29. int x,y;
  30. for(x=0;x<kuan;x++)
  31. for(y=0;y<gao;y++)
  32. if(p->a[x][y]==1)
  33. {
  34. setfillcolor(YELLOW);
  35. bar(x*10,y*10,x*10+10,y*10+10);
  36. }
  37. }


  38. h *creat(int n)
  39. {
  40. h *head,*p1,*p2,*p3,*p4;
  41. head=(h*)malloc(sizeof(h));
  42. p2=(h*)malloc(sizeof(h));
  43. p3=(h*)malloc(sizeof(h));
  44. p4=(h*)malloc(sizeof(h));
  45. p1=head;
  46. p1->next=p2;
  47. p2->next=p3;
  48. p3->next=p4;
  49. p4->next=NULL;

  50. if(n==1) //判定显示什么样的方块--|
  51. {
  52. p1->a1=0;
  53. p1->a2=0;
  54. p2->a1=0;
  55. p2->a2=1;
  56. p3->a1=0;
  57. p3->a2=2;
  58. p4->a1=1;
  59. p4->a2=2;
  60. p1->x=p2->x=p3->x=p4->x=p1->y=p2->y=p3->y=p4->y=2;
  61. }

  62. return head;
  63. }



  64. void xian(h *head) //显示
  65. {
  66. h *p;
  67. p=head;
  68. while(p!=0)
  69. {
  70. setfillcolor(YELLOW);
  71. bar((p->a1+p->x)*10,(p->a2+p->y)*10,(p->a1+p->x)*10+10,(p->a2+p->y)*10+10);
  72. p=p->next;
  73. }
  74. }


  75. void xiao(h *head) //消失
  76. {
  77. h *p;
  78. p=head;
  79. while(p!=0)
  80. {
  81. setfillcolor(BLACK);
  82. bar((p->a1+p->x)*1,(p->a2+p->y)*10,(p->a1+p->x)*10+10,(p->a2+p->y)*10+10);
  83. p=p->next;
  84. }
  85. }


  86. void xuan(h *head) //旋转
  87. {

  88. h*p;
  89. int a;
  90. p=head;
  91. while(p!=0)
  92. {

  93. a=p->a1;
  94. p->a1=2-p->a2;
  95. p->a2=a;
  96. p=p->next;

  97. }
  98. }

  99. //方向开始

  100. void left(h *head)
  101. {
  102. h *p;
  103. p=head;
  104. while(p!=NULL)
  105. {
  106. p->x=p->x-1;
  107. p=p->next;
  108. }
  109. }

  110. void right(h *head)
  111. { h *p;
  112. p=head;
  113. while(p!=NULL)
  114. {
  115. p->x=p->x+1;
  116. p=p->next;
  117. }
  118. }

  119. void down(h *head)
  120. { h *p;
  121. p=head;
  122. while(p!=NULL)
  123. {
  124. p->y=p->y+1;
  125. p=p->next;
  126. }
  127. }
  128. //方向结束


  129. int judge(space *p,h *head) //判定方块是否到底,交接存储,将方块的横纵坐标存入存储空间space中
  130. {
  131. int e=0;
  132. h *q;
  133. q=head;
  134. while(q!=NULL)
  135. {
  136. if(p->a[q->a1+q->x][q->a2+(q->y)+1]==1||(q->a2+q->y)==gao) e=1; //直接y的下一个已经有值或者到底了

  137. q=q->next;
  138. }


  139. if(e==1)
  140. {
  141. q=head;
  142. while(q!=NULL)
  143. {
  144. p->a[q->a1+q->x][q->a2+q->y]=1;
  145. }
  146. }
  147. return e;
  148. }


  149. void main()
  150. {
  151. int a[4][4];
  152. int e=0;
  153. space *p;
  154. p=creatspace();
  155. h *head; //初始化开始
  156. initgraph(kuan*10,gao*10); //建立图像

  157. head=creat(1); // 创建新的方块
  158. while(1)
  159. { xian(head);
  160. Sleep(500);
  161. xiao(head);
  162. if(!kbhit())
  163. {
  164. down(head);
  165. }
  166. else
  167. {

  168. if(getch()==119) //w键
  169. {
  170. xuan(head);
  171. }
  172. down(head); //无论是否键入都要向下一格
  173. } //else结束

  174. e=judge(p,head);
  175. if(e==1)
  176. {
  177. head=creat(1);
  178. e=0;
  179. }
  180. out(p);
  181. } //while结束

  182. closegraph();

  183. }
复制代码




测试界面

  1. #include<stdio.h>
  2. #include<conio.h>
  3. #include<malloc.h>
  4. #include<graphics.h>
  5. #define NULL 0
  6. #define kuan 15
  7. #define gao 30

  8. typedef struct h //构建节点,a1,a2代表在矩阵中的坐标(a1,a2),x,y代表位移
  9. {
  10. int a1,a2,x,y;
  11. struct h *next;
  12. }h;

  13. h *creat(int n)
  14. {
  15. h *head,*p1,*p2,*p3,*p4;
  16. head=(h*)malloc(sizeof(h));
  17. p2=(h*)malloc(sizeof(h));
  18. p3=(h*)malloc(sizeof(h));
  19. p4=(h*)malloc(sizeof(h));
  20. p1=head;
  21. p1->next=p2;
  22. p2->next=p3;
  23. p3->next=p4;
  24. p4->next=NULL;

  25. if(n==1) //判定显示什么样的方块--|
  26. {
  27. p1->a1=0;
  28. p1->a2=0;
  29. p2->a1=0;
  30. p2->a2=1;
  31. p3->a1=0;
  32. p3->a2=2;
  33. p4->a1=1;
  34. p4->a2=2;
  35. p1->x=p2->x=p3->x=p4->x=p1->y=p2->y=p3->y=p4->y=2;
  36. }

  37. return head;
  38. }






  39. void xuan(h *head) //旋转
  40. {

  41. h*p;
  42. int a;
  43. p=head;
  44. while(p!=0)
  45. {

  46. a=p->a1;
  47. p->a1=2-p->a2;
  48. p->a2=a;
  49. p=p->next;

  50. }
  51. }

  52. //方向开始



  53. void down(h *head)
  54. { h *p;
  55. p=head;
  56. while(p!=NULL)
  57. {
  58. p->y=p->y+1;
  59. printf("p->a1=%d p->a2=%d p->x=%d p->y=%d\n",p->a1,p->a2,p->x,p->y);
  60. p=p->next;

  61. }
  62. }
  63. //方向结束

  64. typedef struct space //定义空间
  65. {
  66. int a[kuan][gao];
  67. }space;


  68. space *creat() //创建初始化空间,a[30][15]=0
  69. {
  70. int x,y;
  71. space *p;
  72. p=(space *)malloc(sizeof(space));
  73. for(x=0;x<kuan;x++)
  74. for(y=0;y<gao;y++)
  75. p->a[x][y]=0;
  76. return p;
  77. }


  78. void out(space *p) //空间输出
  79. {
  80. int x,y;
  81. for(x=0;x<kuan;x++)
  82. for(y=0;y<gao;y++)
  83. if(p->a[x][y]==1)
  84. {
  85. printf("p->a[%d][%d]=%d",x,y,p->a[x][y]);
  86. }
  87. }


  88. int judge(space *p,h *head) //判定方块是否到底,交接存储,将方块的横纵坐标存入存储空间space中
  89. {
  90. int e=0;
  91. h *q;
  92. q=head;
  93. while(q!=NULL)
  94. {
  95. if(p->a[q->a1+q->x][q->a2+(q->y)+1]==1||(q->a2+q->y)==gao) e=1; //直接y的下一个已经有值或者到底了

  96. q=q->next;
  97. }


  98. if(e==1)
  99. {
  100. q=head;
  101. while(q!=NULL)
  102. {
  103. p->a[q->a1+q->x][q->a2+q->y]=1;
  104. }
  105. }
  106. return e;
  107. }


  108. void main()
  109. {

  110. int e=0;
  111. space *p;
  112. p=creat();
  113. h *head; //初始化开始
  114. head=creat(1); // 创建新的方块
  115. while(1)
  116. {
  117. Sleep(1000);
  118. if(!kbhit())
  119. {
  120. down(head);
  121. }
  122. else
  123. {

  124. if(getch()==119) //w键
  125. {
  126. xuan(head);
  127. }
  128. down(head); //无论是否键入都要向下一格
  129. } //else结束

  130. e=judge(p,head);
  131. if(e==1)
  132. {
  133. head=creat(1);
  134. e=0;
  135. }
  136. out(p);
  137. printf("\n");
  138. } //while结束



  139. }
复制代码



最佳答案

查看完整内容

汗。。。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-11-12 10:19:07 | 显示全部楼层
汗。。。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2014-11-12 11:32:38 | 显示全部楼层
一个q=q->next忘记加叫让我卡了一天,悲催的试调啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2014-11-12 12:03:07 | 显示全部楼层
judge函数中第二个循环if(e==1)中后面忘记q=q->next
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-11-12 13:52:00 | 显示全部楼层
我草,你写的注释太简单了,自己能看懂吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2014-11-12 14:30:03 | 显示全部楼层
yuzhouliu2000 发表于 2014-11-12 13:52
我草,你写的注释太简单了,自己能看懂吗

呃,问题已经被我自己解决了,注释基本上都在最前面啊,就是怕你们看不懂所以才把基本思路给说了,其实变量就是2个结构体,一个是存储空间space,存储二维数组的,一个是用来链表用来存储方块的,下面是已经修改过的代码
  1. #include<stdio.h>
  2. #include<conio.h>
  3. #include<malloc.h>
  4. #include<graphics.h>
  5. #define NULL 0
  6. #define kuan  15
  7. #define gao   30

  8. typedef struct h        //构建节点,a1,a2代表在矩阵中的坐标(a1,a2),x,y代表位移
  9. {
  10. int a1,a2,x,y;            
  11. struct h *next;
  12. }h;

  13. typedef struct space         //定义空间
  14. {
  15.         int        a[kuan][gao];
  16. }space;


  17. space *creatspace()               //创建初始化空间,a[30][15]=0
  18. {
  19.         int x,y;
  20.         space *p;
  21.         p=(space *)malloc(sizeof(space));
  22.         for(x=0;x<kuan;x++)
  23.         for(y=0;y<gao;y++)
  24.                 p->a[x][y]=0;
  25.         return p;
  26. }


  27. void out(space *p)          //空间输出
  28. {
  29.         int x,y;
  30.                 for(x=0;x<kuan;x++)
  31.                 for(y=0;y<gao;y++)
  32.                 if(p->a[x][y]==1)
  33.                 {
  34.                         setcolor(BLUE);
  35.                         setfillcolor(YELLOW);
  36.                         bar(x*10,y*10,x*10+10,y*10+10);
  37.                 }
  38. }


  39. h *creat(int n)
  40. {
  41. h *head,*p1,*p2,*p3,*p4;
  42. head=(h*)malloc(sizeof(h));
  43. p2=(h*)malloc(sizeof(h));
  44. p3=(h*)malloc(sizeof(h));
  45. p4=(h*)malloc(sizeof(h));
  46. p1=head;
  47. p1->next=p2;
  48. p2->next=p3;
  49. p3->next=p4;
  50. p4->next=NULL;

  51.         if(n==1)                //判定显示什么样的方块--|
  52.         {
  53.         p1->a1=0;
  54.         p1->a2=0;
  55.         p2->a1=0;
  56.         p2->a2=1;
  57.         p3->a1=0;
  58.         p3->a2=2;
  59.         p4->a1=1;
  60.         p4->a2=2;
  61.         p1->x=p2->x=p3->x=p4->x=p1->y=p2->y=p3->y=p4->y=2;
  62.         }

  63. return head;
  64. }



  65. void xian(h *head)                      //显示
  66. {
  67.         h *p;
  68.         p=head;
  69.         while(p!=0)
  70.         {
  71.                 setfillcolor(YELLOW);
  72.                 bar((p->a1+p->x)*10,(p->a2+p->y)*10,(p->a1+p->x)*10+10,(p->a2+p->y)*10+10);
  73.                 p=p->next;
  74.         }
  75. }


  76. void xiao(h *head)                      //消失
  77. {
  78.         h *p;
  79.         p=head;
  80.         while(p!=0)
  81.         {
  82.                 setfillcolor(BLACK);
  83.                 bar((p->a1+p->x)*1,(p->a2+p->y)*10,(p->a1+p->x)*10+10,(p->a2+p->y)*10+10);
  84.                 p=p->next;
  85.         }
  86. }


  87. void xuan(h *head)                       //旋转
  88. {
  89.   
  90.         h*p;
  91.         int a;
  92.         p=head;
  93.         while(p!=0)
  94.         {
  95.                                                
  96.                 a=p->a1;
  97.                 p->a1=2-p->a2;
  98.                 p->a2=a;
  99.                 p=p->next;
  100.                
  101.         }
  102. }

  103. //方向开始

  104. void left(h *head)
  105. {
  106.         h *p;
  107. p=head;
  108. while(p!=NULL)
  109. {
  110. p->x=p->x-1;
  111. p=p->next;
  112. }
  113. }

  114. void right(h *head)
  115. { h *p;
  116. p=head;
  117. while(p!=NULL)
  118. {
  119. p->x=p->x+1;
  120. p=p->next;
  121. }
  122. }

  123. void down(h *head)
  124. { h *p;
  125. p=head;
  126. while(p!=NULL)
  127. {
  128. p->y=p->y+1;
  129. p=p->next;
  130. }
  131. }
  132. //方向结束


  133. int judge(space *p,h *head)                   //判定方块是否到底,交接存储,将方块的横纵坐标存入存储空间space中
  134. {
  135.         int e=0,n=0;
  136.         h *q;
  137.         q=head;
  138.         while(q!=NULL)
  139.                 {
  140.                         if(p->a[q->a1+q->x][q->a2+(q->y)+1]==1||(q->a2+q->y)==gao) //直接y的下一个已经有值或者到底了
  141.                         {   
  142.                                 e=1;                    
  143.                         if(q->a2+q->y==gao)n=1;                                    //到底的话另外在判断
  144.                         }                           
  145.                         q=q->next;

  146.                                                           
  147.                 }
  148.                 if(e==1&&n==0)                             //碰边
  149.                 {
  150.                         q=head;
  151.                         printf("有\n");
  152.                         while(q!=NULL)
  153.                         {
  154.                                 p->a[q->a1+q->x][q->a2+q->y]=1;
  155.        
  156.                                 q=q->next;
  157.                         }
  158.                 }
  159.                 if(e==1&&n==1)                          //到底
  160.                 {
  161.                         q=head;
  162.                         printf("到底\n");
  163.                         while(q!=NULL)
  164.                         {
  165.                                 p->a[q->a1+q->x][q->a2+q->y-1]=1;
  166.                        
  167.                                 q=q->next;
  168.                         }
  169.                 }
  170.                 return e;
  171. }


  172. void main()
  173. {   
  174.         int e=0;
  175.         space *p;
  176.         p=creatspace();
  177.     h *head;                                                                //初始化开始
  178.         initgraph(kuan*10,gao*10);                                //建立图像

  179.         head=creat(1);                                                        //  创建新的方块
  180.         while(1)       
  181.         {        xian(head);
  182.                 Sleep(500);
  183.                 xiao(head);
  184.                 if(!kbhit())
  185.                 {
  186.                         down(head);
  187.                 }
  188.                 else
  189.                 {

  190.                         if(getch()==119)       //w键
  191.                         {
  192.                                 xuan(head);
  193.                         }
  194.                         down(head);         //无论是否键入都要向下一格
  195.                 }                       //else结束
  196.        
  197.                 e=judge(p,head);
  198.                 if(e==1)
  199.                 {
  200.                         head=creat(1);
  201.                         e=0;
  202.                 }
  203.                 out(p);
  204.         }                                                        //while结束

  205.     closegraph();

  206. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2014-11-12 14:32:45 | 显示全部楼层

诶,我知道代码太长了就没什么太大的机会会有人仔细去看了,然后自己测试解决了,太伤心了,我的100鱼币啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-11-12 16:10:20 | 显示全部楼层
漠水 发表于 2014-11-12 14:32
诶,我知道代码太长了就没什么太大的机会会有人仔细去看了,然后自己测试解决了,太伤心了,我的100鱼币 ...

噗。。。。。。。。居然给我了。。么么哒。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2014-11-13 12:35:43 | 显示全部楼层
向往青莲 发表于 2014-11-12 16:10
噗。。。。。。。。居然给我了。。么么哒。。。

点进来了说明你有打算帮着解决,你又是第一个到的,有回复说明你有看,有心就该感谢,鱼币收不回来无所谓,关键是有收获一切都好说
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-11-13 12:51:38 | 显示全部楼层
漠水 发表于 2014-11-13 12:35
点进来了说明你有打算帮着解决,你又是第一个到的,有回复说明你有看,有心就该感谢,鱼币收不回来无所谓 ...

恩恩。。本来想帮你看看的。。结果。。一进来。。代码好长。。顿时就给跪了。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-11-14 19:54:33 | 显示全部楼层
鸭蛋,下手太慢。 可恶
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-26 12:23

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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