俄罗斯游戏软件:C语言应用初步感受

 

C语言课程设以一节课,老师提供了一个C语言的飞俄罗斯方块让我们感受,我们所学的C语言课程,主要是各种语句的练习,这次是用我们所学过的知识来感受一个实际的系统。

  首先安装c-free,然后是将代码贴进去运行

spacer.gif

界面虽然有点简单,但这确实使用C语言做出来的游戏。

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

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<Frame_height;i++)

 {

  gotoxy(hOut,FrameX,FrameY+i); 

  printf("║");         

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

 }

 for(i=1;i<Frame_height;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语言游戏程序可以看到,C语言是我们第一门编程语言,从对计算机没有任何编程能力的菜鸟,到现在能读懂C语言的程序,感觉自己在慢慢进步。

2、计算机应用系统,就是不断接收用户的输入,然后根据相应的逻辑,显示相应的内容的过程。

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

 

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

#include<stdio.h>

#include<time.h>

#include<conio.h>

#include<stdlib.h>

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;

}

}