吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 3441|回复: 17
收起左侧

[C&C++ 原创] C++控制台贪吃蛇

  [复制链接]
HJ07 发表于 2022-3-11 11:37
本帖最后由 HJ07 于 2022-3-12 09:56 编辑

以前写的C++控制台贪吃蛇游戏,现在发到论坛上来。

(按↑↓←→键控制方向,按住空格暂停)

运行图

运行图


/*
* Snake.cpp
* Coco07
* 2020.8.28 
*/

#include <Windows.h>
#include <stdio.h>
#include "Snake.h"
#include "Canvas.h"

#define SNAKE_INIT_X 10
#define SNAKE_INIT_Y 10

using namespace std;

Snake snake(SNAKE_INIT_X, SNAKE_INIT_Y);

int Get_Message(){
        if(GetAsyncKeyState(VK_SPACE)) return -1;
        else if(GetAsyncKeyState(VK_LEFT)) return 1;
        else if(GetAsyncKeyState(VK_RIGHT)) return 2;
        else if(GetAsyncKeyState(VK_UP)) return 3;
        else if(GetAsyncKeyState(VK_DOWN)) return 4;
        return 0;
}

const int PATH_X[4] = {0, 0, -1, 1}, PATH_Y[4] = {-1, 1, 0, 0};
bool mirr(int msg){
        if(msg < 1) goto ret;

        snake.next = snake.body.back();
        snake.next.first += PATH_X[msg-1];
        snake.next.second += PATH_Y[msg-1];

ret:return snake.move();
}

void SetConsoleCursor(const bool bo){
        HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
        CONSOLE_CURSOR_INFO CursorInfo;
        GetConsoleCursorInfo(handle, &CursorInfo);
        CursorInfo.bVisible = bo;
        SetConsoleCursorInfo(handle, &CursorInfo);
}

void welcome(){
        system("cls");
        system("mode con:cols=50 lines=25");
        system("title Snake1.1");
        system("color 0f");

        printf("Copyright Coco07\n");
        printf("https://www.coco07.com/\n\n");
        for(int i = 0; i < 50; ++i){
                putchar('.');
                Sleep(20);
        }
        Sleep(500);
        putchar('\n');
        system("pause");
        system("cls");

        SetConsoleCursor(0);
}

void game_over(){
        system("color 0c");
        Sleep(2000);
        system("cls");
        SetConsoleCursor(1);
        Set_Cursor(0, 0);
        printf("GAME OVER\n\n");
        Sleep(500);
}

void DEBUG(){
        Set_Cursor(0, 24);
        printf("%d %d %d  ", snake.body.front().first, snake.body.front().second, snake.body.size());
}

int main(){
        welcome();
        while(1){
                DEBUG();
                int msg = Get_Message();
                if(msg == -1){        //wait
                        system("color 0a");
                        while(Get_Message() == -1){}
                        system("color 0f");
                }
                else if(!mirr(msg)){
                        game_over();
                        goto program_exit;
                }
                snake.canvas.draw();
                Sleep(120);
        }

program_exit:
        system("pause");
        return 0;
}
/*
* Snake.h
* Coco07
* 2020.8.27
*/

#ifndef SNAKE_H
#define SNAKE_H

#include <queue>
#include <utility>

#include "Canvas.h"

#define SNAKE_CHAR '*'
#define WALL_CHAR '#'
#define SPACE_CHAR ' '
#define SUPRISE_CHAR_L '1'
#define SUPRISE_CHAR_H '5'

using std::pair;
using std::queue;

class Snake{
 public:
         queue<pair<int, int> > body;
         pair<int, int> next;
         Canvas canvas;

         Snake(const int x, const int y);
        bool move();
        char Make_Suprise();

 private:
        int tail_size;
};

Snake::Snake(const int x, const int y){
         while(!body.empty()) body.pop();
        body.push((pair<int, int>){x, y});
        next = (pair<int, int>){x, y};
        tail_size = 0;
        canvas.init();
        canvas[x+1][y+1] = SNAKE_CHAR;
        Make_Suprise();
}

bool Snake::move(){
        int nextX = next.first, nextY = next.second, 
                headX = body.back().first, headY = body.back().second,
                tailX = body.front().first, tailY = body.front().second;

        if(canvas[nextX+1][nextY+1] >= SUPRISE_CHAR_L && canvas[nextX+1][nextY+1] <= SUPRISE_CHAR_H){
                tail_size += (int)canvas[nextX+1][nextY+1]-'0';
                Make_Suprise();
        }
        else if(canvas[nextX+1][nextY+1] != SPACE_CHAR && next != body.back()){
                return 0; //game over
        }

        body.push(next);
        canvas[nextX+1][nextY+1] = SNAKE_CHAR;

        if(tail_size){
                --tail_size;
        }
        else{
                body.pop();
                canvas[tailX+1][tailY+1] = SPACE_CHAR;
        }

        if(nextX == headX){
                next.first = nextX;
                if(headY > nextY) next.second = nextY-1;
                else next.second = nextY+1;
        }
        else{
                if(headX > nextX) next.first = nextX-1;
                else next.first = nextX+1;
                next.second = nextY;
        }

        return 1;
}

pair<int, int> random(){return (pair<int, int>){rand()%(MAP_X+1), rand()%(MAP_Y+1)};}

char Snake::Make_Suprise(){
con:pair<int, int> where = random();
        if(canvas[where.first][where.second] != SPACE_CHAR) goto con; //maybe bug
        char p = SUPRISE_CHAR_L+rand()%(SUPRISE_CHAR_H-SUPRISE_CHAR_L+1);
        canvas[where.first][where.second] = p;
        return p;
}

#endif
/*
* Canvas.h
* Coco07
* 2020.8.27
*/

#ifndef CANVAS_H
#define CANVAS_H

#include <windows.h>
#include <ctime>
#include <stdio.h>

#define MAP_X 20
#define MAP_Y 40
#define SNAKE_CHAR '*'
#define WALL_CHAR '#'
#define SPACE_CHAR ' '
#define SUPRISE_CHAR_L '1'
#define SUPRISE_CHAR_H '5'

class Canvas{
 public:
         char page[MAP_X][MAP_Y];

         bool draw();
         void init();
         char *operator[] (const int i) {return page[i];}

 private:
        char pageOUT[MAP_X][MAP_Y];
};

bool Set_Cursor(const int x, const int y);

void Canvas::init(){
        srand(time(NULL));
        for(int i = 0; i < MAP_X; ++i){
                for(int j = 0; j < MAP_Y; ++j){
                        if(i == 0 || j == 0 || i == MAP_X-1 || j == MAP_Y-1) page[i][j] = WALL_CHAR;
                        else page[i][j] = SPACE_CHAR;
                }
        }
}

bool Canvas::draw(){
        for(int i = 0; i < MAP_X; ++i){
                for(int j = 0; j < MAP_Y; ++j){
                        if(pageOUT[i][j] != page[i][j]){
                                pageOUT[i][j] = page[i][j];
                                Set_Cursor(j, i);
                                putchar(pageOUT[i][j]);
                        }
                }
        }
}

COORD coord;
bool Set_Cursor(const int x, const int y){
        coord.X = x; coord.Y = y;
        SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);
}

#endif


贪吃蛇Coco07.zip (404.71 KB, 下载次数: 131)

免费评分

参与人数 1热心值 +1 收起 理由
Ramin2027 + 1 我很赞同!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

 楼主| HJ07 发表于 2022-3-12 09:47
源码在压缩文件里
666888tzq 发表于 2022-3-11 12:31
xz91168 发表于 2022-3-12 15:15
cnjlzhe 发表于 2022-3-18 16:03
感谢分享,试试能不能运行
weidadi 发表于 2023-3-15 21:20
新手学习
fzydsz 发表于 2023-3-15 21:25
学习学习
MISTIS 发表于 2023-3-17 14:51
有意思,这个需要写key down动作吗?
shenji5 发表于 2023-3-17 17:01
厉害下来玩玩
hcbkevin 发表于 2023-3-26 20:21
最近正在写通讯录,准备写一个贪吃蛇,下来学习
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-24 21:48

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表