C++贪吃蛇——(2)

  贪吃蛇第二部分,上下左右方法就不全部实现了。仅供参考,因为我也是参考了别人的代码来的...

  

//
//  main.cpp
//  SnakeGame
//
//  Created by MadMarical on 15/11/26.
//  Copyright (c) 2015年 com. All rights reserved.
//

#include "Header.h"

using namespace std;

Game::Game()
{
    for (int i = 0; i != n + 1; ++ i)
    {
        for (int j = 0; j != n + 1; ++ j)
        {
            map[i][j] = 0;
        }
    }
    for (int i = 1; i != n; ++ i)
    {
        squence[i].x = 0;
        squence[i].y = 0;
    }
    lenOfSnake = 1;
    squence[lenOfSnake].x = 1;
    squence[lenOfSnake].y = 1;
    
    map[1][1] = 4;
    direction = 4;
    
    socre = 0;
}

void Game::Play()
{
    cout<<"请输入游戏速度"<<endl;
    cin>>snakeSpeed;
    
    srand((unsigned int)time(0));
    
    while (socre != 20)
    {
        eat = false;
        while (true)
        {
            food.x = rand() % 20 + 1; //地图大小是21 * 21 随机数不能超过地图边界,为1到21之间的数
            food.y = rand() % 20 + 1;
            if (map[food.x][food.y] == 0)
            {
                break;
            }
        }
        map[food.x][food.y] = 2;
        system("cls");
        Image();
        while(!eat)
        {
            auto start = clock();
            isOver = true;
            while (!kbhit())
            {
                if (clock() - start <= snakeSpeed)
                {
                    isOver = true;
                }
                else
                {
                    isOver = false;
                    break;
                }
            }
            if (isOver)
            {
                char c = getchar();
                c = getchar();
                switch (c)
                {
                    case 'w':
                        direction = 1;
                        break;
                    case 's':
                        direction = 2;
                    case 'a':
                        direction = 3;
                    case 'd':
                        direction = 4;
                    default:
                        break;
                }
            }
            Move(direction);
            system("cls");
            if (isOver)
            {
                Image();
                cout<<"GG"<<endl;
            }
            Image();
        }
        socre ++;
    }
    cout<<"win"<<endl;
}

void Game::Image()
{
    for (int j = 0; j != n + 1; ++ j)
    {
        cout<<"#";
    }
    cout<<endl;
    for (int i = 1; i != n; ++ i)
    {
        for (int j = 0; j != n + 1; ++ j)
        {
            if (j == 0 || j == n + 1)
            {
                if (map[i][j] == 3)
                {
                    cout<<"!!!";
                }
                else
                {
                    cout<<"#";
                }
            }
            else
            {
                if (map[i][j] == 1)
                {
                    cout<<"*";
                }
                else if (map[i][j] == 2)
                {
                    cout<<"@";
                }
                else if (map[i][j] == 3)
                {
                    cout<<"!!!";
                }
                else if (map[i][j] == 4)
                {
                    switch (direction)
                    {
                        case 1:
                            cout<<"30";
                            break;
                        case 2:
                            cout<<"31";
                            break;
                        case 3:
                            cout<<"17";
                            break;
                        default:
                            cout<<"16";
                            break;
                    }
                }
                else
                {
                cout<<" ";
                }
            }

        }
        cout<<endl;
    }
    for (int j = 0; j != n + 1; ++ j)
    {
        cout<<"#";
    }
    cout<<endl;

}
void Game::Move(int direction)
{
    switch (direction)
    {
        case 1:
            MoveUp();
            break;
        case 2:
            MoveDown();
            break;
        case 3:
            MoveLeft();
            break;
        default:
            MoveRight();
    }  
}
void Game::MoveUp()
{
    int i;
    int x, y;
    if (lenOfSnake > 1 && squence[lenOfSnake].y == squence[lenOfSnake - 1].y && squence[lenOfSnake].x == squence[lenOfSnake - 1].x + 1)
    { // 不能移动,则按原来的移动.
        direction = 2; // 按原来的向下移动.
        Move(direction);
        return ;
    }
    // 开始移动.
    x = squence[lenOfSnake].x - 1;
    y = squence[lenOfSnake].y;
    if (x == 0 || map[x][y] == 1)
    { // 撞到边界或者自己撞到自己.
        map[x][y] = 3;
        isOver = 1;
    }
    if (map[x][y] == 2)
    { // 说明已经吃到事物.
        map[squence[lenOfSnake].x][squence[lenOfSnake].y] = 1;
        lenOfSnake++;
        squence[lenOfSnake].x = x;
        squence[lenOfSnake].y = y;
        map[x][y] = 4;
        eat = true;
    }
    else
    {
        map[squence[1].x][squence[1].y] = 0;
        for (i = 1; i <= lenOfSnake - 1; i++)
        {
            squence[i].x = squence[i + 1].x;
            squence[i].y = squence[i + 1].y;
            map[squence[i + 1].x][squence[i + 1].y] = 1;
        }
        squence[lenOfSnake].x = squence[lenOfSnake].x - 1;
        if (isOver)
        {
            map[squence[lenOfSnake].x][squence[lenOfSnake].y] = 3;
        }
        else
        {
            map[squence[lenOfSnake].x][squence[lenOfSnake].y] = 4;
        }
    }
}
void Game::MoveDown()
{
}
void Game::MoveLeft()
{
}
void Game::MoveRight()
{
}
int main(int argc, const char * argv[])
{
    Game A;
    A.Play();
    return 0;
}
View Code

反思:

1.conio.h并非标准库,所以如果在其他平台下运行,需要自己实现kbhit()的功能,这已经超出我的能力范围了。

2.编程风格必须在早期就坚持,不能说今天一个风格,明天另外一个风格。

3.看别人的源码再重编并不可耻,慢慢理解别人的代码,为什么要这么写然后自己在思考后重写就能提高能力。

 

posted on 2015-11-27 10:34  MMac  阅读(399)  评论(0编辑  收藏  举报

导航