鱼C论坛

 找回密码
 立即注册
查看: 2366|回复: 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函数中)求解答?第一个是显示的界面,第二个是测试的界面界面,发现测试的结果是
循环停止在判断条件成立的时候,求解释
已完成旋转(进行),左右下的位移,下面是显示界面代码
#include<stdio.h>
#include<conio.h>
#include<malloc.h>
#include<graphics.h>
#define NULL 0
#define kuan 15
#define gao 30

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

typedef struct space //定义空间
{
int a[kuan][gao];
}space;


space *creatspace() //创建初始化空间,a[30][15]=0
{
int x,y;
space *p;
p=(space *)malloc(sizeof(space));
for(x=0;x<kuan;x++)
for(y=0;y<gao;y++)
p->a[x][y]=0;
return p;
}


void out(space *p) //空间输出
{
int x,y;
for(x=0;x<kuan;x++)
for(y=0;y<gao;y++)
if(p->a[x][y]==1)
{
setfillcolor(YELLOW);
bar(x*10,y*10,x*10+10,y*10+10);
}
} 


h *creat(int n)
{
h *head,*p1,*p2,*p3,*p4;
head=(h*)malloc(sizeof(h));
p2=(h*)malloc(sizeof(h));
p3=(h*)malloc(sizeof(h));
p4=(h*)malloc(sizeof(h));
p1=head;
p1->next=p2;
p2->next=p3;
p3->next=p4;
p4->next=NULL;

if(n==1) //判定显示什么样的方块--|
{
p1->a1=0;
p1->a2=0;
p2->a1=0;
p2->a2=1;
p3->a1=0;
p3->a2=2;
p4->a1=1;
p4->a2=2;
p1->x=p2->x=p3->x=p4->x=p1->y=p2->y=p3->y=p4->y=2;
}

return head;
}



void xian(h *head) //显示
{
h *p;
p=head;
while(p!=0)
{
setfillcolor(YELLOW);
bar((p->a1+p->x)*10,(p->a2+p->y)*10,(p->a1+p->x)*10+10,(p->a2+p->y)*10+10); 
p=p->next;
}
}


void xiao(h *head) //消失
{
h *p;
p=head;
while(p!=0)
{
setfillcolor(BLACK);
bar((p->a1+p->x)*1,(p->a2+p->y)*10,(p->a1+p->x)*10+10,(p->a2+p->y)*10+10); 
p=p->next;
}
}


void xuan(h *head) //旋转
{

h*p;
int a;
p=head;
while(p!=0)
{

a=p->a1;
p->a1=2-p->a2;
p->a2=a;
p=p->next;

}
}

//方向开始

void left(h *head)
{ 
h *p; 
p=head;
while(p!=NULL)
{
p->x=p->x-1;
p=p->next;
}
} 

void right(h *head)
{ h *p;
p=head;
while(p!=NULL)
{
p->x=p->x+1;
p=p->next;
}
} 

void down(h *head)
{ h *p;
p=head;
while(p!=NULL)
{
p->y=p->y+1;
p=p->next;
}
} 
//方向结束


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

q=q->next;
}


if(e==1)
{
q=head;
while(q!=NULL)
{
p->a[q->a1+q->x][q->a2+q->y]=1;
}
}
return e;
}


void main()
{ 
int a[4][4];
int e=0;
space *p;
p=creatspace();
h *head; //初始化开始
initgraph(kuan*10,gao*10); //建立图像

head=creat(1); // 创建新的方块
while(1) 
{ xian(head);
Sleep(500);
xiao(head);
if(!kbhit())
{
down(head);
}
else
{

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

e=judge(p,head);
if(e==1)
{
head=creat(1);
e=0;
}
out(p);
} //while结束

closegraph();

}



测试界面
#include<stdio.h>
#include<conio.h>
#include<malloc.h>
#include<graphics.h>
#define NULL 0
#define kuan 15
#define gao 30

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

h *creat(int n)
{
h *head,*p1,*p2,*p3,*p4;
head=(h*)malloc(sizeof(h));
p2=(h*)malloc(sizeof(h));
p3=(h*)malloc(sizeof(h));
p4=(h*)malloc(sizeof(h));
p1=head;
p1->next=p2;
p2->next=p3;
p3->next=p4;
p4->next=NULL;

if(n==1) //判定显示什么样的方块--|
{
p1->a1=0;
p1->a2=0;
p2->a1=0;
p2->a2=1;
p3->a1=0;
p3->a2=2;
p4->a1=1;
p4->a2=2;
p1->x=p2->x=p3->x=p4->x=p1->y=p2->y=p3->y=p4->y=2;
}

return head;
}






void xuan(h *head) //旋转
{

h*p;
int a;
p=head;
while(p!=0)
{

a=p->a1;
p->a1=2-p->a2;
p->a2=a;
p=p->next;

}
}

//方向开始



void down(h *head)
{ h *p;
p=head;
while(p!=NULL)
{
p->y=p->y+1;
printf("p->a1=%d p->a2=%d p->x=%d p->y=%d\n",p->a1,p->a2,p->x,p->y);
p=p->next;

}
} 
//方向结束

typedef struct space //定义空间
{
int a[kuan][gao];
}space;


space *creat() //创建初始化空间,a[30][15]=0
{
int x,y;
space *p;
p=(space *)malloc(sizeof(space));
for(x=0;x<kuan;x++)
for(y=0;y<gao;y++)
p->a[x][y]=0;
return p;
}


void out(space *p) //空间输出
{
int x,y;
for(x=0;x<kuan;x++)
for(y=0;y<gao;y++)
if(p->a[x][y]==1)
{
printf("p->a[%d][%d]=%d",x,y,p->a[x][y]);
}
} 


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

q=q->next;
}


if(e==1)
{
q=head;
while(q!=NULL)
{
p->a[q->a1+q->x][q->a2+q->y]=1;
}
}
return e;
}


void main()
{ 

int e=0;
space *p;
p=creat();
h *head; //初始化开始
head=creat(1); // 创建新的方块
while(1) 
{
Sleep(1000);
if(!kbhit())
{
down(head);
}
else
{

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

e=judge(p,head);
if(e==1)
{
head=creat(1);
e=0;
}
out(p);
printf("\n");
} //while结束



}


最佳答案

查看完整内容

汗。。。。。
想知道小甲鱼最近在做啥?请访问 -> 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,存储二维数组的,一个是用来链表用来存储方块的,下面是已经修改过的代码
#include<stdio.h>
#include<conio.h>
#include<malloc.h>
#include<graphics.h>
#define NULL 0
#define kuan  15
#define gao   30

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

typedef struct space         //定义空间
{
        int        a[kuan][gao];
}space;


space *creatspace()               //创建初始化空间,a[30][15]=0
{
        int x,y;
        space *p;
        p=(space *)malloc(sizeof(space));
        for(x=0;x<kuan;x++)
        for(y=0;y<gao;y++)
                p->a[x][y]=0;
        return p;
}


void out(space *p)          //空间输出
{
        int x,y;
                for(x=0;x<kuan;x++)
                for(y=0;y<gao;y++)
                if(p->a[x][y]==1)
                {
                        setcolor(BLUE);
                        setfillcolor(YELLOW);
                        bar(x*10,y*10,x*10+10,y*10+10);
                }
} 


h *creat(int n)
{
h *head,*p1,*p2,*p3,*p4;
head=(h*)malloc(sizeof(h));
p2=(h*)malloc(sizeof(h));
p3=(h*)malloc(sizeof(h));
p4=(h*)malloc(sizeof(h));
p1=head;
p1->next=p2;
p2->next=p3;
p3->next=p4;
p4->next=NULL;

        if(n==1)                //判定显示什么样的方块--|
        {
        p1->a1=0;
        p1->a2=0;
        p2->a1=0;
        p2->a2=1;
        p3->a1=0;
        p3->a2=2;
        p4->a1=1;
        p4->a2=2;
        p1->x=p2->x=p3->x=p4->x=p1->y=p2->y=p3->y=p4->y=2;
        }

return head;
}



void xian(h *head)                      //显示
{
        h *p;
        p=head;
        while(p!=0)
        {
                setfillcolor(YELLOW);
                bar((p->a1+p->x)*10,(p->a2+p->y)*10,(p->a1+p->x)*10+10,(p->a2+p->y)*10+10); 
                p=p->next;
        }
}


void xiao(h *head)                      //消失
{
        h *p;
        p=head;
        while(p!=0)
        {
                setfillcolor(BLACK);
                bar((p->a1+p->x)*1,(p->a2+p->y)*10,(p->a1+p->x)*10+10,(p->a2+p->y)*10+10); 
                p=p->next;
        }
}


void xuan(h *head)                       //旋转
{
  
        h*p;
        int a;
        p=head;
        while(p!=0)
        {
                                                
                a=p->a1;
                p->a1=2-p->a2;
                p->a2=a;
                p=p->next;
                
        }
}

//方向开始

void left(h *head)
{ 
        h *p; 
p=head;
while(p!=NULL)
{
p->x=p->x-1;
p=p->next;
}
} 

void right(h *head)
{ h *p;
p=head;
while(p!=NULL)
{
p->x=p->x+1;
p=p->next;
}
} 

void down(h *head)
{ h *p;
p=head;
while(p!=NULL)
{
p->y=p->y+1;
p=p->next;
}
} 
//方向结束


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

                                                          
                }
                if(e==1&&n==0)                             //碰边
                {
                        q=head;
                        printf("有\n");
                        while(q!=NULL)
                        {
                                p->a[q->a1+q->x][q->a2+q->y]=1;
        
                                q=q->next;
                        }
                }
                if(e==1&&n==1)                          //到底
                {
                        q=head;
                        printf("到底\n");
                        while(q!=NULL)
                        {
                                p->a[q->a1+q->x][q->a2+q->y-1]=1;
                        
                                q=q->next;
                        }
                }
                return e;
}


void main()
{   
        int e=0;
        space *p;
        p=creatspace();
    h *head;                                                                //初始化开始
        initgraph(kuan*10,gao*10);                                //建立图像

        head=creat(1);                                                        //  创建新的方块
        while(1)        
        {        xian(head);
                Sleep(500);
                xiao(head);
                if(!kbhit())
                {
                        down(head);
                }
                else
                {

                        if(getch()==119)       //w键
                        {
                                xuan(head);
                        }
                        down(head);         //无论是否键入都要向下一格
                }                       //else结束
        
                e=judge(p,head);
                if(e==1)
                {
                        head=creat(1);
                        e=0;
                }
                out(p);
        }                                                        //while结束

    closegraph();

}
想知道小甲鱼最近在做啥?请访问 -> 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, 2025-1-18 09:44

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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