千家信息网

贪吃蛇和俄罗斯方块软件

发表于:2024-10-01 作者:千家信息网编辑
千家信息网最后更新 2024年10月01日,C语言课程设的第一节课,老师提供了一个C语言的飞俄罗斯方块让我们感受,我们所学的C语言课程,主要是各种语句的练习,这次是用我们所学过的知识来感受一个实际的系统。我感觉特别新奇,也对c语言这门课程产生了
千家信息网最后更新 2024年10月01日贪吃蛇和俄罗斯方块软件

C语言课程设的第一节课,老师提供了一个C语言的飞俄罗斯方块让我们感受,我们所学的C语言课程,主要是各种语句的练习,这次是用我们所学过的知识来感受一个实际的系统。我感觉特别新奇,也对c语言这门课程产生了很大的兴趣。

想要做c语言文件的第一步就是安装C-FREE软件,然后就是将源代码写入。虽然界面简陋,而且操作还不流畅。但是已经体现出了他的奥妙之所在。

分析一下程序,感觉没有太复杂的,就是上学期学习的简单语句的组合,但是用的非常好。首先看看用到了几种语句:

1、首先是在屏幕上显示的语句printf,

2、另外一个就是多条件判断switch--case

应用方法

switch(tetris->flag)

{

case 1:

{

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:

{

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:

{

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:

{

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:

{

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:

{

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:

{

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:

{

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:

{

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:

{

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:

{

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:

{

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:

{

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:

{

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:

{

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:

{

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:

{

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:

{

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:

{

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;

}

}

}

用来控制左右移动和进入菜单,

3、游戏窗口的定义


void make_frame()

{

HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);

gotoxy(hOut,FrameX+Frame_width-5,FrameY-2);

printf("俄罗斯方块");

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

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

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

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

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

printf("↑键:变体");

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

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

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

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

gotoxy(hOut,FrameX,FrameY);

printf("╔");

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

printf("╗");

gotoxy(hOut,FrameX,FrameY+Frame_height);

printf("╚");

gotoxy(hOut,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(hOut,FrameX+i,FrameY);

printf("═");

}

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

{

gotoxy(hOut,FrameX+i,FrameY+Frame_height);

printf("═");

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

}

for(i=1;i

{

gotoxy(hOut,FrameX,FrameY+i);

printf("║");

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

}

for(i=1;i

{

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

printf("║");

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

}

}

4、光标移动位置

void gotoxy(HANDLE hOut, int x, int y)

{

COORD pos;

pos.X = x;

pos.Y = y;

SetConsoleCursorPosition(hOut, pos);

}

5、实现俄罗斯方块的移动

个人感觉这个程序最吸引人的地方,就是每个方块都可以变化方向,位置,和平时在游戏机中玩得几乎完全一样,感觉十分的神奇,通过c语言程序的设计,可以完成这样一个游戏,真的令人大吃一惊,真的是简单的语言,可以实现复杂的功能。

其他就是参数设置,已经不是软件的重点了,但是在其中,学习了一个常用的C语言实现的菜单,

void gotoxy(HANDLE hOut, int x, int y);

void make_frame();

void get_flag(struct Tetris *);

void make_tetris(struct Tetris *);

void print_tetris(HANDLE hOut,struct Tetris *);

void clear_tetris(HANDLE hOut,struct Tetris *);

int if_moveable(struct Tetris *);

void del_full(HANDLE hOut,struct Tetris *);

void start_game();

课后的心得体会:

1、虽然c预压程序编辑是一件特别费时间的事,但是做的时候会很枯燥,做完之后你会感到特别舒畅。

2、按照这个思路,我可以把程序修改成一个贪吃蛇的游戏,控制蛇的左右。

例如:由此改编的贪吃蛇程序

#include

#include

#include

#include

int head=3,tail=0,f=0,s,t,m;

int main()

{ int i,j;

int zuobiao[2][80];

long start;

int direction=77;

int gamespeed;

int timeover;

int change(char qipan[30][80],int zuobiao[2][80],char direction);

printf("auto? Y/N\n");

m=getch();

if (m=='y')

{ zuobiao[0][tail]=1;zuobiao[1][tail]=1;zuobiao[0][1]=1;zuobiao[1][1]=2;zuobiao[0][2]=1;zuobiao[1][2]=3;zuobiao[0][head]=1;zuobiao[1][head]=4;

/*处理棋盘*/

char qipan[20][80];//定义棋盘

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

for(j=0;j<=79;j++)

qipan[i][j]=' ';

qipan[1][1]=qipan[1][2]=qipan[1][3]='*';

qipan[1][4]='#';

printf("start\n");

printf("Input your game level,please.\ 1-1000\n");

scanf("%d",&gamespeed);

s=rand()%20;

t=rand()%80;

qipan[s][t]='$';

while(direction!='q')

{ system("cls");

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

for(j=0;j<80;j++)

printf("%c",qipan[i][j]);

timeover=1;

start=clock();

while(!kbhit()&&(timeover=clock()-start<=1000-gamespeed));

if(direction==72||direction==80)

if(s!=zuobiao[0][head])

if(s-zuobiao[0][head]<0)

direction=72;

else direction=80;

else

if(t-zuobiao[1][head]<0)

direction=75;

else direction=77;

else if(t!=zuobiao[1][head])

if(t-zuobiao[1][head]<0)

direction=75;

else direction=77;

else

if(t-zuobiao[1][head]<0)

direction=72;

else direction=80;

if(!(direction==72||direction==80||direction==75||direction==77))

{

return 0;

system("cls");

printf("GAME OVER!\n");

}

if(!change(qipan,zuobiao,direction))

{

direction='q';

system("cls");

printf("GAME OVER!\n");

}

if(f==1)

{

s=rand()%20;

t=rand()%80;

qipan[s][t]='$';

f=0;

}

}

return 0;

}

else zuobiao[0][tail]=1;zuobiao[1][tail]=1;zuobiao[0][1]=1;zuobiao[1][1]=2;zuobiao[0][2]=1;zuobiao[1][2]=3;zuobiao[0][head]=1;zuobiao[1][head]=4;

char qipan[20][80];

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

for(j=0;j<80;j++)

qipan[i][j]=' ';

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

qipan[0][i]='_';

for(i=1;i<=20;i++)

qipan[i][0]='|';

for(i=1;i<=20;i++)

qipan[i][79]='|';

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

qipan[19][i]='_';

qipan[1][1]=qipan[1][2]=qipan[1][3]='*';

qipan[1][4]='#';

printf("start\n");

printf("Input your game level,please.\ 1-1000\n");

scanf("%d",&gamespeed);

s=rand()%20;

t=rand()%80;

qipan[s][t]='$';

while(direction!='q')

{ system("cls");

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

for(j=0;j<80;j++)

printf("%c",qipan[i][j]);

timeover=1;

start=clock();

while(!kbhit()&&(timeover=clock()-start<=1000-gamespeed));

if(timeover)

{

getch();

direction=getch();

}

else

direction=direction;

if(!(direction==72||direction==80||direction==75||direction==77))

{

return 0;

system("cls");

printf("GAME OVER!\n");

}

if(!change(qipan,zuobiao,direction))

{

direction='q';

system("cls");

printf("GAME OVER!\n");

}

if(f==1)

{

s=rand()%20;

t=rand()%80;

qipan[s][t]='$';

f=0;

}

}

return 0;

}



int change(char qipan[20][80],int zuobiao[2][80],char direction)

{

int x,y;

{if(direction==72)

{x=zuobiao[0][head]-1;

y=zuobiao[1][head]; }

if(direction==80)

{x=zuobiao[0][head]+1;

y=zuobiao[1][head];}

if(direction==75)

{x=zuobiao[0][head];

y=zuobiao[1][head]-1;}

if(direction==77)

{x=zuobiao[0][head];

y=zuobiao[1][head]+1;}

if(x<0)

x=18;

else if(x>18)

x=0;

else if(y>78)

y=0;

else if(y<0)

y=78;

if(qipan[s][t]!='$')

f=1;

qipan[zuobiao[0][tail]][zuobiao[1][tail]]=' ';

tail=(tail+1)%80;

qipan[zuobiao[0][head]][zuobiao[1][head]]='*';

head=(head+1)%80;

zuobiao[0][head]=x;

zuobiao[1][head]=y;

qipan[zuobiao[0][head]][zuobiao[1][head]]='#';

return 1;

}

}





0