您的位置:首页 > 其它

贪吃蛇和俄罗斯方块软件

2016-06-13 19:27 218 查看
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<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预压程序编辑是一件特别费时间的事,但是做的时候会很枯燥,做完之后你会感到特别舒畅。2、按照这个思路,我可以把程序修改成一个贪吃蛇的游戏,控制蛇的左右。例如:由此改编的贪吃蛇程序#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; }}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  俄罗斯 贪吃蛇 方块