整容说文库 > 程序代码 > 教育资讯

俄罗斯方块的问题

来源:学生作业帮助网 编辑:整容说文库 时间:2020/01/20 00:44:37 程序代码
俄罗斯方块的问题程序代码
想写一个俄罗斯方块 不用图形库的,但是写了一半不知道怎么写了,而且变形的方块跟别人的怎么不一样,Z型的方块和长型的方块怎么变的是四种位置,想请有经验的人指导下思想,或者跟我一样的小白一起来讨论,被困扰好些天了,实在没办法了!不要沉了啊!
#include "stdafx.h"
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <time.h>

#define ROW 15
#define COL 10


int map[ROW][COL]={0};

int changbox[4][4]={0};//变形盒子

int Nextbox[4][4]={0};//显示下一个方块的盒子

int Curbox[4][4]={0};//准备投影在地图上的盒子

int box[7][4][4]={
//右Z
{0,1,1,0,
1,1,0,0,
0,0,0,0,
0,0,0,0},
//左Z
{1,1,0,0,
 0,1,1,0,
 0,0,0,0,
 0,0,0,0},
//----
{0,1,0,0,
 0,1,0,0,
 0,1,0,0,
 0,1,0,0},
//正方形
{0,1,1,0,
 0,1,1,0,
 0,0,0,0,
 0,0,0,0},
//左L
{0,1,0,0,
 0,1,0,0,
 1,1,0,0,
 0,0,0,0},
//右L
{0,1,0,0,
 0,1,0,0,
 0,1,1,0,
 0,0,0,0},
 //三角
{0,1,0,0,
 1,1,1,0,
 0,0,0,0,
 0,0,0,0}

};//方块种类盒子

int x=4,y=0;//地图上坐标

int nextmode=0,curmode=0;//下一个方块的模型,当前方块的模型

void Drawmap(void);//画地图
void Curtomap(void);//当前方块投影到地图
void Changetocur(void);//变形后的方块到当前方块
void bianxing(void);//方块变形
void Drawnextbox(void);//画出下一个盒子
void Initnextbox(void);//初始化显示下一个方块的盒子
void Initcurbox(void);//初始化当前方块的盒子
int judgemove(int x1,int y1);//判断是否可以移动,有错误,不知道怎么写


int main(int argc, char* argv[])
{

srand((unsigned int)time(NULL));
nextmode=rand()%7;
curmode=rand()%7;
char ch;

Initcurbox();
Initnextbox();
Drawnextbox();
Curtomap();
Drawmap();
while((ch=getch())!='q'){

switch(ch)
{
case 's':
{
y++;

Curtomap();
}
break;
case 'd':
{
x++;
if(judgemove(x,y)){
;
}
else{
x--;
Curtomap();
}

}
break;
case 'a':
{
x--;

Curtomap();
}
break;
case 'w':
{
if (curmode==3) break;
bianxing();
Changetocur();
Curtomap();

}
break;
}
system("cls");
Initnextbox();
Drawnextbox();
Drawmap();

}
return 0;
}

void Initcurbox(void)//初始化当前方块
{
int i,j;

for(i=0;i<4;++i)
for(j=0;j<4;++j)
{
Curbox[i][j]=box[curmode][i][j];
}
}

void Initnextbox(void)//初始化下一个方块
{
int i,j;
for(i=0;i<4;++i)
for(j=0;j<4;++j)
{
Nextbox[i][j]=box[nextmode][i][j];
}
}

void Curtomap(void)//把当前的方块投影到地图
{
int i,j;
for(i=0;i<4;++i)
for(j=0;j<4;++j)
{
if(Curbox[i][j]==1)//这句防止BOX数组在地图上越界了 只有为1的时候 才赋值
map[i+y][j+x]=Curbox[i][j];
}
}

void Drawnextbox(void)//画下一个方块
{
int i,j;

for(i=0;i<4;++i){

for(j=0;j<4;++j)
{
if(Nextbox[i][j]==1)
printf("实心");//用输入法打的实心的正方形,帖子里不允许特殊字符
else
printf("空心");//用输入法答应的空心的正方形
Nextbox[i][j]=0;
}
printf("\n");
}
printf("\n");
}

void Drawmap(void)//画地图
{
int i,j;

for(i=0;i<4;++i)
for(j=0;j<4;++j)
{
if(Curbox[i][j]==1)
map[y+i][j+x]=1;
}
for(i=0;i<ROW;++i){
for(j=0;j<COL;++j)
{
if(i==ROW-1||j==0||j==COL-1)
map[i][j]=1;
if(map[i][j]==1)
printf("实心");
else
{
map[i][j]=0;
printf("空心");
}
}
printf("\n");
}
for(i=0;i<4;++i)
for(j=0;j<4;++j)
{
if(Curbox[i][j]==1)
map[i+y][j+x]=0;
}


}




void Changetocur(void)
{
int i,j;
for(i=3;i>=0;--i)
for(j=3;j>=0;--j)
{
Curbox[i][j]=0;//将当前方块置0
Curbox[i][j]=changbox[i][j];
changbox[i][j]=0;
}

}

void bianxing(void)
{
int i,j;

for(i=3;i>=0;--i)
for(j=3;j>=0;--j)
{
if(Curbox[i][j]==1)
{
if(curmode!=2)
{
int temp;
temp=Curbox[i][j];
Curbox[i][j]=changbox[-1*j+2][i];
changbox[-1*j+2][i]=temp;

}
    else
{
int temp;
temp=Curbox[i][j];
Curbox[i][j]=changbox[-1*j+3][i];
changbox[-1*j+3][i]=temp;

}

}
}
}

int judgemove(int x1,int y1)
{
int i=0,j=0;

for(;i<4;++i)
for(;j<4;++j)
{
if(Curbox[i][j]==1&&map[i+y1][j+x1]==1)
return 0;
}
return 1;
}
http://wenku.baidu.com/view/b99f3afdc8d376eeaeaa31ae.html

很详细的教程,认真学习下很容易学会。
程序代码