趣味俄罗斯方块
朱小磊
朱小磊

+关注

发布时间:2020-06-07 16:57

/*******定义全局变量********/

int i,j,Temp,Temp1,Temp2;//temp,temp1,temp2用于记住和转换方块变量的值

//标记游戏屏幕的图案:2,1,0分别表示该位置为游戏边框、方块、无图案;初始化为无图案

int a[80][80]={0};

int b[4];//标记4个“口 ”方块,1表示有方块,0表示无方块 

struct Tetris                   //声明俄罗斯方块的结构体

{

int x;//中心方块的 x轴坐标 

int y;//中心方块的 y轴坐标 

int flag;//标记方块类型的序号 

int next;//下一个俄罗斯方块类型的序号 

int speed;//方块的移动速度 

int number;//产生俄罗斯方块的个数 

int score;//游戏的分数 

int level;//游戏的等级 

};

HANDLE hOut;//控制台句柄 


#ifndef _MAIN_H

#define _MAIN_H


/******宏定义********/

 #define FrameX 13//游戏窗口左上角的X轴坐标为 13

 #define FrameY 3//游戏窗口左上角的Y轴坐标为 3

 #define Frame_height 20 //游戏窗口的高度为20

 #define Frame_width 18//游戏窗口的宽度为18 

int color(int c);

void gotoxy(int x, int y);//光标移动到指定位置

void DrwaGameFrame();//绘制游戏边框

void Flag(struct Tetris * tetris);//随机产生方块类型的序号

void MakeTetris(struct Tetris * tetris);//制作俄罗斯方块

void PrintTetris(struct Tetris * tetris);//打印俄罗斯方块

void CleanTetris(struct Tetris *tetris);//清除俄罗斯方块的痕迹

int ifMove(struct Tetris * tetris);//判断是否可以移动,返回值为 1 时可以移动,否则不能移动

void Del_Fullline(struct Tetris * tetris);//判断是否满行,并删除满行的俄罗斯方块

void Gameplay();//开始游戏

void regulation();//游戏规则

void explation();//按键说明

void welcome();//欢迎界面

void Replay();//重新开始游戏

void title();//欢迎界面上方的标题

void flower();//欢迎界面上的字符画装饰

void close();//关闭游戏 

#endif

//主函数


int main(void)

{

title();

flower();

welcome();

return 0;

}


#include<stdio.h>    //标准输入输出函数库 

#include<windows.h>  //控制DOS界面(获取控制台的坐标位置、设置字体颜色) 

#include<conio.h>//接受键盘的输入输出(kbhit(),getch()) 

#include<time.h> //用于获得随机数

#include"hong.h"

#include"quan.h"

#include"main.h"

 void gotoxy(int x, int y)

 {

 COORD pos={0.0};

 pos.X = x;//横坐标

pos.Y= y;//纵坐标

SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),pos); 

  } 

  int color(int c)

 {

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

return 0; 

  } 

  void title()

 {

 color(15);

 gotoxy(24,3);//亮白色

printf("趣  味  俄  罗  斯  方  块\n"); //输出标题

color(11);//亮蓝色

gotoxy(18,5);

printf("■");

gotoxy(18,6);

printf("■■");

gotoxy(18,7);

printf("■");

color(14);//黄色 

gotoxy(26,6); 

printf("■■");

gotoxy(28,7);

printf("■■");

color(10);//绿色

gotoxy(36,6);

printf("■■");

gotoxy(36,7);

printf("■■");

color(13);//粉色

gotoxy(45,5);

printf("■");

gotoxy(45,6);

printf("■");

gotoxy(45,7);

printf("■");

gotoxy(45,8);

printf("■");

color(12);//亮红色

gotoxy(56,6);

printf("■");

gotoxy(52,7);

printf("■■■"); 

 

  } 

  void flower()

 {

 gotoxy(66,11);

 color(12);

 printf("(_)");

 

 gotoxy(64,12);

 printf("(_)");

 

 gotoxy(68,12);

 printf("(_)");

 

 gotoxy(66,13);

 printf("(_)");

 

 gotoxy(67,12);

color(6);

printf("@");

gotoxy(72,10);

color(13);

printf("(_)"); 

gotoxy(76,10);

printf("(_)");

gotoxy(74,9);

printf("(_)");

gotoxy(74,11);

printf("(_)");

gotoxy(75,10);

color(6);

printf("@");

gotoxy(71,12);

printf("|");

gotoxy(72,11);

printf("/");

gotoxy(70,13);

printf("\\|");

gotoxy(70,14);

printf("`|/");

gotoxy(70,15);

printf("\\|");

gotoxy(71,16);

printf("| /");

gotoxy(71,17);

printf("|");

gotoxy(67,17);

color(10);

printf("\\\\\\\\");

gotoxy(73,17);

printf("//");

gotoxy(67,18);

color(2);

printf("^^^^^^^^");

gotoxy(65,19);

color(5);

printf("明 日 科 技");

gotoxy(68,20);

printf("朱小磊"); 

  }

void welcome()

{

int n;

int i,j;

for(i=9; i<=20; i++){

for(j=15; j<=60; j++){

gotoxy(j,i);

if(i == 9 || i == 20)

printf("=");

else if(j == 15 || j == 59)

printf("||");

}

}

    color(12);

gotoxy(25,12);

printf("1.开始游戏");

gotoxy(40,12);

printf("2.按键说明");

gotoxy(25,17);

printf("3.游戏规则");

gotoxy(40,17);

printf("4.退出");

gotoxy(21,22);

color(3);

printf("请选择[1 2 3 4]:[ ]\b\b");

color(14);

scanf("%d", &n);

switch(n)

{

case 1:

system("cls");

DrwaGameFrame();

Gameplay();

break;

case 2:

explation();

break;

case 3:

regulation();

break;

case 4:

close();

break;

}

   } 

//制作游戏窗口

void DrwaGameFrame()

{

gotoxy(FrameX+Frame_width-7,FrameY-2);

color(11);

printf("趣味俄罗斯方块");

gotoxy(FrameX+2*Frame_width+3,FrameY+7);

color(2);

printf("**********");

gotoxy(FrameX+2*Frame_width+13,FrameY+7);

color(13);

printf("下一块方块");

gotoxy(FrameX+2*Frame_width+3,FrameY+13);

color(2);

printf("**********");

gotoxy(FrameX+2*Frame_width+3,FrameY+17);

color(14);

printf("上箭头:旋转");

gotoxy(FrameX+2*Frame_width+3,FrameY+19); 

printf("空格:暂停游戏");

gotoxy(FrameX+2*Frame_width+3,FrameY+15);

printf("Esc;退出游戏");

gotoxy(FrameX,FrameY);

color(12);

printf("『");

gotoxy(FrameX+2*Frame_width-2,FrameY);

printf("﹃");

gotoxy(FrameX,FrameY+Frame_height);

printf("﹄");

gotoxy(FrameX+2*Frame_width-2,FrameY+Frame_height);

printf("』");

a[FrameX][FrameY+Frame_height]=2;

a[FrameX+2*Frame_width-2][FrameY+Frame_height]=2;

for(i=2;i<2*Frame_width-2;i+=2){

gotoxy(FrameX+i,FrameY);

printf("==");

for(i=2;i<2*Frame_width;i+=2){

gotoxy(FrameX+i,FrameY+Frame_height);

printf("==");

a[FrameX+i][FrameY+Frame_height]=2;//标记下横框为游戏边框,防止方块出界; 

}

for(i=1;i<Frame_height;i++){

gotoxy(FrameX,FrameY+i);

printf("||");

a[FrameX][FrameY+i]=2;//标记左竖框为游戏边框,防止方块出界 

}

for(i=1;i<Frame_height;i++){

gotoxy(FrameX+2*Frame_width-2,FrameY+i);

printf("||");

a[FrameX+2*Frame_width-2][FrameY+i]=2;//标记右竖框为游戏边框,防止方块出界 

}

}

void MakeTetris(struct Tetris *tetris)//制作俄罗斯方块 

{

a[tetris->x][tetris->y]=b[0];//中心方块位置的图形状态

switch(tetris->flag)

{

case 1://田子方块

{

color(10);

a[tetris->x][tetris->y-1]=b[1];

a[tetris->x+2][tetris->y-1]=b[2];

a[tetris->x+2][tetris->y]=b[3];

break;

}

case 2://直线方块

{

color(13);

a[tetris->x-2][tetris->y]=b[1];

a[tetris->x+2][tetris->y]=b[2];

a[tetris->x+4][tetris->y]=b[3];

break;

}

case 3://直线方块

{

color(13);

a[tetris->x][tetris->y-1]=b[1];

a[tetris->x][tetris->y-2]=b[2];

a[tetris->x][tetris->y+1]=b[3];

break;

}

case 4://梯字方块

{

color(11);

a[tetris->x-2][tetris->y]=b[1];

a[tetris->x+2][tetris->y]=b[2];

a[tetris->x][tetris->y+1]=b[3];

break;

}

case 5://顺时针  90  T 字方块

{

color(11);

a[tetris->x][tetris->y-1]=b[1];

a[tetris->x][tetris->y+1]=b[2];

a[tetris->x-2][tetris->y]=b[3];

break; 

}

case 6://瞬时针 180 T 字方块

{

color(11);

a[tetris->x][tetris->y-1]=b[1];

a[tetris->x-2][tetris->y]=b[2];

a[tetris->x+2][tetris->y]=b[3];

break;

case 7://顺时针旋转 270 T 字方块

{

color(11);

a[tetris->x][tetris->y-1]=b[1];

a[tetris->x][tetris->y+1]=b[2];

a[tetris->x+2][tetris->y]=b[3];

break; 

}

case 8:// Z 字方块

{

color(14);

a[tetris->x][tetris->y+1]=b[1];

a[tetris->x-2][tetris->y]=b[2];

a[tetris->x+2][tetris->y+1]=b[3];

break; 

}

case 9://顺时针 Z 字方块

{

color(14);

a[tetris->x][tetris->y-1]=b[1];

a[tetris->x-2][tetris->y]=b[2];

a[tetris->x-2][tetris->y+1]=b[3];

break; 

}

case 10://反 Z 字方块

{

color(14);

a[tetris->x][tetris->y-1]=b[1];

a[tetris->x-2][tetris->y-1]=b[2];

a[tetris->x+2][tetris->y]=b[3];

break; 

}

case 11://顺时针反 Z 字方块

{

color(14);

a[tetris->x][tetris->y+1]=b[1];

a[tetris->x-2][tetris->y-1]=b[2];

a[tetris->x-2][tetris->y]=b[3];

break;

}

case 12:// 7 字方块

{

color(12);

a[tetris->x][tetris->y-1]=b[1];

a[tetris->x][tetris->y+1]=b[2];

a[tetris->x-2][tetris->y-1]=b[3];

break; 

}

case 13://顺时针 90 7 字方块

{

color(12);

a[tetris->x-2][tetris->y]=b[1];

a[tetris->x+2][tetris->y-1]=b[2];

a[tetris->x+2][tetris->y]=b[3];

break; 

case 14://顺时针 180 7 字 方块

{

color(12);

a[tetris->x][tetris->y-1]=b[1];

a[tetris->x][tetris->y+1]=b[2];

a[tetris->x+2][tetris->y+1]=b[3];

break;

case 15://顺时针 270 7 字方块

{

color(12);

a[tetris->x-2][tetris->y]=b[1];

a[tetris->x-2][tetris->y+1]=b[2];

a[tetris->x+2][tetris->y]=b[3];

break; 

case 16://反 7 字方块

{

color(12);

a[tetris->x][tetris->y+1]=b[1];

a[tetris->x][tetris->y-1]=b[2];

a[tetris->x+2][tetris->y-1]=b[3];

break; 

case 17://顺时针 90 反 7 字方块

{

color(12);

a[tetris->x-2][tetris->y]=b[1];

a[tetris->x+2][tetris->y+1]=b[2];

a[tetris->x+2][tetris->y]=b[3];

break;

case 18://顺时针 180 反 7字 方块

{

color(12);

a[tetris->x][tetris->y-1]=b[1];

a[tetris->x][tetris->y+1]=b[2];

a[tetris->x-2][tetris->y+1]=b[3];

break;

case 19: //顺时针 270 反 7 字方块

{

color(12);

a[tetris->x-2][tetris->y]=b[1];

a[tetris->x-2][tetris->y-1]=b[2];

a[tetris->x+2][tetris->y]=b[3];

}

}

void PrintTetris(struct Tetris *tetris)//打印俄罗斯方块 

{

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

b[i]=1;

}

MakeTetris(tetris);// 制作俄罗斯方块

for(i=tetris->x-2; i<=tetris->x+4; i+=2){

for(j=tetris->y-2; j<=tetris->y+1; j++){

if(a[i][j] == 1 && j>FrameY){

gotoxy(i,j);

printf("■");

}

}

}

//打印菜单信息

gotoxy(FrameX+2*Frame_width+3,FrameY+1);

color(4);

printf("level : ");

color(12);

printf("%d",tetris->level);

gotoxy(FrameX+2*Frame_width+3,FrameY+3); 

color(4);

printf("score : ");

color(12);

printf("%d",tetris->score);

gotoxy(FrameX+2*Frame_width+3,FrameY+5);

color(4);

printf("speed : ");

color(12);

printf("%dms",tetris->speed);

}

int ifMove(struct Tetris *tetris)

{

if(a[tetris->x][tetris->y] != 0)//当中心方块位置上有图案时,返回值为 0,不可移动

{

return 0;

}else

{

if(

(tetris->flag==1 && ( a[tetris->x][tetris->y-1]==0 &&

a[tetris->x+2][tetris->y-1]==0 && a[tetris->x+2][tetris->y]==0)) ||

(tetris->flag==2 && ( a[tetris->x-2][tetris->y]==0 &&

a[tetris->x+2][tetris->y]==0 && a[tetris->x+4][tetris->y]==0)) ||

(tetris->flag==3 && ( a[tetris->x][tetris->y-1]==0 &&

a[tetris->x][tetris->y-2]==0 && a[tetris->x][tetris->y+1]==0)) ||

(tetris->flag==4 && ( a[tetris->x-2][tetris->y]==0 &&

a[tetris->x+2][tetris->y]==0 && a[tetris->x][tetris->y+1]==0)) ||

(tetris->flag==5 && ( a[tetris->x][tetris->y-1]==0 &&

a[tetris->x][tetris->y+1]==0 && a[tetris->x-2][tetris->y]==0)) ||

(tetris->flag==6 && ( a[tetris->x][tetris->y-1]==0 &&

a[tetris->x-2][tetris->y]==0 && a[tetris->x+2][tetris->y]==0)) ||

(tetris->flag==7 && ( a[tetris->x][tetris->y-1]==0 &&

a[tetris->x][tetris->y+1]==0 && a[tetris->x][tetris->y-1]==0)) ||

(tetris->flag==8 && ( a[tetris->x][tetris->y+1]==0 &&

a[tetris->x-2][tetris->y]==0 && a[tetris->x+2][tetris->y+1]==0)) ||

(tetris->flag==9 && ( a[tetris->x][tetris->y-1]==0 &&

a[tetris->x-2][tetris->y]==0 && a[tetris->x-2][tetris->y+1]==0)) ||

(tetris->flag==10 && ( a[tetris->x][tetris->y-1]==0 &&

a[tetris->x-2][tetris->y-1]==0 && a[tetris->x+2][tetris->y]==0)) ||

(tetris->flag==11 && ( a[tetris->x][tetris->y+1]==0 &&

a[tetris->x-2][tetris->y-1]==0 && a[tetris->x-2][tetris->y]==0)) ||

(tetris->flag==12 && ( a[tetris->x][tetris->y-1]==0 &&

a[tetris->x][tetris->y+1]==0 && a[tetris->x-2][tetris->y-1]==0)) ||

(tetris->flag==15 && ( a[tetris->x-2][tetris->y]==0 &&

a[tetris->x-2][tetris->y+1]==0 && a[tetris->x+2][tetris->y]==0)) ||

(tetris->flag==14 && ( a[tetris->x][tetris->y-1]==0 &&

a[tetris->x][tetris->y+1]==0 && a[tetris->x+2][tetris->y+1]==0)) ||

(tetris->flag==13 && ( a[tetris->x-2][tetris->y]==0 &&

a[tetris->x+2][tetris->y-1]==0 && a[tetris->x+2][tetris->y]==0)) ||

(tetris->flag==16 && ( a[tetris->x][tetris->y+1]==0 &&

a[tetris->x][tetris->y-1]==0 && a[tetris->x+2][tetris->y-1]==0)) ||

(tetris->flag==19 && ( a[tetris->x-2][tetris->y]==0 &&

a[tetris->x-2][tetris->y-1]==0 && a[tetris->x+2][tetris->y]==0)) ||

(tetris->flag==18 && ( a[tetris->x][tetris->y-1]==0 &&

a[tetris->x][tetris->y+1]==0 && a[tetris->x-2][tetris->y+1]==0)) ||

(tetris->flag==17 && ( a[tetris->x-2][tetris->y]==0 &&

a[tetris->x+2][tetris->y+1]==0 && a[tetris->x+2][tetris->y]==0)))

{

return 1;

}

  }

  return 0; 

}

void CleanTetris(struct Tetris *tetris)//擦除俄罗斯方块 

{

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

{

b[i]=0;

}

MakeTetris(tetris);

for(i=tetris->x-2;i<=tetris->x+4;i+=2){

for(j=tetris->y-2; j<= tetris->y+1; j++){

if(a[i][j] == 0 && j > FrameY){

gotoxy(i,j);

printf(" ");

}

}

}

void Del_Fullline(struct Tetris *tetris)//当每行有Frame_width-2个方块时,则满行消除 

{

int k,del_rows=0;//分别用来记录某行方块的个数和删除方块的行数的变量

for(j=FrameY+Frame_height-1; j>=FrameY+1; j--){

k=0;

for(i=FrameX+2; i<FrameX+2*Frame_width-2; i+=2){

if(a[i][j] == 1)

{

k++;//记录此行方块的个数

if(k == Frame_width-2){

for(k=FrameX+2;k<FrameX+2*Frame_width-2; k+=2){

a[k][j]=0;

gotoxy(k,j);

printf(" ");

}

for(k=j-1; k>FrameY; k--){

for(i=FrameX+2; i<FrameX+2*Frame_width-2; i+=2){

if(a[i][k] ==1)

{

a[i][k]=0;

gotoxy(i,k);

printf(" ");

a[i][k+1]=1;

gotoxy(i,k+1);

printf("■");

}

}

}

j++;//方块下移后判断删除行是否满行; 

del_rows++;//记录删除方块的行数 

}

<span style="whit

收藏

分享到:

分享到微信朋友圈

更多作品

全部评论(0
    暂无评论
手机同步功能介绍
友情提示:以下图书配套资源能够实现手机同步功能
明日微信公众号
明日之星 明日之星编程特训营
客服热线(每日9:00-17:00)
400 675 1066
mingrisoft@mingrisoft.com
吉林省明日科技有限公司Copyright ©2007-2022,mingrisoft.com, All Rights Reserved长春市北湖科技开发区盛北大街3333号长春北湖科技园项目一期A10号楼四、五层
吉ICP备10002740号-2吉公网安备22010202000132经营性网站备案信息 营业执照