首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

俄罗斯方块游戏

#include

#include

#include

#include

#include

#define M 10 //面板横轴

#define N 22 //面板高度

void gotoxy(int x, int y);//移动光标

int color(int c);//设置方块颜色

void show();//绘制游戏界面

void keyboardControl();//输入游戏指令

void random();//随机生成方块

void change();//方块下降

void judge1();//方块落地判断

void HideCursor();//隐藏光标,避免闪屏

int judge2();//方块左右移动判断

int judge3();//方块边方向判断

void drew();//背景框

int map[M][N]=;//二维数组表示面板

int score=0;//分数

int a;//7个方块的代号

int c;//下一个方块代号

int b=0;//一个开关

int F[2]=;//方块的中心点位置坐标

int f=0;//不同形状的代号

int n=1;//难度

void gotoxy(int x, int y) {

COORD c;

c.X = x;

c.Y = y;

SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), c);

}

int color(int c){

SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), c); //更改文字颜色

return 0;

}

void show(){

int i,j;

color(8);

gotoxy(M*2+4,1);

printf("分数:%d",score);

gotoxy(M*2+4,5);

printf("难度:%d",n);

gotoxy(M*2+4,9);

printf("下一个方块:");

color(8);

switch(c){

case 0:

gotoxy(M*2+6,11);

printf(" ");

gotoxy(M*2+6,12);

printf("■■■■");

break;

case 1:

gotoxy(M*2+6,11);

printf(" ■■ ");

gotoxy(M*2+6,12);

printf(" ■■ ");

break;

case 2:

gotoxy(M*2+6,11);

printf(" ■ ");

gotoxy(M*2+6,12);

printf("■■■ ");

break;

case 4:

gotoxy(M*2+6,11);

printf(" ■■ ");

gotoxy(M*2+6,12);

printf("■■ ");

break;

case 3:

gotoxy(M*2+6,11);

printf("■■ ");

gotoxy(M*2+6,12);

printf(" ■■ ");

break;

case 5:

gotoxy(M*2+6,11);

printf("■ ");

gotoxy(M*2+6,12);

printf("■■■ ");

break;

case 6:

gotoxy(M*2+6,11);

printf(" ■ ");

gotoxy(M*2+6,12);

printf("■■■ ");

break;

}

for(j=2;j

for(i=0;i

gotoxy(i*2+2,j-1);

switch(map[i][j]){

case 0:

color(0);

printf(" ");

break;

case 1:

color(56);

printf("■");

break;

case 2:

color(56);

printf("■");

break;

}

}

}

}

void keyboardControl(){

char c;

int i,j;

if(kbhit()){

c=getch();

}

if(c=='w' || c=='W'){

b=0;

while(b==0){

change();

judge1();

}

b=0;

}

else if(c=='s' || c=='S'){

change();

judge1();

}

else if(c=='a' || c=='A'){

if(judge2()!=1){

F[0]--;

for(i=0;i

for(j=N-1;j>=0;j--){

if(map[i][j]==2){

map[i-1][j]=2;

map[i][j]=0;

}

}

}

}

}

else if(c=='d' || c=='D'){

if(judge2()!=2){

F[0]++;

for(i=M-1;i>=0;i--){

for(j=N-1;j>=0;j--){

if(map[i][j]==2){

map[i+1][j]=2;

map[i][j]=0;

}

}

}

}

}else if(c==' '){

switch(a){

case 0:

if(f==0&&judge3()==1){

map[F[0]-1][F[1]]=0;

map[F[0]+1][F[1]]=0;

map[F[0]+2][F[1]]=0;

map[F[0]][F[1]-1]=2;

map[F[0]][F[1]+1]=2;

map[F[0]][F[1]-2]=2;

f=1;

}else if(f==1&&judge3()==1){

map[F[0]-1][F[1]]=2;

map[F[0]+1][F[1]]=2;

map[F[0]+2][F[1]]=2;

map[F[0]][F[1]-1]=0;

map[F[0]][F[1]+1]=0;

map[F[0]][F[1]-2]=0;

f=0;

}

break;

case 2:

if(f==0&&judge3()==1){

map[F[0]+1][F[1]]=0;

map[F[0]][F[1]+1]=2;

f=1;

}else if(f==1&&judge3()==1){

map[F[0]][F[1]-1]=0;

map[F[0]+1][F[1]]=2;

f=2;

}else if(f==2&&judge3()==1){

map[F[0]-1][F[1]]=0;

map[F[0]][F[1]-1]=2;

f=3;

}else if(f==3&&judge3()==1){

map[F[0]][F[1]+1]=0;

map[F[0]-1][F[1]]=2;

f=0;

}

break;

case 3:

if(f==0&&judge3()==1){

map[F[0]+1][F[1]]=0;

map[F[0]-1][F[1]-1]=0;

map[F[0]-1][F[1]]=2;

map[F[0]-1][F[1]+1]=2;

f=1;

}else if(f==1&&judge3()==1){

map[F[0]+1][F[1]]=2;

map[F[0]-1][F[1]-1]=2;

map[F[0]-1][F[1]]=0;

map[F[0]-1][F[1]+1]=0;

f=0;

}

break;

case 4:

if(f==0&&judge3()==1){

map[F[0]+1][F[1]-1]=0;

map[F[0]-1][F[1]]=0;

map[F[0]+1][F[1]]=2;

map[F[0]+1][F[1]+1]=2;

f=1;

}else if(f==1&&judge3()==1){

map[F[0]+1][F[1]-1]=2;

map[F[0]-1][F[1]]=2;

map[F[0]+1][F[1]]=0;

map[F[0]+1][F[1]+1]=0;

f=0;

}

break;

case 5:

if(f==0&&judge3()==1){

map[F[0]+1][F[1]]=0;

map[F[0]-1][F[1]-1]=0;

map[F[0]][F[1]-1]=2;

map[F[0]][F[1]-2]=2;

f=1;

}else if(f==1&&judge3()==1){

map[F[0]][F[1]]=0;

map[F[0]-1][F[1]]=0;

map[F[0]][F[1]-2]=0;

map[F[0]-1][F[1]-1]=2;

map[F[0]+1][F[1]-1]=2;

map[F[0]+1][F[1]]=2;

f=2;

}else if(f==2&&judge3()==1){

map[F[0]+1][F[1]]=0;

map[F[0]+1][F[1]-1]=0;

map[F[0]-1][F[1]]=2;

map[F[0]-1][F[1]+1]=2;

f=3;

}else if(f==3&&judge3()==1){

map[F[0]][F[1]-1]=0;

map[F[0]-1][F[1]+1]=0;

map[F[0]][F[1]]=2;

map[F[0]+1][F[1]]=2;

f=0;

}

break;

case 6:

if(f==0&&judge3()==1){

map[F[0]+1][F[1]-1]=0;

map[F[0]-1][F[1]]=0;

map[F[0]][F[1]-1]=2;

map[F[0]][F[1]-2]=2;

f=1;

}else if(f==1&&judge3()==1){

map[F[0]][F[1]]=0;

map[F[0]+1][F[1]]=0;

map[F[0]][F[1]-2]=0;

map[F[0]+1][F[1]-1]=2;

map[F[0]-1][F[1]-1]=2;

map[F[0]-1][F[1]]=2;

f=2;

}else if(f==2&&judge3()==1){

map[F[0]-1][F[1]]=0;

map[F[0]-1][F[1]-1]=0;

map[F[0]+1][F[1]]=2;

map[F[0]+ 1][F[1]+1]=2;

f=3;

}else if(f==3&&judge3()==1){

map[F[0]][F[1]-1]=0;

map[F[0]+1][F[1]+1]=0;

map[F[0]][F[1]]=2;

map[F[0]-1][F[1]]=2;

f=0;

}

break;

}

}

}

void random(){

int i;

srand(time(NULL));

a=c;

c=rand()%7;

b=1;

f=0;

for(i=0;i

if(map[i][0]==1||map[i][1]==1){

gotoxy(0,N+2);

color(8);

printf("game over!");

exit(0);

}

}

switch(a){

case 0:

map[M/2-2][1]=2;

map[M/2-1][1]=2;

map[M/2][1]=2;

map[M/2+1][1]=2;

F[0]=M/2-1;F[1]=1;

break;

case 1:

map[M/2-1][0]=2;

map[M/2][0]=2;

map[M/2-1][1]=2;

map[M/2][1]=2;

break;

case 2:

map[M/2-2][1]=2;

map[M/2-1][1]=2;

map[M/2][1]=2;

map[M/2-1][0]=2;

F[0]=M/2-1;F[1]=1;

break;

case 3:

map[M/2-2][0]=2;

map[M/2-1][0]=2;

map[M/2-1][1]=2;

map[M/2][1]=2;

F[0]=M/2-1;F[1]=1;

break;

case 4:

map[M/2-2][1]=2;

map[M/2-1][1]=2;

map[M/2-1][0]=2;

map[M/2][0]=2;

F[0]=M/2-1;F[1]=1;

break;

case 5:

map[M/2-2][1]=2;

map[M/2-1][1]=2;

map[M/2][1]=2;

map[M/2-2][0]=2;

F[0]=M/2-1;F[1]=1;

break;

case 6:

map[M/2-2][1]=2;

map[M/2-1][1]=2;

map[M/2][1]=2;

map[M/2][0]=2;

F[0]=M/2-1;F[1]=1;

break;

}

}

void change(){

int i,j;

for(i=M-1;i>=0;i--){

for(j=N-1;j>=0;j--){

if(map[i][j]==2){

map[i][j+1]=map[i][j];

map[i][j]=map[i][j-1];

}

}

}

for(i=0;i

map[i][0]=0;

}

F[1]++;

}

void judge1(){

int flag=0;

int i,j,k;

//判断落地

for(i=0;i

if(map[i][N-1]==2){

flag=1;

break;

}

}

for(i=M-1;i>=0;i--){

for(j=N-2;j>0;j--){

if(map[i][j]==2&&map[i][j+1]==1){

flag=1;

break;

}

}

}

//刷新方块

if(flag==1){

for(i=M-1;i>=0;i--){

for(j=N-1;j>=0;j--){

if(map[i][j]==2){

map[i][j]=1;

}

}

}

random();

}

//判断是否消除

for(k=0;k

for(i=0;i

if(map[i][k]!=1){

break;

}

}

if(i==M){

score+=M;

for(j=k;j>0;j--){

for(i=0;i

if(map[i][j]==1){

map[i][j]=map[i][j-1];

}

}

}

}

}

}

void HideCursor(){

CONSOLE_CURSOR_INFO cursor_info = ;

SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cursor_info);

}

int judge2(){

int i;

int flag=0;

for(i=0;i

if(map[0][i]==2){

flag=1;

break;

}

}

for(i=0;i

if(map[M-1][i]==2){

flag=2;

break;

}

}

return flag;

}

int judge3(){

int flag=1;

switch(a){

case 0:

if(f==0){

if(F[1]==1)flag=0;

if(F[1]==N-1)flag=0;

if(map[F[0]][F[1]-1]==1)flag=0;

if(map[F[0]][F[1]-2]==1)flag=0;

if(map[F[0]][F[1]+1]==1)flag=0;

}else if(f==1){

if(map[F[0]-1][F[1]]==1)flag=0;

if(map[F[0]-2][F[1]]==1)flag=0;

if(map[F[0]+1][F[1]]==1)flag=0;

if(F[0]==0||F[0]==M-1||F[0]==M-2)flag=0;

}

break;

case 2:

if(f==0){

if(F[1]==N-1)flag=0;

if(map[F[0]][F[1]+1]==1)flag=0;

}else if(f==1){

if(F[0]==M-1)flag=0;

if(map[F[0]+1][F[1]]==1)flag=0;

}else if(f==2){

if(F[1]==N)flag=0;

if(map[F[0]][F[1]-1]==1)flag=0;

}else if(f==3){

if(F[0]==0)flag=0;

if(map[F[0]-1][F[1]]==1)flag=0;

}

break;

case 3:

if(f==0){

if(F[1]==N-1)flag=0;

if(map[F[0]-1][F[1]]==1)flag=0;

if(map[F[0]-1][F[1]+1]==1)flag=0;

}else if(f==1){

if(F[0]==M-1)flag=0;

if(map[F[0]+1][F[1]]==1)flag=0;

if(map[F[0]-1][F[1]-1]==1)flag=0;

}

break;

case 4:

if(f==0){

if(F[1]==N-1)flag=0;

if(map[F[0]+1][F[1]]==1)flag=0;

if(map[F[0]+1][F[1]+1]==1)flag=0;

}else if(f==1){

if(F[0]==0)flag=0;

if(map[F[0]-1][F[1]]==1)flag=0;

if(map[F[0]+1][F[1]-1]==1)flag=0;

}

break;

case 5:

if(f==0){

if(F[1]==1)flag=0;

if(map[F[0]][F[1]-2]==1)flag=0;

if(map[F[0]][F[1]-1]==1)flag=0;

}else if(f==1){

if(F[0]==M-1)flag=0;

if(map[F[0]-1][F[1]-1]==1)flag=0;

if(map[F[0]+1][F[1]]==1)flag=0;

if(map[F[0]+1][F[1]-1]==1)flag=0;

}else if(f==2){

if(F[1]==N-1)flag=0;

if(map[F[0]-1][F[1]]==1)flag=0;

if(map[F[0]-1][F[1]+1]==1)flag=0;

}else if(f=3){

if(F[0]==M-1)flag=0;

if(map[F[0]][F[1]]==1)flag=0;

if(map[F[0]+1][F[1]]==1)flag=0;

}

break;

case 6:

if(f==0){

if(F[1]==1)flag=0;

if(map[F[0]][F[1]-2]==1)flag=0;

if(map[F[0]][F[1]-1]==1)flag=0;

}else if(f==1){

if(F[0]==0)flag=0;

if(map[F[0]-1][F[1]-1]==1)flag=0;

if(map[F[0]-1][F[1]]==1)flag=0;

if(map[F[0]+1][F[1]-1]==1)flag=0;

}else if(f==2){

if(F[1]==N-1)flag=0;

if(map[F[0]+1][F[1]]==1)flag=0;

if(map[F[0]+1][F[1]+1]==1)flag=0;

}else if(f=3){

if(F[0]==0)flag=0;

if(map[F[0]][F[1]]==1)flag=0;

if(map[F[0]-1][F[1]]==1)flag=0;

}

break;

}

return flag;

}

void drew(){

int i;

for(i=0;i

gotoxy(i*2,0);

printf("■");

gotoxy(i,N-1);

printf("■");

}

for(i=0;i

gotoxy(0,i);

printf("■");

gotoxy(M*2+2,i);

printf("■");

gotoxy(M*2+16,i);

printf("■");

}

gotoxy(0,24);

}

void menu(){

char m1;

char n1;

while(1)

{

system("cls");

printf("俄罗斯方块\n\t1.开始游戏\n\t2.游戏说明\n");

printf("注:修改源码7,8行定义的宏中M,N的值可改变方块边界的长和宽");

m1=getchar();

if(m1=='1')

{

do{

system("cls");

printf("请选择游戏难度\n\t1.菜鸟\n\t2.老手\n\t3.变态\n");

n1=getchar();

}while(n1!='1' && n1!='2' && n1!='3');

if(n1=='1'){

n=3;

}else if(n1=='2'){

n=2;

}else if(n1=='3'){

n=1;

}

break;

}

else if(m1=='2')

{

system("cls");

getchar();

printf("请使用a,d或者,A,D控制方块左右移动\n");

printf("请使用s或者S使得方块额外下移一格\n");

printf("请使用w或者W使得方块额外下移一格\n");

printf("请使用空格使得方块直接落到低端\n");

printf("请按回车键返回开始菜单!\n");

getchar();

}

}

}

int main(){

int i=0;

menu();

drew();

random();

while(1){

show();

HideCursor();

keyboardControl();

if(i==n*10){

judge1();

change();

i=0;

}else{

i++;

}

}

}

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20200520A0HW5300?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券