Snake

   在学习操作系统这门课程时,老师让我们做个小游戏,来把之前学过的数据结构,操作系统的知识能在设计的过程中加深印象。

我做的是:贪吃蛇(会闪屏的贪吃蛇)和(没有棋盘)的五子棋。在那个只会C的时候,写的并不好但也很开心。时间到了上半年,由于经常换操作系统(自己闲着没事瞎折腾),许多自己之前写的一些代码都丢了,没有拷贝下来。数独代码,2048游戏代码,贪吃蛇代码...都丢了。其实感觉好可惜,应该保存下来留个纪念也好,起码有个自己学习过的痕迹。在前几天,在同学的U盘中找到了当时用VC6.0写的贪吃蛇代码。现在再看代码发现里可以写的更好的地方有很多。这或许就是中进步。在这里仅贴出自己当时写的代码。当然在系统换成了ubuntu之后,也用GNU C编译器也写过贪吃蛇,这次解决了闪屏的问题。也知道了,编译器有好多种,有微软的编译器,也有GNU的编译器。大概从这以后系统就从win7换成了ubuntu来学习linux,中间也有试着把自己的笔记本系统换成CentOS,但安装没有成功,也就放弃去装CentOS。AMD的CPU和AMD的显卡,我比较悲催吧!网上找了好多和我一样的案例,按照他们的解决方法,问题依旧存在(瞎折腾的后果)。说了那么多,跑题了。还是把当时的代码贴出来吧!

#include<iostream>
#include<conio.h>
#include<windows.h>
#include<time.h>
using namespace std;

#define N 15
#define M 15

char Area[N][M];
int snake[2][1000];

void SetColor(unsigned short ForeColor=7,unsigned short BackGroundColor=0)
{
    HANDLE Con=GetStdHandle(STD_OUTPUT_HANDLE);
    SetConsoleTextAttribute(Con,ForeColor|BackGroundColor);
}

void display(char Area[][M],int Score,int Speed)
{

    system("cls");
    cout<<"       Score="<<Score<<"   Speed="<<Speed<<endl;
    for(int i=0;i<N;i++)
{
cout<<' '; for(int j=0;j<M;j++)
{ SetColor(j
%15+1); cout<<Area[i][j]<<' '; } cout<<endl; }cout<<" By Guth "<<'\n'<<'\n'; } void dis() { int x,y; for(int i=0;i<N;i++) { for(int j=0;j<M;j++) { Area[i][j]=' '; } } for(int i=0;i<N;i++) { Area[0][i]=Area[N-1][i]='-'; Area[i][0]=Area[i][N-1]='|'; } srand(time(0)); do{ x=rand()%(N-2)+1; y=rand()%(M-2)+1; }while(Area[x][y]!=' '); snake[0][1]=x; snake[1][1]=y; Area[x][y]=1; } int main() { HANDLE hOut; CONSOLE_CURSOR_INFO cur_info={1,0}; hOut=GetStdHandle(STD_OUTPUT_HANDLE); SetConsoleCursorInfo(hOut,&cur_info); int head=1,tail=0; int x,y; char direction=77; int count=0; int Speed=180; int flag; dis(); srand(time(0)); do{ x=rand()%(N-2)+1; y=rand()%(M-2)+1; }while(Area[x][y]!=' '); Area[x][y]=3; display(Area,count,Speed); Sleep(1000); while(1) { int X,Y; if(kbhit()) { getch(); direction=getch(); } switch(direction) { case 72:X=snake[0][head]-1,Y=snake[1][head];break; case 80:X=snake[0][head]+1,Y=snake[1][head];break; case 75:X=snake[0][head],Y=snake[1][head]-1;break; case 77:X=snake[0][head],Y=snake[1][head]+1;break; default:cout<<"\t按键无效!"; return 0; } if(X==0||X==N-1||Y==0||Y==M-1) { cout<<"碰到墙壁!"; return 0; } if(Area[X][Y]!=' '&&!(X==x&&Y==y)) { cout<<"\t撞到自身!"; return 0; } if(x==X&&y==Y) { flag=0; count++; Area[snake[0][head]][snake[1][head]]=1; Area[X][Y]=1; head=(head+1)%100; snake[0][head]=X; snake[1][head]=Y; srand(time(0)); do{ x=rand()%(N-2)+1; y=rand()%(M-2)+1; }while(Area[x][y]!=' '); Area[x][y]=3; display(Area,count,Speed); } else { flag=1; Area[snake[0][tail]][snake[1][tail]]=' '; tail=(tail+1)%100; Area[snake[0][head]][snake[1][head]]=1; head=(head+1)%100; snake[0][head]=X; snake[1][head]=Y; Area[X][Y]=1; display(Area,count,Speed); } if(count%4==0&&flag==0){Speed=Speed-45;} Sleep(Speed); } return 0; }

上面的代码和下面运行的gif图可能不太对应!(因为gif图是当时运行时的图,这个代码是我第几次改的,我已经不记得了,这也不重要了。)

 

有点闪屏,现在再看上面的代码,int snake[2][2000]这样好可笑。内存什么的不要钱?这些我们不注意的点或许反映了一个的能力。


其实当时,并不知道怎么去写贪吃蛇,因为它是动态的,自从我接触到了system("cls"),清屏。

用数组[top++]和[head++]来模拟队列。上面的设计没有用到链表什么的感觉自己好lose。

想到这里system("cls")我第一次是用在下面的



跳动的心!当时好像是2.14那天,代码很简单!也有许多不足的地方,也贴出来,权当乐趣吧!


 

#include<iostream>
#include<windows.h>
using namespace std;

#define n 15
#define m 21
HANDLE hOut;
CONSOLE_CURSOR_INFO cur_info={1,0};

void SetColor(unsigned short ForeColor=7,unsigned short BackGroundColor=0)
{
    HANDLE Con=GetStdHandle(STD_OUTPUT_HANDLE);
    SetConsoleTextAttribute(Con,ForeColor|BackGroundColor);
}

             char Xin[n][m]={ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                    0,0,0,0,0,0,3,3,3,0,0,0,3,3,3,0,0,0,0,0,0,
                    0,0,0,0,0,3,0,0,0,3,0,3,0,0,0,3,0,0,0,0,0,
                    0,0,0,0,3,0,0,0,0,0,3,0,0,0,0,0,3,0,0,0,0,
                    0,0,0,3,0,0,0,0,0,0,3,0,0,0,0,0,0,3,0,0,0,
                    0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,
                    0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,
                    0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,
                    0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,
                    0,0,0,0,0,0,3,0,0,0,0,0,0,0,3,0,0,0,0,0,0,
                    0,0,0,0,0,0,0,3,0,0,0,0,0,3,0,0,0,0,0,0,0,
                    0,0,0,0,0,0,0,0,3,0,0,0,3,0,0,0,0,0,0,0,0,
                    0,0,0,0,0,0,0,0,0,3,0,3,0,0,0,0,0,0,0,0,0,
                    0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,
                    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,};
  
void main()
{
    hOut=GetStdHandle(STD_OUTPUT_HANDLE);
    SetConsoleCursorInfo(hOut,&cur_info);
    
    int i,j,k;

Loop:    for(i=0;i<n;i++)
        {
            for(j=0;j<m;j++)
            {
            k=rand()%10+2;
            SetColor(k);
            cout<<Xin[i][j]<<' ';
            }
            cout<<'\n';
        }
        system("cls");
        goto Loop;
}

还有个五子棋的,没有棋盘,无喷!当然后来也有改进。改进的代码已经丢了。+_+



做的不好,在学习中去发现当时自己做的是多么可笑。                                                        

 

posted @ 2015-11-11 16:19  Guth  阅读(302)  评论(0)    收藏  举报