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

谢攀琪 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();
}
]
...全文
177 10 打赏 收藏 转发到动态 举报
AI 作业
写回复
用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
  • 打赏
  • 举报
回复

65,187

社区成员

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

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