c语言俄罗斯方块控制台(俄罗斯方块编程c语言)

本篇文章给大家谈谈c语言俄罗斯方块控制台,以及俄罗斯方块编程c语言对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。

本文目录一览:

1、求C语言俄罗斯方块代码2、#高手往这看#用c语言编写俄罗斯方块代码,要能在codeblocks上运行的。3、俄罗斯方块C语言代码

求C语言俄罗斯方块代码

俄罗斯方块C源代码

#include stdio.h

#include windows.h

#include conio.h

#include time.h

#define  ZL  4     //坐标增量, 不使游戏窗口靠边

#define WID  36    //游戏窗口的宽度

#define HEI  20    //游戏窗口的高度

int i,j,Ta,Tb,Tc;      // Ta,Tb,Tc用于记住和转换方块变量的值

int a[60][60]={0};    //标记游戏屏幕各坐标点:0,1,2分别为空、方块、边框

int b[4];        //标记4个”口”方块:1有,0无,类似开关

int x,y, level,score,speed;    //方块中心位置的x,y坐标,游戏等级、得分和游戏速度

int flag,next;   //当前要操作的方块类型序号,下一个方块类型序号

void gtxy(int m, int n);   //以下声明要用到的自编函数

void gflag( );  //获得下一方块序号

void csh( );  //初始化界面

void start( );  //开始部分

void prfk ( );  //打印方块

void clfk( );  //清除方块

void mkfk( );  //制作方块

void keyD( );  //按键操作

int  ifmov( );  //判断方块能否移动或变体

void clHA( );  //清除满行的方块

void clNEXT( );  //清除边框外的NEXT方块

int main( )

{ csh( );

while(1)

   {start( );  //开始部分

     while(1)

     { prfk( );  

         Sleep(speed);  //延时

        clfk( );

        Tb=x;Tc=flag;  //临存当前x坐标和序号,以备撤销操作

        keyD( );  

          y++;     //方块向下移动

       if (ifmov( )==0) { y–; prfk( ); dlHA( ); break;} //不可动放下,删行,跨出循环

     }

    for(i=y-2;iy+2;i++){ if (i==ZL) { j=0; } }  //方块触到框顶

   if (j==0) { system(“cls”);gtxy(10,10);printf(“游戏结束!”); getch(); break; }

   clNEXT( );   //清除框外的NEXT方块

  }

return 0;

}

void gtxy(int m, int n)  //控制光标移动

{COORD pos;  //定义变量

pos.X = m;  //横坐标

pos.Y = n;   //纵坐标

SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), pos);

}

void csh( )    //初始化界面

{gtxy(ZL+WID/2-5,ZL-2); printf(“俄罗斯方块”);      //打印游戏名称

gtxy(ZL+WID+3,ZL+7); printf(“******* NEXT:”);  //打印菜单信息

gtxy(ZL+WID+3,ZL+13); printf(“**********”);

gtxy(ZL+WID+3,ZL+15); printf(“Esc :退出游戏”);

gtxy(ZL+WID+3,ZL+17); printf(“↑键:变体”);

gtxy(ZL+WID+3,ZL+19); printf(“空格:暂停游戏”);

gtxy(ZL,ZL);  printf(“╔”);  gtxy(ZL+WID-2,ZL);  printf(“╗”);  //打印框角

gtxy(ZL,ZL+HEI);  printf(“╚”);  gtxy(ZL+WID-2,ZL+HEI);  printf(“╝”);

a[ZL][ZL+HEI]=2;  a[ZL+WID-2][ZL+HEI]=2;  //记住有图案

for(i=2;iWID-2;i+=2) {gtxy(ZL+i,ZL);  printf(“═”); }  //打印上横框

for(i=2;iWID-2;i+=2) {gtxy(ZL+i,ZL+HEI); printf(“═”); a[ZL+i][ZL+HEI]=2; } //下框

for(i=1;iHEI;i++) { gtxy(ZL,ZL+i);  printf(“║”); a[ZL][ZL+i]=2; }  //左竖框记住有图案

for(i=1;iHEI;i++) {gtxy(ZL+WID-2,ZL+i); printf(“║”); a[ZL+WID-2][ZL+i]=2; } //右框

CONSOLE_CURSOR_INFO cursor_info={1,0};   //以下是隐藏光标的设置

SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE),cursor_info);

level=1; score=0; speed=400;

gflag( );  flag=next;  //获得一个当前方块序号

}

void gflag( )   //获得下一个方块的序号

{ srand((unsigned)time(NULL)); next = rand()%19+1; }

void start( )  //开始部分

{ gflag( ); Ta=flag; flag=next;  //保存当前方块序号,将下一方块序号临时操作

x=ZL+WID+6; y=ZL+10; prfk( );  //给x,y赋值,在框外打印出下一方块

flag=Ta; x=ZL+WID/2; y=ZL-1;  //取回当前方块序号,并给x,y赋值

}

void prfk ( )  //打印俄罗斯方块

{ for(i=0;i4;i++) {b[i]=1; }  //数组b[4]每个元素的值都为1

mkfk ( );  //制作俄罗斯方块

for( i= x-2; i=x+4; i+=2 )  //打印方块

{ for(j=y-2;j= y+1;j++) { if( a[i][j]==1  jZL ){ gtxy(i,j); printf(“□”); } } }

gtxy(ZL+WID+3,ZL+1);   printf(“level : %d”,level);  //以下打印菜单信息

gtxy(ZL+WID+3,ZL+3);  printf(“score : %d”,score);

gtxy(ZL+WID+3,ZL+5);  printf(“speed : %d”,speed);

}

void clfk( )  //清除俄罗斯方块

{ for(i=0;i4;i++) { b[i]=0; }  //数组b[4]每个元素的值都为0

mkfk ( );  //制作俄罗斯方块

for( i=x-2; i=x+4; i+=2 )  //清除方块

{ for(j=y-2;j=y+1;j++){ if( a[i][j]==0  jZL ){ gtxy(i,j); printf(”  “); } } }

}

void mkfk( )  //制作俄罗斯方块

{ a[x][ y]=b[0];  //方块中心位置状态: 1-有,0-无

switch(flag)   //共6大类,19种小类型

{ case 1: { a[x][y-1]=b[1]; a[x+2][y-1]=b[2]; a[x+2][y]=b[3]; break; }  //田字方块

case 2: { a[x-2][y]=b[1]; a[x+2][y]=b[2]; a[x+4][y]=b[3]; break; }  //直线方块:—-

case 3: { a[x][y-1]=b[1]; a[x][y-2]=b[2]; a[x][y+1]=b[3]; break; }  //直线方块: |

case 4: { a[x-2][y]=b[1]; a[x+2][y]=b[2]; a[x][y+1]=b[3]; break; }  //T字方块

case 5: { a[x][y-1]=b[1]; a[x][y+1]=b[2]; a[x-2][y]=b[3]; break; }  //T字顺时针转90度

case 6: { a[x][y-1]=b[1]; a[x-2][y]=b[2]; a[x+2][y]=b[3]; break; }  //T字顺转180度

case 7: { a[x][y-1]=b[1]; a[x][y+1]=b[2]; a[x+2][y]=b[3]; break; }  //T字顺转270度

case 8: { a[x][y+1]=b[1]; a[x-2][y]=b[2]; a[x+2][y+1]=b[3]; break; } //Z字方块

case 9: { a[x][y-1]=b[1]; a[x-2][y]=b[2]; a[x-2][y+1]=b[3]; break; }  //Z字顺转90度

case 10: { a[x][y-1]=b[1]; a[x-2][y-1]=b[2]; a[x+2][y]=b[3]; break; }  //Z字顺转180度

case 11: { a[x][y+1]=b[1]; a[x+2][y-1]=b[2]; a[x+2][ y]=b[3]; break; } //Z字顺转270度

case 12: { a[x][y-1]=b[1]; a[x][y+1]=b[2]; a[x-2][y-1]=b[3]; break; }  //7字方块

case 13: {a[x-2][y]=b[1]; a[x+2][y-1]=b[2]; a[x+2][y]=b[3]; break; }  //7字顺转90度

case 14: { a[x][y-1]=b[1]; a[x][y+1]=b[2]; a[x+2][y+1]=b[3]; break; }  //7字顺转180度

case 15: { a[x-2][y]=b[1]; a[x-2][y+1]=b[2]; a[x+2][y]=b[3]; break; }  //7字顺转270度

case 16: { a[x][y+1]=b[1]; a[x][y-1]=b[2]; a[x+2][y-1]=b[3]; break; }  //倒7字方块

case 17: { a[x-2][y]=b[1]; a[x+2][y+1]=b[2]; a[x+2][y]=b[3]; break; }  //倒7字顺转90度

case 18: { a[x][y-1]=b[1]; a[x][y+1]=b[2]; a[x-2][y+1]=b[3]; break; }  //倒7字顺转180度

case 19: { a[x-2][y]=b[1]; a[x-2][y-1]=b[2]; a[x+2][y]=b[3]; break; }  //倒7字顺转270度

}

}

void keyD( )  //按键操作

{ if (kbhit( ))

{ int key;

   key=getch();

if (key==224)

{ key=getch();

       if (key==75) { x-=2; }  //按下左方向键,中心横坐标减2

if (key==77) { x+=2; }  //按下右方向键,中心横坐标加2

      if (key==72)     //按下向上方向键,方块变体

{ if (flag=2  flag=3 ) { flag++; flag%=2; flag+=2; }

if ( flag=4  flag=7 ) { flag++; flag%=4; flag+=4; }

if (flag=8  flag=11 ) { flag++; flag%=4; flag+=8; }

if (flag=12  flag=15 ) { flag++; flag%=4; flag+=12; }

if ( flag=16  flag=19 ) { flag++; flag%=4; flag+=16; } }

       }

    if (key==32)     //按空格键,暂停

{ prfk( ); while(1) { if (getch( )==32) { clfk( );break;} } }  //再按空格键,继续游戏

    if (ifmov( )==0) { x=Tb; flag=Tc; }  //如果不可动,撤销上面操作

    else { prfk( ); Sleep(speed); clfk( ); Tb=x;Tc=flag;}   //如果可动,执行操作

}

}

int ifmov( )   //判断能否移动

{ if (a[x][y]!=0) { return 0; }  //方块中心处有图案返回0,不可移动

else{ if ( (flag==1  ( a[x][ y-1]==0  a[x+2][y-1]==0  a[x+2][y]==0 ) ) ||

       (flag==2  ( a[x-2][y]==0  a[x+2][y]==0  a[x+4][y]==0 ) ) ||

       (flag==3  ( a[x][y-1]==0  a[x][y-2]==0  a[x][y+1]==0 ) ) ||

       (flag==4  ( a[x-2][y]==0  a[x+2][y]==0  a[x][y+1]==0 ) ) ||

       (flag==5  ( a[x][y-1]==0  a[x][y+1]==0  a[x-2][y]==0 ) ) ||

       (flag==6  ( a[x][ y-1]==0  a[x-2][y]==0  a[x+2][y]==0 ) ) ||

       (flag==7  ( a[x][y-1]==0  a[x][y+1]==0  a[x+2][y]==0 ) ) ||

       (flag==8  ( a[x][y+1]==0  a[x-2][y]==0  a[x+2][y+1]==0 ) ) ||

       (flag==9  ( a[x][y-1]==0  a[x-2][y]==0  a[x-2][y+1]==0 ) ) ||

       (flag==10  ( a[x][y-1]==0  a[x-2][y-1]==0  a[x+2][y]==0 ) ) ||

       (flag==11  ( a[x][y+1]==0  a[x+2][y-1]==0  a[x+2][y]==0 ) ) ||

       (flag==12  ( a[x][y-1]==0  a[x][y+1]==0  a[x-2][y-1]==0 ) ) ||

      ( flag==13 ( a[x-2][y]==0 a[x+2][y-1]==0 a[x+2][y]==0 ) ) ||

    ( flag==14 ( a[x][y-1]==0 a[x][y+1]==0 a[x+2][y+1]==0 ) ) ||

     (flag==15 ( a[x-2][y]==0 a[x-2][y+1]==0 a[x+2][y]==0 ) ) ||

     (flag==16 ( a[x][y+1]==0 a[x][y-1]==0 a[x+2][y-1]==0 ) ) ||

     ( flag==17 ( a[x-2][y]==0 a[x+2][y+1]==0 a[x+2][y]==0 ) ) ||

    (flag==18 ( a[x][y-1]==0 a[x][y+1]==0 a[x-2][y+1]==0 ) ) ||

     (flag==19 ( a[x-2][y]==0 a[x-2][y-1]==0

             a[x+2][y]==0 ) ) ) { return 1; }

}

return 0;   //其它情况返回0

}

void clNEXT( )   //清除框外的NEXT方块

{ flag = next;  x=ZL+WID+6;  y=ZL+10;  clfk( ); }

void clHA( )   //清除满行的方块

{ int k, Hang=0;    //k是某行方块个数, Hang是删除的方块行数

for(j=ZL+HEI-1;j=ZL+1;j–)  //当某行有WID/2-2个方块时,则为满行

{ k=0; for(i=ZL+2;iZL+WID-2;i+=2)

{ if (a[i][j]==1)   //竖坐标从下往上,横坐标由左至右依次判断是否满行

{ k++;   //下面将操作删除行

     if (k==WID/2-2)  {   for(k=ZL+2;kZL+WID-2;k+=2)

         { a[k][j]=0; gtxy(k,j); printf(”  “); Sleep(1); }

        for(k=j-1;kZL;k–)

        { for(i=ZL+2;iZL+WID-2;i+=2)  //已删行数上面有方块,先清除再全部下移一行

          { if(a[i][k]==1) { a[i][k]=0; gtxy(i,k); printf(”  “);a[i][k+1]=1;

            gtxy(i,k+1); printf(“□”); } }

          }

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

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

       }

    }

   }

}

score+=100*Hang;   //每删除一行,得100分

if ( Hang0  (score%500==0 || score/500 level-1 ) )  //得分满500速度加快升一级

  { speed-=20; level++; if(speed200)speed+=20; }

}

#高手往这看#用c语言编写俄罗斯方块代码,要能在codeblocks上运行的。

main.c里面

#include stdio.h

#include stdlib.h

#include “fangkuai.h”

#include time.h

int main()

{

Manager manager;

Control control;

initGame(manager,control);

do {

printPrompting();

printPoolBorder();

runGame(manager,control);

if(ifPlayAgain()){

SetConsoleTextAttribute(Output,0x7);

system(“cls”);

startGame(manager,control);

}

else{

break;

}

}

while(1);

gotoxyFull(0,0);

CloseHandle(Output);

return 0;

}

.h里面

#ifndef FANGKUAI_H_INCLUDED

#define FANGKUAI_H_INCLUDED

#include stdio.h //标准输入输出

#include string.h //字符数组

#include stdlib.h //标准库

#include time.h //日期和时间

#include conio.h //控制台输入输出

#include windows.h // windows控制台

#include stdbool.h //标准布尔函数

//定义句柄,结构体,数组;函数声明

//定义方块数组,[7][4],7种方块,每种4个状态

static const unsigned int TetrisTable[7][4]={

{0x4444,0x0f00,0x2222,0x00f0},

{0x04e0,0x4640,0x0720,0x0262},

{0x0446,0x0e80,0x6220,0x0170},

{0x0622,0x02e0,0x4460,0x0740},

{0x0630,0x0264,0x0c60,0x2640},

{0x0462,0x06c0,0x4620,0x0360},

{0x0660,0x0660,0x0660,0x0660},

};

typedef struct TetrisManger{

unsigned int pool[28];

int x;int y;

int type[3];

int orientation[3];

unsigned score;

unsigned erasedCount[4];

unsigned erasedTotal;

unsigned tetrisCount[7];

unsigned tetrisTotal;

bool dead;

}Manager;

static const unsigned int initTetrisPool[28]={

0xc003,0xc003,0xc003,0xc003,0xc003,0xc003,0xc003,

0xc003,0xc003,0xc003,0xc003,0xc003,0xc003,0xc003,

0xc003,0xc003,0xc003,0xc003,0xc003,0xc003,0xc003,

0xc003,0xc003,0xc003,0xc003,0xc003,0xffff,0xffff

};

typedef struct TetresControl{

bool pause;

bool clockwise;

int direction;

int color[28][16];

}Control;

HANDLE Output;

void initGame(Manager *manager,Control *control);

void gotoxyFull(short x,short y);

void printPrompting();

void printPoolBorder();

void printScore(const Manager *manager);

void printNextTetres(const Manager *manager);

void startGame(Manager *manager,Control *control);

void initTetris(Manager *manager);

void insertTetris(Manager *manager);

void setPoolColor(const Manager *manager,Control *control);

void printCurrentTetris(const Manager *manager,const Control *control);

void printTetrisPool(const Manager *manager,const Control *control);

bool checkCollision(const Manager *manager);

void removeTetris(Manager *manager);

void moveDownTetris(Manager *manager,Control *control);

void runGame(Manager *manager,Control *control);

void horzMoveTetris(Manager *manager,Control *control);

void keydownControl(Manager *manager,Control *control,int key);

void rotateTetris(Manager *manager,Control *control);

void dropTetris(Manager *manager,Control *control);

bool checkErasing(Manager *manager,Control *control);

bool ifPlayAgain();

#endif // FANGKUAI_H_INCLUDED

.c里面

#include “fangkuai.h”

#include stdio.h

#include windows.h

void initGame(Manager *manager,Control *control)//初始化游戏

{

SetConsoleTitle(“俄罗斯方块”); //设置窗口标题

Output=GetStdHandle(STD_OUTPUT_HANDLE); //获取标准输出句柄

CONSOLE_CURSOR_INFO INFO; //定义光标属性结构体变量

INFO.dwSize=1; //设置光标高度值

INFO.bVisible=FALSE; //设置光标隐藏值

SetConsoleCursorInfo(Output,INFO); //设置光标属性

startGame(manager,control);

}

//全角定位光标

void gotoxyFull(short x,short y) //全角方式定位

{

static COORD cd; //定义结构体变量

cd.X=2*x; //结构体变量 X=2x

cd.Y=y;

SetConsoleCursorPosition(Output,cd);//设置光标位置

}

//显示右下角按键提示信息

void printPrompting(){

SetConsoleTextAttribute(Output,0x0b);//设置显示颜色为蓝色光亮

gotoxyFull(26,10);

printf(“■控制:”);

gotoxyFull(27,12);

printf(“□向左移动:← A 4”);

gotoxyFull(27,13);

printf(“□向右移动:→ D 6”);

gotoxyFull(27,14);

printf(“□向下移动:↓ S 2”);

gotoxyFull(27,15);

printf(“□顺时针转:↑ W 8”);

gotoxyFull(27,16);

printf(“□逆时针转:0”);

gotoxyFull(27,17);

printf(“□直接落地:空格”);

gotoxyFull(27,18);

printf(“□暂停游戏:回车”);

gotoxyFull(26,23);

printf(“■BY YU”);

}

//显示游戏池白色边框

void printPoolBorder(){

SetConsoleTextAttribute(Output,0xF0);//设置背景色为白色高亮

int y=1;

for (y=1;y23;y++){

gotoxyFull(10,y); //(10,1) 定位到(10,22)

printf(“%2s”,””);

gotoxyFull(23,y); //(23,1)定位到(23,22)

printf(“%2s”,””);

}

gotoxyFull(10,23);//底部一行

printf(“%28s”,””); //14个字符,每个两位,左边、右边白色,中间12

}

//显示得分、消行数、方块数

void printScore(const Manager *manager){

SetConsoleTextAttribute(Output,0x0E);//设置颜色为黄色高亮

gotoxyFull(2,2);

printf(“■得分:%u”,manager-score);

gotoxyFull(1,6);

printf(“■消行总数:%u”,manager-erasedTotal);

int i;

for (i=0;i4;i++){

gotoxyFull(2,7+i);

printf(“□消%d:%u”,i+1,manager-erasedCount[i]);

}

gotoxyFull(1,15);

printf(“■方块总数:%u”,manager-tetrisTotal);

static const char *tetrisName=”ITLJZSO”;

for (i=0;i7;i++){

gotoxyFull(2,17+i);

printf(“□%c形:%u”,tetrisName[i],manager-tetrisCount[i]);

}

}

void printNextTetres(const Manager *manager)//显示下一个,下下一个方块

{

SetConsoleTextAttribute(Output,0x0f);//设置前景色为白色高亮

gotoxyFull(26,1);

printf(“┌─────────┬─────────┐”);

gotoxyFull(26,2);

printf(“│%9s│%9s│”,””,””);

gotoxyFull(26,3);

printf(“│%9s│%9s│”,””,””);

gotoxyFull(26,4);

printf(“│%9s│%9s│”,””,””);

gotoxyFull(26,5);

printf(“│%9s│%9s│”,””,””);

gotoxyFull(26,6);

printf(“└─────────┴─────────┘”);

//显示下一个方块

unsigned int tetris ;

int i;

tetris=TetrisTable[manager-type[1]][manager-orientation[1]];

SetConsoleTextAttribute(Output,manager-type[1]|8);

for (i=0;i16;i++){

gotoxyFull(27+(i3),2+(i2));

((tetrisi)0x8000) ? printf(“■”):printf(“%2s”,””);

}

tetris=TetrisTable[manager-type[2]][manager-type[2]];

SetConsoleTextAttribute(Output,0x08);

for(i=0;i16;i++){

gotoxyFull(32+(i3),2+(i2));

((tetrisi)0x8000)?printf(“■”):printf(“%2s”,””);

}

}

void startGame(Manager *manager,Control *control)//开始游戏

{

memset(manager,0,sizeof(Manager));

memcpy(manager-pool,initTetrisPool,sizeof(unsigned int [28]));//复制游戏池数据

srand((unsigned)time(NULL));//设置随机数种子

manager-type[1]=rand()%7;//下一个方块类型

manager-orientation[1]=rand()%4;//下一个方块状态

manager-type[2]=rand()%7;//下下一个方块类型

manager-orientation[2]=rand()%4;//下下一个方块状态

memset(control,0,sizeof(Control));//初始化控制结构体为0

initTetris(manager); //初始化方块

setPoolColor(manager,control);//初始化方块,若没有碰撞,插入方块,需要设置颜色

}

void initTetris(Manager *manager)//出第一个方块

{

unsigned int tetris;

manager-type[0]=manager-type[1];

manager-orientation[0]=manager-orientation[1];

manager-type[1]=manager-type[2];

manager-orientation[1]=manager-orientation[2];

manager-type[2]=rand()%7;

manager-orientation[2]=rand()%4;

tetris=TetrisTable[manager-type[0]][manager-orientation[0]];

manager-x=6;

manager-y=4;

if(checkCollision(manager)){

manager-dead=true;

}

else{

insertTetris(manager);

}

++manager-tetrisTotal;

++manager-tetrisCount[manager-type[0]];

printNextTetres(manager);

printScore(manager);

}

//插入方块到游戏池

void insertTetris(Manager *manager){

unsigned int tetris=TetrisTable[manager-type[0]][manager-orientation[0]];//相对于y的位置

manager-pool[manager-y+0]|=(((tetris0x0)0xF000)manager-x);//或等于

manager-pool[manager-y+1]|=(((tetris0x4)0xF000)manager-x);

manager-pool[manager-y+2]|=(((tetris0x8)0xF000)manager-x);

manager-pool[manager-y+3]|=(((tetris0xc)0xF000)manager-x);

}

//设置游戏颜色

void setPoolColor(const Manager *manager, Control *control){

int i,x,y;

/* i 当前方块值 0—-15

x 设置颜色的列 x=manager-x+3

y 设置颜色的行 y=manager-y+i2 */

unsigned int tetris;

tetris=TetrisTable[manager-type[0]][manager-orientation[0]];

for(i=0;i16;i++){

y=manager-y+(i2);

if(y25){

break;

}

x=manager-x+(i3);

if((tetrisi)0x8000){

control-color[y][x]=(manager-type[0]|8);

}

}

}

//显示当前方块

void printCurrentTetris(const Manager *manager,const Control *control){

int x,y;

y=(manager-y4)?(manager-y-1):4;

for (;y26ymanager-y+4;y++){

x=(manager-x2)?(manager-x-1):2;

for (;x14xmanager-x+5;x++) {

gotoxyFull(x+9,y-3);

if((manager-pool[y]x) 0x8000){

SetConsoleTextAttribute(Output,control-color[y][x]);

printf(“■”);

}

else{

SetConsoleTextAttribute(Output,0);

printf(“%2s”,””);

}

}

}

}

//显示游戏池

void printTetrisPool(const Manager *manager,const Control *control){

int x,y;

for(y=4;y26;y++)

{

gotoxyFull(11,y-3);

for(x=2;x14;x++)

{

if((manager-pool[y]x) 0x8000)

{

SetConsoleTextAttribute(Output,control-color[y][x]);

printf(“■”);

}

else {

SetConsoleTextAttribute(Output,0);

printf(“%2s”,””);

}

}

}

}

//碰撞检测

bool checkCollision(const Manager *manager){

unsigned int tetris;

tetris=TetrisTable[manager-type[0]][manager-orientation[0]];//准备插入的当前方块

unsigned int dest;//游戏池中4行4列的值

dest=0;

dest|=(((manager-pool[manager-y+0]manager-x)0xF000)0x0);

dest|=(((manager-pool[manager-y+1]manager-x)0xF000)0x4);//左移x,右移4

dest|=(((manager-pool[manager-y+2]manager-x)0xF000)0x8);

dest|=(((manager-pool[manager-y+3]manager-x)0xF000)0xc);

return((desttetris)!=0);

}

//移除方块

void removeTetris(Manager *manager){

unsigned int tetris;

tetris=TetrisTable[manager-type[0]][manager-orientation[0]];//准备插入的当前方块,当前方块值

manager-pool[manager-y+0]=~(((tetris0x0)0xF000)manager-x);//左移0保留 最高,其余清零,右移x,游戏中方块列位置,取反,原来后面,存

manager-pool[manager-y+1]=~(((tetris0x4)0xF000)manager-x);

manager-pool[manager-y+2]=~(((tetris0x8)0xF000)manager-x);

manager-pool[manager-y+3]=~(((tetris0xc)0xF000)manager-x);

}

//向下移动方块

void moveDownTetris(Manager *manager,Control *control){

int y=manager-y;

removeTetris(manager);

++manager-y;

if(checkCollision(manager)){

manager-y=y;

insertTetris(manager);

if(checkErasing(manager,control))

{

printTetrisPool(manager,control);

}

}

else{

insertTetris(manager);

setPoolColor(manager,control);

printCurrentTetris(manager,control);

}

}

//运行游戏

void runGame(Manager *manager,Control *control){

clock_t clockNow,clockLast;

clockLast=clock();

printTetrisPool(manager,control);

while (!manager-dead){

while(_kbhit()){

keydownControl(manager,control,getch());

}

if (!control-pause){

clockNow=clock();

if(clockNow-clockLast0.45F*CLOCKS_PER_SEC){

clockLast=clockNow;

moveDownTetris(manager,control);

}

}

}

}

c语言俄罗斯方块控制台(俄罗斯方块编程c语言)

俄罗斯方块C语言代码

俄罗斯方块C源代码

#include stdio.h

#include windows.h

#include conio.h

#include time.h

#define  ZL  4     //坐标增量, 不使游戏窗口靠边

#define WID  36    //游戏窗口的宽度

#define HEI  20    //游戏窗口的高度

int i,j,Ta,Tb,Tc;      // Ta,Tb,Tc用于记住和转换方块变量的值

int a[60][60]={0};    //标记游戏屏幕各坐标点:0,1,2分别为空、方块、边框

int b[4];        //标记4个”口”方块:1有,0无,类似开关

int x,y, level,score,speed;    //方块中心位置的x,y坐标,游戏等级、得分和游戏速度

int flag,next;   //当前要操作的方块类型序号,下一个方块类型序号

void gtxy(int m, int n);   //以下声明要用到的自编函数

void gflag( );  //获得下一方块序号

void csh( );  //初始化界面

void start( );  //开始部分

void prfk ( );  //打印方块

void clfk( );  //清除方块

void mkfk( );  //制作方块

void keyD( );  //按键操作

int  ifmov( );  //判断方块能否移动或变体

void clHA( );  //清除满行的方块

void clNEXT( );  //清除边框外的NEXT方块

int main( )

{ csh( );   

   while(1)

     {start( );  //开始部分

       while(1)

       { prfk( );  

         Sleep(speed);  //延时

          clfk( );

          Tb=x;Tc=flag;  //临存当前x坐标和序号,以备撤销操作

          keyD( );  

          y++;     //方块向下移动

         if (ifmov( )==0) { y–; prfk( ); dlHA( ); break;} //不可动放下,删行,跨出循环

       }

      for(i=y-2;iy+2;i++){ if (i==ZL) { j=0; } }  //方块触到框顶

     if (j==0) { system(“cls”);gtxy(10,10);printf(“游戏结束!”); getch(); break; } 

     clNEXT( );   //清除框外的NEXT方块

    }

  return 0;

}

void gtxy(int m, int n)  //控制光标移动

{COORD pos;  //定义变量

pos.X = m;  //横坐标

pos.Y = n;   //纵坐标

SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), pos);

}

void csh( )    //初始化界面

{gtxy(ZL+WID/2-5,ZL-2); printf(“俄罗斯方块”);      //打印游戏名称

gtxy(ZL+WID+3,ZL+7); printf(“******* NEXT:”);  //打印菜单信息

gtxy(ZL+WID+3,ZL+13); printf(“**********”);

gtxy(ZL+WID+3,ZL+15); printf(“Esc :退出游戏”);

gtxy(ZL+WID+3,ZL+17); printf(“↑键:变体”);

gtxy(ZL+WID+3,ZL+19); printf(“空格:暂停游戏”);

gtxy(ZL,ZL);  printf(“╔”);  gtxy(ZL+WID-2,ZL);  printf(“╗”);  //打印框角

gtxy(ZL,ZL+HEI);  printf(“╚”);  gtxy(ZL+WID-2,ZL+HEI);  printf(“╝”);

a[ZL][ZL+HEI]=2;  a[ZL+WID-2][ZL+HEI]=2;  //记住有图案

for(i=2;iWID-2;i+=2) {gtxy(ZL+i,ZL);  printf(“═”); }  //打印上横框

for(i=2;iWID-2;i+=2) {gtxy(ZL+i,ZL+HEI); printf(“═”); a[ZL+i][ZL+HEI]=2; } //下框

for(i=1;iHEI;i++) { gtxy(ZL,ZL+i);  printf(“║”); a[ZL][ZL+i]=2; }  //左竖框记住有图案

for(i=1;iHEI;i++) {gtxy(ZL+WID-2,ZL+i); printf(“║”); a[ZL+WID-2][ZL+i]=2; } //右框

CONSOLE_CURSOR_INFO cursor_info={1,0};   //以下是隐藏光标的设置

SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE),cursor_info);

level=1; score=0; speed=400;

gflag( );  flag=next;  //获得一个当前方块序号

}

void gflag( )   //获得下一个方块的序号

{ srand((unsigned)time(NULL)); next = rand()%19+1; }

void start( )  //开始部分

{ gflag( ); Ta=flag; flag=next;  //保存当前方块序号,将下一方块序号临时操作

x=ZL+WID+6; y=ZL+10; prfk( );  //给x,y赋值,在框外打印出下一方块

flag=Ta; x=ZL+WID/2; y=ZL-1;  //取回当前方块序号,并给x,y赋值

}

void prfk ( )  //打印俄罗斯方块

{ for(i=0;i4;i++) {b[i]=1; }  //数组b[4]每个元素的值都为1

mkfk ( );  //制作俄罗斯方块

for( i= x-2; i=x+4; i+=2 )  //打印方块

{ for(j=y-2;j= y+1;j++) { if( a[i][j]==1  jZL ){ gtxy(i,j); printf(“□”); } } }

gtxy(ZL+WID+3,ZL+1);   printf(“level : %d”,level);  //以下打印菜单信息

gtxy(ZL+WID+3,ZL+3);  printf(“score : %d”,score);

gtxy(ZL+WID+3,ZL+5);  printf(“speed : %d”,speed);

}

void clfk( )  //清除俄罗斯方块

{ for(i=0;i4;i++) { b[i]=0; }  //数组b[4]每个元素的值都为0

mkfk ( );  //制作俄罗斯方块

for( i=x-2; i=x+4; i+=2 )  //清除方块

{ for(j=y-2;j=y+1;j++){ if( a[i][j]==0  jZL ){ gtxy(i,j); printf(”  “); } } }

}

void mkfk( )  //制作俄罗斯方块

{ a[x][ y]=b[0];  //方块中心位置状态: 1-有,0-无

switch(flag)   //共6大类,19种小类型

{ case 1: { a[x][y-1]=b[1]; a[x+2][y-1]=b[2]; a[x+2][y]=b[3]; break; }  //田字方块

case 2: { a[x-2][y]=b[1]; a[x+2][y]=b[2]; a[x+4][y]=b[3]; break; }  //直线方块:—-

case 3: { a[x][y-1]=b[1]; a[x][y-2]=b[2]; a[x][y+1]=b[3]; break; }  //直线方块: |

case 4: { a[x-2][y]=b[1]; a[x+2][y]=b[2]; a[x][y+1]=b[3]; break; }  //T字方块

case 5: { a[x][y-1]=b[1]; a[x][y+1]=b[2]; a[x-2][y]=b[3]; break; }  //T字顺时针转90度

case 6: { a[x][y-1]=b[1]; a[x-2][y]=b[2]; a[x+2][y]=b[3]; break; }  //T字顺转180度

case 7: { a[x][y-1]=b[1]; a[x][y+1]=b[2]; a[x+2][y]=b[3]; break; }  //T字顺转270度

case 8: { a[x][y+1]=b[1]; a[x-2][y]=b[2]; a[x+2][y+1]=b[3]; break; } //Z字方块

case 9: { a[x][y-1]=b[1]; a[x-2][y]=b[2]; a[x-2][y+1]=b[3]; break; }  //Z字顺转90度

case 10: { a[x][y-1]=b[1]; a[x-2][y-1]=b[2]; a[x+2][y]=b[3]; break; }  //Z字顺转180度

case 11: { a[x][y+1]=b[1]; a[x+2][y-1]=b[2]; a[x+2][ y]=b[3]; break; } //Z字顺转270度

case 12: { a[x][y-1]=b[1]; a[x][y+1]=b[2]; a[x-2][y-1]=b[3]; break; }  //7字方块

case 13: {a[x-2][y]=b[1]; a[x+2][y-1]=b[2]; a[x+2][y]=b[3]; break; }  //7字顺转90度

case 14: { a[x][y-1]=b[1]; a[x][y+1]=b[2]; a[x+2][y+1]=b[3]; break; }  //7字顺转180度

case 15: { a[x-2][y]=b[1]; a[x-2][y+1]=b[2]; a[x+2][y]=b[3]; break; }  //7字顺转270度

case 16: { a[x][y+1]=b[1]; a[x][y-1]=b[2]; a[x+2][y-1]=b[3]; break; }  //倒7字方块

case 17: { a[x-2][y]=b[1]; a[x+2][y+1]=b[2]; a[x+2][y]=b[3]; break; }  //倒7字顺转90度

case 18: { a[x][y-1]=b[1]; a[x][y+1]=b[2]; a[x-2][y+1]=b[3]; break; }  //倒7字顺转180度

case 19: { a[x-2][y]=b[1]; a[x-2][y-1]=b[2]; a[x+2][y]=b[3]; break; }  //倒7字顺转270度

}

}

void keyD( )  //按键操作

{ if (kbhit( ))

{ int key;

   key=getch();

if (key==224)

{ key=getch();

       if (key==75) { x-=2; }  //按下左方向键,中心横坐标减2

if (key==77) { x+=2; }  //按下右方向键,中心横坐标加2

      if (key==72)     //按下向上方向键,方块变体

{ if (flag=2  flag=3 ) { flag++; flag%=2; flag+=2; }

if ( flag=4  flag=7 ) { flag++; flag%=4; flag+=4; }

if (flag=8  flag=11 ) { flag++; flag%=4; flag+=8; }

if (flag=12  flag=15 ) { flag++; flag%=4; flag+=12; }

if ( flag=16  flag=19 ) { flag++; flag%=4; flag+=16; } }

       }

    if (key==32)     //按空格键,暂停

{ prfk( ); while(1) { if (getch( )==32) { clfk( );break;} } }  //再按空格键,继续游戏

    if (ifmov( )==0) { x=Tb; flag=Tc; }  //如果不可动,撤销上面操作

    else { prfk( ); Sleep(speed); clfk( ); Tb=x;Tc=flag;}   //如果可动,执行操作

}

}

int ifmov( )   //判断能否移动

{ if (a[x][y]!=0) { return 0; }  //方块中心处有图案返回0,不可移动

else{ if ( (flag==1  ( a[x][ y-1]==0  a[x+2][y-1]==0  a[x+2][y]==0 ) ) ||

       (flag==2  ( a[x-2][y]==0  a[x+2][y]==0  a[x+4][y]==0 ) ) ||

       (flag==3  ( a[x][y-1]==0  a[x][y-2]==0  a[x][y+1]==0 ) ) ||

       (flag==4  ( a[x-2][y]==0  a[x+2][y]==0  a[x][y+1]==0 ) ) ||

       (flag==5  ( a[x][y-1]==0  a[x][y+1]==0  a[x-2][y]==0 ) ) ||

       (flag==6  ( a[x][ y-1]==0  a[x-2][y]==0  a[x+2][y]==0 ) ) ||

       (flag==7  ( a[x][y-1]==0  a[x][y+1]==0  a[x+2][y]==0 ) ) ||

       (flag==8  ( a[x][y+1]==0  a[x-2][y]==0  a[x+2][y+1]==0 ) ) ||

       (flag==9  ( a[x][y-1]==0  a[x-2][y]==0  a[x-2][y+1]==0 ) ) ||

       (flag==10  ( a[x][y-1]==0  a[x-2][y-1]==0  a[x+2][y]==0 ) ) ||

       (flag==11  ( a[x][y+1]==0  a[x+2][y-1]==0  a[x+2][y]==0 ) ) ||

       (flag==12  ( a[x][y-1]==0  a[x][y+1]==0  a[x-2][y-1]==0 ) ) ||

      ( flag==13 ( a[x-2][y]==0 a[x+2][y-1]==0 a[x+2][y]==0 ) ) ||

    ( flag==14 ( a[x][y-1]==0 a[x][y+1]==0 a[x+2][y+1]==0 ) ) ||

     (flag==15 ( a[x-2][y]==0 a[x-2][y+1]==0 a[x+2][y]==0 ) ) ||

     (flag==16 ( a[x][y+1]==0 a[x][y-1]==0 a[x+2][y-1]==0 ) ) ||

     ( flag==17 ( a[x-2][y]==0 a[x+2][y+1]==0 a[x+2][y]==0 ) ) ||

    (flag==18 ( a[x][y-1]==0 a[x][y+1]==0 a[x-2][y+1]==0 ) ) ||

     (flag==19 ( a[x-2][y]==0 a[x-2][y-1]==0

             a[x+2][y]==0 ) ) ) { return 1; }

}

return 0;   //其它情况返回0

}

void clNEXT( )   //清除框外的NEXT方块

{ flag = next;  x=ZL+WID+6;  y=ZL+10;  clfk( ); }

void clHA( )   //清除满行的方块

{ int k, Hang=0;    //k是某行方块个数, Hang是删除的方块行数

for(j=ZL+HEI-1;j=ZL+1;j–)  //当某行有WID/2-2个方块时,则为满行

{ k=0; for(i=ZL+2;iZL+WID-2;i+=2)

{ if (a[i][j]==1)   //竖坐标从下往上,横坐标由左至右依次判断是否满行

{ k++;   //下面将操作删除行

     if (k==WID/2-2)  {   for(k=ZL+2;kZL+WID-2;k+=2)

         { a[k][j]=0; gtxy(k,j); printf(”  “); Sleep(1); }

        for(k=j-1;kZL;k–)

        { for(i=ZL+2;iZL+WID-2;i+=2)  //已删行数上面有方块,先清除再全部下移一行

          { if(a[i][k]==1) { a[i][k]=0; gtxy(i,k); printf(”  “);a[i][k+1]=1;

            gtxy(i,k+1); printf(“□”); } }

          }

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

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

       }

    }

   }

}

score+=100*Hang;   //每删除一行,得100分

if ( Hang0  (score%500==0 || score/500 level-1 ) )  //得分满500速度加快升一级

  { speed-=20; level++; if(speed200)speed+=20; }

}

c语言俄罗斯方块控制台的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于俄罗斯方块编程c语言、c语言俄罗斯方块控制台的信息别忘了在本站进行查找喔。

本文来自投稿,不代表【】观点,发布者:【

本文地址: ,如若转载,请注明出处!

举报投诉邮箱:253000106@qq.com

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2024年3月29日 12:14:50
下一篇 2024年3月29日 12:27:32

相关推荐

  • c语言改写模式,c语言实现修改功能

    c语言程序修改? 1、这个程序有4个错误,我都加粗了,第一个是m没有赋初值,第二个是while表达式中的ch=getchar()需要括号括起来,第三个是m=m*10+ch-0中的0也需要用单引号括起来,第四个是第2个while中为m!=0。 2、define容易造成误会,因为不符合一般的编程习惯,false 0, true 1;scanf放在你的那个地方是达…

    2024年5月23日
    3900
  • c语言控制代码的换码序列,c语言交换代码

    求C语言编程大神解答一下下面这个编程代码? k==5,用5去除125余0,所以r=125%5中r为0。由于!0为1,所以执行while循环体:先打印出5(k的值),再n=n/k==125/5=25;由于251则再打印出*号。这一循环结果输出是5*。 下面是我的代码,三个函数分别对应三个问题。 在实现基本要求的前提下,拓展了可以从键盘输入的功能,以下为各题代码…

    2024年5月23日
    5600
  • c语言扫描io脚状态,c语言端口扫描

    求51单片机的上升沿和下降沿C语言检测程序列子,端口就是普通IO口。 上升沿触发是当信号有上升沿时的开关动作,当电位由低变高而触发输出变化的就叫上升沿触发。也就是当测到的信号电位是从低到高也就是上升时就触发,叫做上升沿触发。 单片机怎么计算1s内下降沿的个数的C语言程序或者计算两个下降沿的时间(检测脉冲频率)计算1s内下降沿的个数方法是,一个定时器设置定时1…

    2024年5月23日
    4300
  • c语言mallloc使用的简单介绍

    C语言中使用malloc必须加#includemallo.h? 1、在C语言中使用malloc函数进行动态内存分配。malloc的全称是memory allocation,中文叫动态内存分配。原型:extern void malloc(unsigned int num_bytes);功能:分配长度为num_bytes字节的内存块。 2、你可以看一下C语言那本…

    2024年5月23日
    4300
  • c语言三位小数,C语言三位小数

    怎样用C++语言输出精确到小数点后三位的数? 1、用C++语言输出精确到小数点后三位的数,可以参考下面给出的代码:coutsetiosflags(ios:fixed)setprecision(3)。其中 setiosflags中set是设置的意思。ios是iostream的缩写,即输入输出流。flags是标志的意思。 2、要精确到小数点后若干位,则数据类型为…

    2024年5月23日
    7200
  • c语言21点游戏,二十一点游戏代码c语言

    如何使用C语言编写简单小游戏? 1、数学知识:长方形的面积S=a*b 长方形周长L=2*(a+b)其中a b分别为长方形的宽和高。算法分析:长方形面积及周长均依赖于宽和高,所以先要输入宽高值,然后根据公式计算,输出结果即可。 2、/*也不知道你是什么级别的,我是一个新手,刚接触编程语言,以下是我自己变得一个小程序,在所有c语言的编译器(vc++0、turbo…

    2024年5月23日
    6300
  • c语言当中的null,C语言当中的符号

    C/C++中,NULL和null的区别是什么? nul 和 null要看编译器,不同的编译器有所区别。 所以C或者C++中都使用一个特殊定义NULL表示无效值,其本质就是未定义具体数据类型的0值。 null是是什么都没有的意思。在java中表示空对象。 本意是“空的;元素只有零的”意思。计算机中通常表示空值,无结果,或是空集合。\x0d\x0a在ASCII码…

    2024年5月23日
    4500
  • 包含c语言对txt文件命名的词条

    如何在C语言编程里面修改源文件名字 如果你是在WINDOWS的话,简单了,随便用个编辑器,比如记事本,然后写c源程序,保存到你想要保存的位置。如果你在DOS下,可以用edit,写好以后,按alt键,选择文件菜单,然后保存。 用open打开文件,注意操作模式使用“修改”或者“添加” 用write或者fprintf向文件中写入你的内容。 用close关闭文件。 …

    2024年5月23日
    4800
  • 学c语言编程,学c语言编程用什么软件

    编程开发必须要学C语言吗? 1、要学习。编程开发的学习内容主要包括c语言、python和c+语言。C语言作为一种简单灵活的高级编程语言,它是一个面向过程的语言,一般是作为计算机专业的基础入门语言课程。 2、C语言。对于刚接触编程的人来说,先学习C语言是非常重要的。C语言可以说是是计算机编程语言的鼻祖,其他的编程语言几乎全是由C语言变化衍生出来的。 3、不需要…

    2024年5月23日
    3400
  • c语言用string定义字符串,c语言中用string类型来处理字符串类型

    C++怎样定义定义字符串 1、第一是字符数组来表示字符串。用下面的语句声明:char a[10];C语言中字符数组与字符串的唯一区别是字符串末尾有一个结束符\0,而字符数组不需要。 2、在C中定义字符串有下列几种形式:字符串常量,char数组,char指针 字符串常量 即:位于一对双括号中的任何字符。双引号里的字符加上编译器自动提供的结束标志\0字符,作为 …

    2024年5月23日
    4200

发表回复

登录后才能评论



关注微信