近期没事翻了一下曾经写的程序。真是不堪入目。曾经真是什么都不懂。只是有一个程序倒是挺有意思的,大二的时候写的一个贪吃蛇游戏。尽管程序非常难看,还有非常多漏洞。但也是这个程序让我真正開始喜欢上了编程。不多说啦。先看看代码。
- #include<iostream>
- #include<windows.h>
- #include<ctime>
- #include<cstdlib>
- #include<conio.h>
- using namespace std;
- int n ; //墙的大小,写在这里为了好控制
- int foods[2];//食物的横纵坐标
- int m=1; //控制速度
- void gotoxy(int x,int y)//位置函数,输入坐标后。光标会移动到那个位置以便进行输出
- {
- COORD pos ;
- pos.X=2*x; //由于以下输出的图形都占两个位置
- pos.Y=y;
- SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),pos);//光标控制的位置
- }
- void color(int a)//颜色函数
- {
- SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),a);//这样就仅仅有一个參数啦
- }
- void init(){ //初始化墙
- for(int i=0;i<=n;i++)
- for(int j=0;j<=n;j++){
- gotoxy(i ,j);
- if(i==0||i==n||j==0||j==n){
- gotoxy(i ,j);
- color(10);
- cout<<"■";}//围墙
- else {
- gotoxy(i ,j);
- color(3);
- cout<<"□" ; }//能够玩的区域
- }
- }
- void guize(){
- gotoxy(5,8);
- color(2);
- cout<<"欢迎你玩这款很好玩的贪吃蛇游戏";
- gotoxy(5,9);
- color(2);
- cout<<"此游戏由吕仰铭制作。比較粗糙,请见谅";
- gotoxy(n+1,1);
- color(12);
- cout<<"请按 w,s,a,d 来控制方向";
- gotoxy(n+1,2);
- color(12);
- cout<<"请按空格键暂停";
- gotoxy(n+1,3);
- color(12);
- cout<<"your score:";
- Sleep(2000);
- gotoxy(5,8);
- color(2);
- cout<<" ";
- gotoxy(5,9);
- color(2);
- cout<<" ";
- }
- void food(){ //果实的生成。用时间做变量
- srand((unsigned)time(NULL));
- foods[0]=rand()%(n-1)+1;//果实横坐标
- foods[1]=rand()%(n-1)+1;//果实的纵坐标
- }
- int main(){
- char again='r';
- while(again=='r'){
- int err =0 ; //输入必须正确的推断
- do{
- err++;
- if(err>1){
- gotoxy(0,0);
- cout<<"你输入的范围不正确,请又一次输入";
- Sleep(500);
- }
- gotoxy(0,0);
- cout<<"请设置围墙的宽度,范围是10—25,按enter键确定:";
- cin>>n;
- gotoxy(0,1);
- cout<<"请设置难度,1-简单 2—中 3—难。按enter键确定:";
- cin>>m;
- gotoxy(0,0);
- cout<<" ";
- gotoxy(0,1);
- Sleep(200);
- cout<<" ";
- }
- while(n<=9||n>=26||m<=0||m>=4);
- int ** snake=NULL;//定义一条蛇,用来控制蛇的移动坐标
- int score=0;
- int tail[2]; //尾巴的横纵坐标
- int len=3; //初始蛇的长度
- char ch='p'; //用来控制方向的參数
- char sh='p'; //用来抑制蛇的反方向移动
- int yw=1; //用来推断是否咬到自己
- int count=1; //控制关卡
- guize();
- init();//墙
- snake=(int**)realloc(snake,4*len);//为snake申请len长度的4个字节的空间
- for (int i=0;i<len;i++)
- snake[i]=new int[2];
- for(i=0;i<len;i++)
- {
- snake[i][0]=n/2;
- snake[i][1]=n/2+i;
- gotoxy(snake[i][0],snake[i][1]);
- color(14);
- cout<<"★"<<endl;//用★来构成蛇的组成部分
- } //这样就形成了一条长度为3的蛇
- s1: food(); //生成一个果实
- for(i=len-1;i>=0;i--)
- if(foods[0]==snake[i][0]&&foods[1]==snake[i][1]) //防止果实长在蛇身上
- goto s1;
- gotoxy(foods[0],foods[1]);
- color(4);
- cout<<"●"<<endl;
- int zt=0; //用来暂停
- while(1)//正式进入游戏阶段
- {
- tail[0]=snake[len-1][0];//尾巴的横坐标
- tail[1]=snake[len-1][1];//尾巴的纵坐标
- gotoxy(tail[0],tail[1]);
- color(3);
- cout<<"□" ;
- gotoxy(0,4);
- color(10);
- cout<<"■";
- if(ch!=' ' ){
- for(i=len-1;i>0;i--)
- {
- snake[i][0]=snake[i-1][0];
- snake[i][1]=snake[i-1][1];
- gotoxy(snake[i][0],snake[i][1]);
- color(14);
- cout<<"★"<<endl; //前面的一节被后面的一节取代
- }
- }
- if(kbhit()) //推断是否有按键按下
- {
- gotoxy(0,n+2);
- ch=getch();
- }
- if((sh=='a'&&ch=='d')||(sh=='d'&&ch=='a')||(sh=='w'&&ch=='s')||(sh=='s'&&ch=='w')||(ch!='a'&&ch!='w'&&ch!='d'&&ch!='s'&&ch!=' '))
- ch=sh; //抑制蛇反向移动
- switch(ch) //移动方向
- {
- case 'w':snake[0][1]--;break;
- case 's':snake[0][1]++;break;
- case 'a':snake[0][0]--;break;
- case 'd':snake[0][0]++;break;
- case ' ':break; //按下空格键暂停
- }
- sh=ch;
- gotoxy(snake[0][0],snake[0][1]);
- color(14);
- cout<<"★"<<endl;
- Sleep(abs(300/m-0.1*score-5*count));//依据分数的添加会越来越快
- if(snake[0][0]==foods[0]&&snake[0][1]==foods[1])//吃掉苹果后蛇分数加1。蛇长加1
- {
- score+=5; //吃掉果实后分数也对应的添加
- len++;
- snake=(int**)realloc(snake,4*len);//为snake新申请len长度的4个字节的空间。由于len已经变化
- snake[len-1]=new int[2];
- s2: food(); //生成新的果实
- for(i=len-1;i>=0;i--)
- if(foods[0]==snake[i][0]&&foods[1]==snake[i][1]) //防止果实长在蛇身上
- goto s2;
- gotoxy(foods[0],foods[1]);
- color(4);
- cout<<"●"<<endl;
- gotoxy(n+7,3);
- color(12);
- cout<<score<<endl;
- if(scoreP==0)
- count++;
- color(2*count);
- gotoxy(n+2,4);
- cout<<"第"<<count<<"关 ";
- }
- yw=1;
- for(i=1;i<len;i++)
- if(score>=5&&snake[i][1]==snake[0][1]&&snake[i][0]==snake[0][0])//咬到自己
- yw=0;
- if(ch==' ')
- zt=score;
- if((yw==0&&score>zt)||snake[0][1]==0||snake[0][1]==n||snake[0][0]==0||snake[0][0]==n)//咬到自己或撞到围墙后失败
- {
- gotoxy(1,n/2);
- color(30);
- if(score<100)
- cout<<"这么快死,真失败。。要加油啊,菜鸟级别"<<endl;
- else if(score<200)
- cout<<"玩的还不错嘛。继续努力,高手级别"<<endl;
- else
- cout<<"玩的这么好,简直就是大神级别"<<endl;
- delete []snake;
- Sleep(600);
- goto s;
- }
- }
- s: for(i=0;i<=n;i++)
- for(int j=0;j<=n;j++){
- gotoxy(i ,j);
- cout<<" ";}
- gotoxy(1,n/2+1);
- color(12);
- cout<<"按r键重来。其它键取消:";
- gotoxy(13,n/2+1);
- color(12);
- cin>>again;
- system("cls");
- }
- return 0;
- }
结果例如以下:
能够看到。功能是实现了,并且我自己认为还挺好玩的。可是这个程序有几个明显的缺陷:
1. 代码实在太丑,各种不正确齐,我自己如今看都认为有点吃力。
2. 这个程序仅仅能在 visual c++6.0 下才干正确执行,其它环境下可能会出现重定义和没有定义等错误。细致看我写的 for 循环应该就知道怎么回事了
3, 好多 goto 啊,c++ 本来是要避免 goto 的,但曾经就是认为好用,并且没认为有什么不妥!
唉,想想曾经的自己是多么的无知啊,只是有位名人不是说过嘛,生活就是不断发现曾经的自己是一个 SB 的过程,尽管不知道谁说的,只是我想学习也是如此!
来源: http://www.bubuko.com/infodetail-2078922.html