IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> C++:贪吃蛇 -> 正文阅读

[C++知识库]C++:贪吃蛇

Accepted Wrong Answer Runtime Error Invalid Interaction Time Limit Exceeded Memory Limit Exceeded Output Limit Exceeded File Error Pending Compile Error System Error No Testdata Partially Correct Judgement Failed Unknown


|\ __ \ |\ \ |\ \ |\ \ |\ __ \ |\ \ |\ \ |\?
\ \ |\ /\ \ \ \ \ \ \ \ \ |\ /\ \ \ \ \ \ \?
\ \ __ \ \ \ \ \ \ \ \ \ __ \ \ \ \ \ \ \?
\ \ |\ \ \ \ \ ____ \ \ \ \ |\ \ \ \ \ ____ \ \?
\ _\ _\ _\ _\ _\ _\ _\ _
|
| |
| |
| |
| |
| || |__| || 暴力出奇迹, 打表过样例。 数学先打表, DP看运气。 穷举TLE, 递推UKE。 模拟MLE, 贪心还CE。 想要骗到分, 就要有方法。 图论背模板, 数论背公式。 动规背方程, 高精背代码。 如果都没背, 干脆输样例。

#include<stdio.h>
#include <time.h>
#include <windows.h>
#include <stdlib.h>
#include <conio.h>
#define U 1
#define D 2
#define L 3
#define R 4 //蛇的状态 U:上 D:下 L:左 R:右
    typedef struct snake //蛇身的一个节点
{
    int x; //节点的x坐标
    int y; //节点的y坐标
    struct snake *next; //蛇身的下一个节点
}
snake;
int score = 0, add = 10; //总得分和每吃一次食物的得分
int highscore = 0; //最高分
int status, sleeptime = 200; //蛇前进状态,每次运行的时间间隔
snake *head, *food; //蛇头指针,食物指针
snake *q; //遍历蛇时用的指针
int endgamestatus = 0; //游戏结束时的状态
HANDLE hOut; //控制台句柄
void gotoxy(int x, int y);
int color(int c);
void printsnake();
void wlcome();
void createmap();
void scoreandtips();
void initsnake();
void createfood();
int biteself();
void cantcrosswall();
void speedup();
void speeddown();
void snakemove();
void keyboardcontrol();
void lostdraw();
void endgame();
void choose();
void file_out();
void file_in();
void explation();
main() {
    system("mode con cols=100 lines=30");
    printsnake();
    wlcome();
    file_out();
    keyboardcontrol();
    endgame();
}
void gotoxy(int x, int y) //设置光标位置
{
    COORD c;
    c.X = x;
    c.Y = y;
    SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), c); //定位光标的位置
}
int color(int c) //设置颜色
{
    SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), c);
    return 0;
}
void printsnake() //打印字符蛇
{
    gotoxy(2, 5);
    color(3);
    printf("姓名:小啊疯");

    gotoxy(2, 6);
    color(3);
    printf("学号:123456789");

    gotoxy(35, 1);
    color(6);
    printf("/^\\/^\\");

    gotoxy(34, 2);
    printf("|_| o|");

    gotoxy(33, 2);
    color(2);
    printf("_");

    gotoxy(25, 3);
    color(12);
    printf("\\/");

    gotoxy(31, 3);
    color(2);
    printf("/");

    gotoxy(37, 3);
    color(6);
    printf("\\_/");

    gotoxy(41, 3);
    color(10);
    printf(" \\");

    gotoxy(26, 4);
    color(12);
    printf("\\____");

    gotoxy(32, 4);
    printf("_________");

    gotoxy(31, 4);
    color(2);
    printf("|");

    gotoxy(43, 4);
    color(10);
    printf("\\");

    gotoxy(32, 5);
    color(2);
    printf("\\_______");

    gotoxy(44, 5);
    color(10);
    printf("\\");

    gotoxy(39, 6);
    printf("|    |              \\");

    gotoxy(38, 7);
    printf("/    /                \\");

    gotoxy(37, 8);
    printf("/    /               \\ \\");

    gotoxy(35, 9);
    printf("/    /                \\ \\");

    gotoxy(34, 10);
    printf(" /   /                  \\  \\");

    gotoxy(33, 11);
    printf("/    /        _----_        \\  \\");

    gotoxy(32, 12);
    printf("/    /         _-~   ~-_        |  |");

    gotoxy(31, 13);
    printf("(     (     _-~    _--_    ~-_     _/ |");

    gotoxy(32, 14);
    printf("\\    ~-____-~    _-~    ~-_    ~-_-~ /");

    gotoxy(33, 15);
    printf("~-_         _-~        ~-_       _-~");

    gotoxy(35, 16);
    printf("~--____-~                ~-___-~");
}

void wlcome() //欢迎界面
{
    int n;
    int i, j = 1;
    gotoxy(43, 18);
    color(11);
    printf("贪吃蛇大作战");
    color(14);
    for (i = 20; i <= 26; i++) {
        for (j = 27; j <= 74; j++) {
            gotoxy(j, i);
            if (i == 20 || i == 26) {
                printf("-");
            } else if (j == 27 || j == 74) {
                printf("|");
            }
        }
    }
    color(12);
    gotoxy(35, 22);
    printf("1.开始游戏");
    gotoxy(55, 22);
    printf("2.游戏说明");
    gotoxy(35, 24);
    printf("3.退出游戏");
    gotoxy(29, 27);
    color(3);
    printf("请选择1 2 3\n");
    color(14);
    scanf("%d", &n);
    switch (n) {
        case 1:
            system("cls"); //清屏
            createmap();
            initsnake();
            createfood();
            keyboardcontrol();
            break;
        case 2:
            explation();
            break;
            break;
        case 3:
            exit(0);
            break;
    }
}
void createmap() //创建地图
{
    int i, j;
    for (i = 0; i < 58; i += 2) {
        gotoxy(i, 0);
        color(5);
        printf("□");
        gotoxy(i, 26);
        printf("□");
    }
    for (i = 0; i < 26; i++) {
        gotoxy(0, i);
        printf("□");
        gotoxy(56, i);
        printf("□");
    }
    for (i = 2; i < 56; i += 2) {
        for (j = 1; j < 26; j++) {
            gotoxy(i, j);
            color(3);
            printf("■\n\n");
        }
    }
}
void scoreandtips() //游戏界面右侧的得分和小提示
{
    file_out();
    gotoxy(64, 4);
    color(11);
    printf("*最高纪录*: %d", highscore);
    gotoxy(64, 8);
    color(14);
    printf("得分: %d ", score);
    color(13);
    gotoxy(73, 11);
    printf("小提示");
    gotoxy(60, 13);
    color(6);
    printf("+---------------------+");
    gotoxy(60, 25);
    printf("+---------------------+");
    color(3);
    gotoxy(64, 14);
    printf("每个食物得分:%d分", add);
    gotoxy(64, 16);
    printf("不能穿墙,不能咬到自己");
    gotoxy(64, 18);
    printf("用↑↓←→分别控制蛇的移动");
    gotoxy(64, 20);
    printf("F1为加速,F2为减速");
    gotoxy(64, 22);
    printf("space: 暂停游戏");
    gotoxy(64, 24);
    printf("ESC:退出游戏");
}
void file_out() //打开文件记录最高分
{
    FILE *fp;
    fp = fopen("save.txt", "a+");
    fscanf(fp, "%d", &highscore);
    fclose(fp);
}
void initsnake() {
    snake *tail;
    int i;
    tail = (snake *) malloc(sizeof(snake));
    tail -> x = 24;
    tail -> y = 5;
    tail -> next = NULL;
    for (i = 1; i <= 4; i++) {
        head = (snake *) malloc(sizeof(snake));
        head -> next = tail;
        head -> x = 24 + 2 * i;
        head -> y = 5;
        tail = head;
    }
    while (tail != NULL) {
        gotoxy(tail -> x, tail -> y);
        color(14);
        printf("★"); //蛇身由★组成
        tail = tail -> next;
    }
}
void createfood() //随机出现食物
{
    snake *food_1;
    srand((unsigned) time(NULL));
    food_1 = (snake *) malloc(sizeof(snake));
    while ((food_1 -> x % 2 != 0)) {
        food_1 -> x = rand() % 52 + 2;
    }
    food_1 -> y = rand() % 24 + 1;
    q = head;
    while (q -> next == NULL) {
        if (q -> x == food_1 -> x && q -> y == food_1 -> y) {
            free(food_1);
            createfood();
        }
        q = q -> next;
    }
    gotoxy(food_1 -> x, food_1 -> y);
    food = food_1;
    color(12);
    printf("@");
}
int biteself() {
    snake *self; //定义self为蛇身上除蛇头以外的节点
    self = head -> next;
    while (self != NULL) {
        if (self -> x == head -> x && self -> y == head -> y) {
            return 1;
        }
        self = self -> next;
    }
    return 0;
}

void cantcrosswall() {
    if (head -> x == 0 || head -> x == 56 || head -> y == 0 || head -> y == 26) {
        endgamestatus = 1;
        endgame();
    }
}
void speedup() //加速
{
    if (sleeptime >= 50) {
        sleeptime = sleeptime - 10;
        add = add + 2;
    }
}

void speeddown() //减速
{
    if (sleeptime < 350) {
        sleeptime = sleeptime + 30;
        add = add - 2;
        if (sleeptime == 350) {
            add = 1;
        }
    }
}

void snakemove() //控制方向
{
    snake *nexthead;
    cantcrosswall();
    nexthead = (snake *) malloc(sizeof(snake));
    if (status == U) //上
    {
        nexthead -> x = head -> x; //向上前进时,x不变,y-1
        nexthead -> y = head -> y - 1;
        nexthead -> next = head;
        head = nexthead;
        q = head;
        //如果下一个位置上有食物,下一个位置的坐标和食物坐标相同
        if (nexthead -> x == food -> x && nexthead -> y == food -> y) {
            while (q != NULL) {
                gotoxy(q -> x, q -> y);
                color(14);
                printf("★");
                q = q -> next;
            }
            score = score + add;
            speedup();
            createfood();
        } else {
            while (q -> next -> next != NULL) //如果没有遇见食物
            {
                gotoxy(q -> x, q -> y);
                color(14);
                printf("★");
                q = q -> next;
            }
            //经过上面的循环 ,q指向蛇尾,蛇尾的下一步就是蛇走过去的位置
            gotoxy(q -> next -> x, q -> next -> y);
            color(3);
            printf("■"); //恢复走过的位置
            free(q -> next);
            q -> next = NULL;
        }
    }
    if (status == D) {
        nexthead -> x = head -> x; //向下前进时,x不变,y+1
        nexthead -> y = head -> y + 1;
        nexthead -> next = head;
        head = nexthead;
        q = head;
        //如果下一个位置上有食物,下一个位置的坐标和食物坐标相同
        if (nexthead -> x == food -> x && nexthead -> y == food -> y) {
            while (q != NULL) {
                gotoxy(q -> x, q -> y);
                color(14);
                printf("★");
                q = q -> next;
            }
            score = score + add;
            speedup();
            createfood();
        } else {
            while (q -> next -> next != NULL) //如果没有遇见食物
            {
                gotoxy(q -> x, q -> y);
                color(14);
                printf("★");
                q = q -> next;
            }
            //经过上面的循环 ,q指向蛇尾,蛇尾的下一步就是蛇走过去的位置
            gotoxy(q -> next -> x, q -> next -> y);
            color(3);
            printf("■"); //恢复走过的位置
            free(q -> next);
            q -> next = NULL;
        }
    }
    if (status == L) //左
    {
        nexthead -> x = head -> x - 2; //向左前进时,x不变,y+1
        nexthead -> y = head -> y;
        nexthead -> next = head;
        head = nexthead;
        q = head;
        //如果下一个位置上有食物,下一个位置的坐标和食物坐标相同
        if (nexthead -> x == food -> x && nexthead -> y == food -> y) {
            while (q != NULL) {
                gotoxy(q -> x, q -> y); //食物变成蛇身上的一部分
                color(14);
                printf("★");
                q = q -> next;
            }
            score = score + add;
            speedup();
            createfood();
        } else {
            while (q -> next -> next != NULL) //如果没有遇见食物
            {
                gotoxy(q -> x, q -> y);
                color(14);
                printf("★");
                q = q -> next;
            }
            //经过上面的循环 ,q指向蛇尾,蛇尾的下一步就是蛇走过去的位置
            gotoxy(q -> next -> x, q -> next -> y);
            color(3);
            printf("■"); //恢复走过的位置
            free(q -> next);
            q -> next = NULL;
        }
    }
    if (status == R) {
        nexthead -> x = head -> x + 2; //向上前进时,x不变,y-1
        nexthead -> y = head -> y;
        nexthead -> next = head;
        head = nexthead;
        q = head;
        //如果下一个位置上有食物,下一个位置的坐标和食物坐标相同
        if (nexthead -> x == food -> x && nexthead -> y == food -> y) {
            while (q != NULL) {
                gotoxy(q -> x, q -> y);
                color(14);
                printf("★");
                q = q -> next;
            }
            score = score + add;
            speedup();
            createfood();
        } else {
            while (q -> next -> next != NULL) //如果没有遇见食物
            {
                gotoxy(q -> x, q -> y);
                color(14);
                printf("★");
                q = q -> next;
            }
            //经过上面的循环 ,q指向蛇尾,蛇尾的下一步就是蛇走过去的位置
            gotoxy(q -> next -> x, q -> next -> y);
            color(3);
            printf("■"); //恢复走过的位置
            free(q -> next);
            q -> next = NULL;
        }
    }
    if (biteself() == 1) {
        endgamestatus = 2;
        endgame();
    }
}
void keyboardcontrol() {
    status = R;
    while (1) {
        scoreandtips();
        // GetAsyncKeyState函数用来判断函数调用指定虚拟键的状态
        if (GetAsyncKeyState(VK_UP) && status != D) {
            status = U;
        } else if (GetAsyncKeyState(VK_DOWN) && status != U) {
            status = D;
        } else if (GetAsyncKeyState(VK_LEFT) && status != R) {
            status = L;
        } else if (GetAsyncKeyState(VK_RIGHT) && status != L) {
            status = R;
        }
        if (GetAsyncKeyState(VK_SPACE)) {
            while (1) {
                //调用sleep函数,令进程停止,直到达到其中设定的参数时间
                Sleep(300);
                if (GetAsyncKeyState(VK_SPACE)) {
                    break;
                }
            }
        } else if (GetAsyncKeyState(VK_ESCAPE)) {
            endgamestatus = 3;
            break;
        } else if (GetAsyncKeyState(VK_F1)) {
            speedup();
        } else if (GetAsyncKeyState(VK_F2)) {
            if (sleeptime < 350) {
                sleeptime = sleeptime + 30;
                add = add - 2;
                if (sleeptime == 350) {
                    add = 1;
                }
            }
        }
        Sleep(sleeptime);
        snakemove();
    }
}

void lostdraw() {
    system("cls");
    int i, j;
    gotoxy(17, 5);
    color(11);
    printf("+------------------------");

    gotoxy(35, 5);
    color(14);
    printf("o00o");

    gotoxy(39, 5);
    color(11);
    printf("----------");

    gotoxy(48, 5);
    color(14);
    printf("---");

    gotoxy(51, 5);
    color(11);
    printf("----------");

    gotoxy(61, 5);
    color(14);
    printf("o00o");

    gotoxy(65, 5);
    color(11);
    printf("-----------------+");

    for (i = 6; i <= 19; i++) {
        gotoxy(17, i);
        printf("|");
        gotoxy(82, i);
        printf("|");
    }
    gotoxy(17, 20);
    printf("+----------------------------------");

    gotoxy(52, 20);
    color(11);
    printf("-----------------------------+");
}

void endgame() {
    system("cls");
    if (endgamestatus == 1) {
        lostdraw();
        gotoxy(35, 9);
        color(12);
        printf("对不起,您撞到墙了。游戏结束!");
    } else if (endgamestatus == 2) {
        lostdraw();
        gotoxy(35, 9);
        color(12);
        printf("对不起,您咬到自己了。游戏结束!");
    } else if (endgamestatus == 3) {
        lostdraw();
        gotoxy(40, 9);
        color(12);
        printf("您结束了游戏。");
    }
    gotoxy(43, 12);
    color(13);
    printf("您的得分是 %d", score);
    if (score >= highscore) {
        color(10);
        gotoxy(33, 16);
        printf("创新纪录啦!你真棒!!!");
        file_in();
    }
    choose();
}
void file_in() //将最高分存储到文件中
{
    FILE *fp;
    fp = fopen("save.txt", "w+"); //以读写的方式建立文件
    fprintf(fp, "%d", score);
    fclose(fp);
}
void choose() {
    int n;
    gotoxy(25, 23);
    color(12);
    printf("重玩一局-------1");
    gotoxy(52, 23);
    printf("不玩了,退出-------2");
    gotoxy(46, 25);
    color(11);
    printf("选择:");
    scanf("%d", &n);
    switch (n) {
        case 1:
            system("cls");
            score = 0;
            sleeptime = 200;
            add = 10;
            printsnake();
            wlcome();
            break;
        case 2:
            exit(0);
            break;
        default:
            gotoxy(35, 27);
            color(12);
            printf("您输入有误,请重新输入");
            system("pause >nul"); //按任意键
            endgame();
            choose();
            break;
    }
}
void explation() {
    int i, j = 1;
    system("cls");
    color(13);
    gotoxy(44, 3);
    printf("游戏说明");
    color(2);
    for (i = 6; i <= 22; i++) {
        for (j = 20; j <= 75; j++) {
            gotoxy(j, i);
            if (i == 6 || i == 22)
                printf("=");
            else if (j == 20 || j == 75)
                printf("||");
        }
    }
    color(3);
    gotoxy(30, 8);
    printf("1、不能穿墙,不能咬到自己");
    color(3);
    gotoxy(30, 8);
    printf("1、不能穿墙,不能咬到自己");
    color(10);
    gotoxy(30, 11);
    printf("2、用↑↓←→分别控制蛇的移动");
    color(14);
    gotoxy(30, 14);
    printf("3、F1为加速,F2为减速");
    color(11);
    gotoxy(30, 17);
    printf("4、按空格键暂停游戏,再按空格键继续");
    color(4);
    gotoxy(30, 20);
    printf("5、ESC:退出游戏,space:暂停游戏");
    getch(); //按任意键返回主界面
    system("cls");
    printsnake();
    wlcome();
}

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2021-07-11 16:27:42  更:2021-07-11 16:28:57 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/4 19:00:18-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码