俄罗斯方块(新手,求指导)

谢攀琪 2011-01-27 09:39:18
初次编游戏,里面肯定有很多地方可以改进
求指导

[code=C/C++][
#include <iostream>
using namespace std;
#include <windows.h>
#include <conio.h>
#include <time.h>

static int px[7][4][4]={{{-1,0,-1,0},{-1,0,-1,0},{-1,0,-1,0},{-1,0,-1,0}},
{{0,0,0,0},{1,0,-1,2},{0,0,0,0},{1,0,-1,2}},
{{-1,0,-1,0},{0,0,-1,1},{-1,0,-1,0},{0,0,-1,1}},
{{1,0,0,1},{0,0,-1,1},{1,0,0,1},{0,0,-1,1}},
{{0,0,-1,0},{1,0,0,2},{0,0,0,1},{1,0,-1,1}},
{{0,0,0,1},{-1,0,-2,0},{0,0,-1,0},{-1,0,-1,1}},
{{0,0,-1,1},{0,0,-1,0},{0,0,-1,1},{0,0,0,1}}};
static int py[7][4][4]={{{-1,0,0,-1},{-1,0,0,-1},{-1,0,0,-1},{-1,0,0,-1}},
{{-3,0,-1,-2},{0,0,0,0},{-3,0,-1,-2},{0,0,0,0}},
{{-2,0-1,-1},{-1,0,0,-1},{-2,0-1,-1},{-1,0,0,-1}},
{{-2,0,-1,-1},{-1,0,-1,0},{-2,0,-1,-1},{-1,0,-1,0}},
{{-2,0,-2,-1},{-1,0,-1,-1},{-2,0,-1,0},{-1,0,0,0}},
{{-2,0,-1,-2},{-1,0,-1,-1},{-2,0,-0,-1},{-1,0,0,0}},
{{-1,0,0,0},{-2,0,-1,-1},{-1,0,-1,-1},{-2,0,-1,-1}}};


int fen=0;

typedef struct node
{
int a[10];
int num;
struct node *next,*parent;
}Node;

Node *head;

void InitNode()
{
Node *p1,*p2;
p1=(Node*)malloc(sizeof(Node));
head=p1;
p1->next=NULL;
p1->parent=NULL;
for(int i=0;i<18;++i)
{
p2=(Node*)malloc(sizeof(Node));
p2->num=0;
for(int j=0;j<10;++j)p2->a[j]=0;
p1->next=p2;
p2->parent=p1;
p1=p2;
}
p1->next=NULL;
for(int j=0;j<10;++j)p1->a[j]=1;
head=head->next->next->next; //头指针上面再留三节点,用于后面判断是否有方块
}

void go(int x,int y) //光标移动
{
COORD point={2*x+2,y};
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),point);
}

void DelNode()
{
Node *p;
for(int i=0;i<15;i++)
{
p=head;
head=head->next;
delete(p);
}
delete(head);
}

int GetNum(int b) //小于b的随机数
{
srand(time(NULL));
int a=rand()%b;
return a;
}

void PrintBox(int x,int y) //显示移动方块
{
if(y<0)return;
go(x,y);
cout<<"■";
}
void ClearBox(int x,int y) //消方块
{
go(x,y);
cout<<" ";
}

void Print() //重新输出起到消行作用
{
Node *p;
system("cls");
p=head->next;
for(int i=0;i<15;++i)
{
cout<<"■";
for(int j=0;j<10;j++)
{
if(p->a[j])cout<<"■";
else cout<<" ";
}
cout<<"■"<<endl;
p=p->next;
}
go(15,4);cout<<"↑ 变形";
go(15,5);cout<<"↓ 加速";
go(15,6);cout<<"← 左移";
go(15,7);cout<<"→ 右移";
go(15,8);cout<<"空格 下降";
go(15,9);cout<<"回车 暂停";
go(15,10);cout<<"得分: "<<fen;
}

bool CheckBox(int a,int b,int c,Node *p) //检查是否有禁止的方块
{
Node *q;
for(int i=0;i<4;i++)
{
switch(py[a][b][i])
{
case 0:q=p;break;
case -1:q=p->parent;break;
case -2:q=p->parent->parent;break;
case -3:q=p->parent->parent->parent;break;
}
if(q->a[px[a][b][i]+c])return true;
}
return false;
}

void Stop(int a,int b,int c,int d) //暂停
{
system("cls");
int boutt;
go(10,5);
cout<<"休息,休息一会";
go(10,6);
cout<<"按回车键继续";
do
{
boutt=getch();
}while(boutt!=13);
Print();
for(int i=0;i<4;i++)
PrintBox(px[a][b][i]+c,py[a][b][i]+d);
}

int Check(int a,int b,int c,int d,Node *p) //判断变形时是否有障碍物,并作出处理,成功处理返回真,处理失败返回假
{
int cc=c;
b++;
if(px[a][b][2]+c<0)cc=0-px[a][b][2];
if(px[a][b][3]+c>9)cc=9-px[a][b][3];
if(CheckBox(a,b,cc,p))return 0;
return cc;
}

void Control(int a,int &b,int &c,int d,int &n,Node *p)
{
int boutt,i,cc;
if(kbhit())
{
do
{
boutt=getch();
}while(boutt==224);
}
switch(boutt)
{
case 72:if((cc=Check(a,b,c,d,p))!=0)
{
for(i=0;i<4;i++)
ClearBox(px[a][b][i]+c,py[a][b][i]+d);
b++;
c=cc;
if(b==4)b=0;
for(i=0;i<4;i++)
PrintBox(px[a][b][i]+c,py[a][b][i]+d);
}
break;
case 75:if(px[a][b][2]+c>0)
{
if(CheckBox(a,b,c-1,p->next))break;
for(i=0;i<4;i++)
ClearBox(px[a][b][i]+c,py[a][b][i]+d);
c--;
for(i=0;i<4;i++)
PrintBox(px[a][b][i]+c,py[a][b][i]+d);
}
break;
case 77:if(px[a][b][3]+c<9)
{
if(CheckBox(a,b,c+1,p->next))break;
for(i=0;i<4;i++)
ClearBox(px[a][b][i]+c,py[a][b][i]+d);
c++;
for(i=0;i<4;i++)
PrintBox(px[a][b][i]+c,py[a][b][i]+d);
}
break;
case 80:n=1;break;
case 32:n=0;break;
case 13:Stop(a,b,c,d);break;
}
}

void ClearLine(Node *p) //消行
{
Node *p1,*p2;
p1=p->next;
p2=p->parent;
p2->next=p1;
p1->parent=p2;
p1=head->next;
head->next=p;
p->next=p1;
p1->parent=p;
p->parent=head;
p->num=0;
for(int i=0;i<10;i++)p->a[i]=0;
}

void End(int fen)
{
system("cls");
go(10,5);
cout<<"游戏结束!!!"<<endl;
go(10,6);
cout<<"得分:"<<fen<<endl;
}

void main()
{
Node *p,*q;
InitNode();
int a,b;
Print();
while(1)
{
int n=10;
int c=5;
p=head->next;
a=GetNum(7);
b=GetNum(4);
for(int d=1;d<15;d++)
{
bool bb=0;
if(CheckBox(a,b,c,p->next))bb=1;
if(bb)
{
for(int i=0;i<4;i++)
{
switch(py[a][b][i])
{
case 0:q=p;break;
case -1:q=p->parent;break;
case -2:q=p->parent->parent;break;
case -3:q=p->parent->parent->parent;break;
}
q->a[px[a][b][i]+c]=1;
q->num++;
}
}
for(int i=0;i<4;i++)
{
if(bb)PrintBox(px[a][b][i]+c,py[a][b][i]+d-1);
else PrintBox(px[a][b][i]+c,py[a][b][i]+d);
}
if(!bb)
{
for(i=0;i<n;i++)
{
Control(a,b,c,d,n,p);
Sleep(50);
}
for(i=0;i<4;i++)
{
ClearBox(px[a][b][i]+c,py[a][b][i]+d);
}
}
else break;
p=p->next;
}
q=head->next;
for(int i=0,f=0;i<15;++i)
{
if(q->num==10)
{
p=q->next;
ClearLine(q);
f++;
q=p;
}
else q=q->next;
}
fen=fen+(f*f);
if(f)Print();
if(head->num)
{
End(fen);
break;
}
}
DelNode();
}
]
...全文
172 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
fancyivan 2011-01-28
  • 打赏
  • 举报
回复
虽然界面有时候是浮云,但如果有个界面,会更好一些.
谢攀琪 2011-01-27
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 xujiezhige 的回复:]
我编过网络对战的俄罗斯方块。
你的代码我没仔细看。但我觉得用类去写俄罗斯方块比较好。
那样外部调用很简单。而且用类去写之后,只看main函数就可以看懂代码大体意思。
还有你的注释太少了。
[/Quote]
我也觉得注释少了点,但是感觉我都看的懂,
不用多解释
就没加什么注释
雪人2015 2011-01-27
  • 打赏
  • 举报
回复
我编过网络对战的俄罗斯方块。
你的代码我没仔细看。但我觉得用类去写俄罗斯方块比较好。
那样外部调用很简单。而且用类去写之后,只看main函数就可以看懂代码大体意思。
还有你的注释太少了。
谢攀琪 2011-01-27
  • 打赏
  • 举报
回复
不知道怎么像5楼那么发代码。。。
求解释
dark_ice_rain 2011-01-27
  • 打赏
  • 举报
回复
#include <iostream>
using namespace std;
#include <windows.h>
#include <conio.h>
#include <time.h>

static int px[7][4][4]={{{-1,0,-1,0},{-1,0,-1,0},{-1,0,-1,0},{-1,0,-1,0}},
{{0,0,0,0},{1,0,-1,2},{0,0,0,0},{1,0,-1,2}},
{{-1,0,-1,0},{0,0,-1,1},{-1,0,-1,0},{0,0,-1,1}},
{{1,0,0,1},{0,0,-1,1},{1,0,0,1},{0,0,-1,1}},
{{0,0,-1,0},{1,0,0,2},{0,0,0,1},{1,0,-1,1}},
{{0,0,0,1},{-1,0,-2,0},{0,0,-1,0},{-1,0,-1,1}},
{{0,0,-1,1},{0,0,-1,0},{0,0,-1,1},{0,0,0,1}}};
static int py[7][4][4]={{{-1,0,0,-1},{-1,0,0,-1},{-1,0,0,-1},{-1,0,0,-1}},
{{-3,0,-1,-2},{0,0,0,0},{-3,0,-1,-2},{0,0,0,0}},
{{-2,0-1,-1},{-1,0,0,-1},{-2,0-1,-1},{-1,0,0,-1}},
{{-2,0,-1,-1},{-1,0,-1,0},{-2,0,-1,-1},{-1,0,-1,0}},
{{-2,0,-2,-1},{-1,0,-1,-1},{-2,0,-1,0},{-1,0,0,0}},
{{-2,0,-1,-2},{-1,0,-1,-1},{-2,0,-0,-1},{-1,0,0,0}},
{{-1,0,0,0},{-2,0,-1,-1},{-1,0,-1,-1},{-2,0,-1,-1}}};


int fen=0;

typedef struct node
{
int a[10];
int num;
struct node *next,*parent;
}Node;

Node *head;

void InitNode()
{
Node *p1,*p2;
p1=(Node*)malloc(sizeof(Node));
head=p1;
p1->next=NULL;
p1->parent=NULL;
for(int i=0;i<18;++i)
{
p2=(Node*)malloc(sizeof(Node));
p2->num=0;
for(int j=0;j<10;++j)p2->a[j]=0;
p1->next=p2;
p2->parent=p1;
p1=p2;
}
p1->next=NULL;
for(int j=0;j<10;++j)p1->a[j]=1;
head=head->next->next->next; //头指针上面再留三节点,用于后面判断是否有方块
}

void go(int x,int y) //光标移动
{
COORD point={2*x+2,y};
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),point);
}

void DelNode()
{
Node *p;
for(int i=0;i<15;i++)
{
p=head;
head=head->next;
delete(p);
}
delete(head);
}

int GetNum(int b) //小于b的随机数
{
srand(time(NULL));
int a=rand()%b;
return a;
}

void PrintBox(int x,int y) //显示移动方块
{
if(y<0)return;
go(x,y);
cout<<"■";
}
void ClearBox(int x,int y) //消方块
{
go(x,y);
cout<<" ";
}

void Print() //重新输出起到消行作用
{
Node *p;
system("cls");
p=head->next;
for(int i=0;i<15;++i)
{
cout<<"■";
for(int j=0;j<10;j++)
{
if(p->a[j])cout<<"■";
else cout<<" ";
}
cout<<"■"<<endl;
p=p->next;
}
go(15,4);cout<<"↑ 变形";
go(15,5);cout<<"↓ 加速";
go(15,6);cout<<"← 左移";
go(15,7);cout<<"→ 右移";
go(15,8);cout<<"空格 下降";
go(15,9);cout<<"回车 暂停";
go(15,10);cout<<"得分: "<<fen;
}

bool CheckBox(int a,int b,int c,Node *p) //检查是否有禁止的方块
{
Node *q;
for(int i=0;i<4;i++)
{
switch(py[a][b][i])
{
case 0:q=p;break;
case -1:q=p->parent;break;
case -2:q=p->parent->parent;break;
case -3:q=p->parent->parent->parent;break;
}
if(q->a[px[a][b][i]+c])return true;
}
return false;
}

void Stop(int a,int b,int c,int d) //暂停
{
system("cls");
int boutt;
go(10,5);
cout<<"休息,休息一会";
go(10,6);
cout<<"按回车键继续";
do
{
boutt=getch();
}while(boutt!=13);
Print();
for(int i=0;i<4;i++)
PrintBox(px[a][b][i]+c,py[a][b][i]+d);
}

int Check(int a,int b,int c,int d,Node *p) //判断变形时是否有障碍物,并作出处理,成功处理返回真,处理失败返回假
{
int cc=c;
b++;
if(px[a][b][2]+c<0)cc=0-px[a][b][2];
if(px[a][b][3]+c>9)cc=9-px[a][b][3];
if(CheckBox(a,b,cc,p))return 0;
return cc;
}

void Control(int a,int &b,int &c,int d,int &n,Node *p)
{
int boutt,i,cc;
if(kbhit())
{
do
{
boutt=getch();
}while(boutt==224);
}
switch(boutt)
{
case 72:if((cc=Check(a,b,c,d,p))!=0)
{
for(i=0;i<4;i++)
ClearBox(px[a][b][i]+c,py[a][b][i]+d);
b++;
c=cc;
if(b==4)b=0;
for(i=0;i<4;i++)
PrintBox(px[a][b][i]+c,py[a][b][i]+d);
}
break;
case 75:if(px[a][b][2]+c>0)
{
if(CheckBox(a,b,c-1,p->next))break;
for(i=0;i<4;i++)
ClearBox(px[a][b][i]+c,py[a][b][i]+d);
c--;
for(i=0;i<4;i++)
PrintBox(px[a][b][i]+c,py[a][b][i]+d);
}
break;
case 77:if(px[a][b][3]+c<9)
{
if(CheckBox(a,b,c+1,p->next))break;
for(i=0;i<4;i++)
ClearBox(px[a][b][i]+c,py[a][b][i]+d);
c++;
for(i=0;i<4;i++)
PrintBox(px[a][b][i]+c,py[a][b][i]+d);
}
break;
case 80:n=1;break;
case 32:n=0;break;
case 13:Stop(a,b,c,d);break;
}
}

void ClearLine(Node *p) //消行
{
Node *p1,*p2;
p1=p->next;
p2=p->parent;
p2->next=p1;
p1->parent=p2;
p1=head->next;
head->next=p;
p->next=p1;
p1->parent=p;
p->parent=head;
p->num=0;
for(int i=0;i<10;i++)p->a[i]=0;
}

void End(int fen)
{
system("cls");
go(10,5);
cout<<"游戏结束!!!"<<endl;
go(10,6);
cout<<"得分:"<<fen<<endl;
}

void main()
{
Node *p,*q;
InitNode();
int a,b;
Print();
while(1)
{
int n=10;
int c=5;
p=head->next;
a=GetNum(7);
b=GetNum(4);
for(int d=1;d<15;d++)
{
bool bb=0;
if(CheckBox(a,b,c,p->next))bb=1;
if(bb)
{
for(int i=0;i<4;i++)
{
switch(py[a][b][i])
{
case 0:q=p;break;
case -1:q=p->parent;break;
case -2:q=p->parent->parent;break;
case -3:q=p->parent->parent->parent;break;
}
q->a[px[a][b][i]+c]=1;
q->num++;
}
}
for(int i=0;i<4;i++)
{
if(bb)PrintBox(px[a][b][i]+c,py[a][b][i]+d-1);
else PrintBox(px[a][b][i]+c,py[a][b][i]+d);
}
if(!bb)
{
for(i=0;i<n;i++)
{
Control(a,b,c,d,n,p);
Sleep(50);
}
for(i=0;i<4;i++)
{
ClearBox(px[a][b][i]+c,py[a][b][i]+d);
}
}
else break;
p=p->next;
}
q=head->next;
for(int i=0,f=0;i<15;++i)
{
if(q->num==10)
{
p=q->next;
ClearLine(q);
f++;
q=p;
}
else q=q->next;
}
fen=fen+(f*f);
if(f)Print();
if(head->num)
{
End(fen);
break;
}
}
DelNode();
}
socrates 2011-01-27
  • 打赏
  • 举报
回复
贴代码时至少排个版啊,让读者容易看些哈~
acdbxzyw 2011-01-27
  • 打赏
  • 举报
回复
前 言 visual basic继承了basic语言易学易用的特点,特别适合于初学者学习windows系统编程。随着21世纪信息社会的到来,计算机在人们的工作和生活中的深入,要我们越来越多地与计算机打交道,为了使用户在繁忙的日程工作中得到放松,于是出现了各种各样的休闲软件,如聊天工具,游戏等等。于是我们小组着手设计开始一个这样的游戏软件。通过这学期来Visual Basic的学习,我初步掌握了Visual Basic语言的最基本的知识,于是在化希耀张兵等老师的指导下动手用Visual Basic编写俄罗斯方块游戏。 无可争议,《俄罗斯方块》是有史以来最伟大的游戏之一。它是永恒的娱乐经典,但它实际上又和那些传统的经典娱乐方式不同,因为它的本质是电子化的,所以它的确属于现代产物。《俄罗斯方块》举世闻名的游戏性,在该游戏新鲜出炉时就显得非常直观。某些与坠落的玩具碎片和它们的形状有关的东西,使得哪怕新手也会很自然地企图把它们排列起来,并加以适当组合,就好似《俄罗斯方块》触动了我们某些内在的感官,使得哪怕是我们当中最杂乱无章的人也要把事情整理妥当。 在曾经发布过的所有游戏中,《俄罗斯方块》还被认为是仅有的一个能够真正吸引广泛人群的作品。某些批评家也许会声称,《俄罗斯方块》要比过去二十年间出现的任何东西都要浪费人们的时间。至于我们,则要欣然提名它为GameSpot评选出的历史上最伟大游戏之一。 为了怀念经典,也为了能够给大多的计算机用户在工作之余找到一个休闲、娱乐的一个方式,我们小组开始着手用VB语言开发一个经典的俄罗斯方块游戏。 工程概况 1.1 项目名称 俄罗斯方块游戏 1.2 设计平台 VB 全称Visual Basic,它是以Basic语言作为其基本语言的一种可视化编程工具。 Vb是microsoft公司于1991年退出的windows应用程序开发工具visual意思是“可视化的”。在它刚推出来时,自身还存在一些缺陷,功能也相对少一些。但是经过多年的开发研究。最近microsoft公司又推出了VB6.0版本 VB6.0运行环境:硬件,要486以上的处理器、16MB以上内存,50MB 以上的硬盘,cd-rom驱动器,鼠标。软件:要windows 95以上版本。 1.3程序设计思想 游戏是用来给大家娱乐的,所以要能在使用的过程中给大家带来快乐,消除大家的疲劳,所以我们在游戏中添加了漂亮的场景和动听的音乐,设置了过关升级的功能,激发大家的娱乐激情。 从游戏的基本玩法出发,主要就是俄罗斯方块的形状和旋转,我们在设计中在一个图片框中构造了一个4*4的网状小块,由这些小块组合成新的形状,每四个小块连接在一起就可以构造出一种造型,因此我们总共设计了7中造型,每种造型又可以通过旋转而变化出2到4种形状,利用随机函数在一个预览窗体中提前展示形状供用户参考,然后将展示的形状复制到游戏窗体中进行摆放,在游戏窗体中用户就可以使用键盘的方向键来控制方块的运动,然后利用递归语句对每一行进行判断,如果有某行的方块是满的,则消除这行的方块,并且使上面的方块自由下落,其中,方块向下的速度是有时钟控件控制的,在游戏中,用户也可以使用向下键加快下落速度,定义一个变量,对消除的函数进行记录,最后就可以得出用户的分数,用if 语句对分数判断,达到一定的积分就可以升级到下一个档次。 俄罗斯方块游戏设计的主要步骤为以下10个方面: (1)游戏界面的设计。 (2)俄罗斯方块的造型。 (3)俄罗斯方块的旋转。 (4)俄罗斯方块的运动情况(包括向左,向右和向下)。 (5)俄罗斯方块的自动消行功能。 (6)游戏级别的自由选择。 (7)游戏速度的自由选择。 (8)游戏得分的计算。 (9)游戏菜单选项的设计及功能实现。 (10)游戏的背景音乐。 1.4运用的控件和主要对象 我们在设计过程中主要用到的控件有:command控件,image控件,picture控件,label控件,timer控件,text控件,windows media player控件等等。 1.5主要实现的功能 我们开发的俄罗斯方块游戏,主要实现了以下几种功能: 1.可以灵活控制方块在图形框中运动。 2.游戏过程中方块可以自由旋转。 3.当某一行的方块排列满时,将自动将这一行方块消除,然后将上面所有方块向下移动,可以支持连续消行。 4.游戏前可以选择游戏的速度和游戏的等级,游戏速度既为方块下落速度,游戏等级为初始游戏时在基层随机生成一定行数的无规律方块,生成的行数由你来选择,每行至少产生5个以上的无规律方块,这样增加了游戏难度,对于游戏高手来说,无疑不是一个新的挑战。 5.游戏的得分支持积分,并且按照公式: 得分 = 原来分数+ 100 * (2 ^ 同时消除的行数-1) 这样,你同一时间消除

64,666

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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