同年游戏--->贪吃蛇的案例及实现(纯c语言)

 

 

案例中用到得知识点

 比较长的代码SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),coord);

注意这个的头文件是windows.h

 控制移动的代码

_getch是识别你键盘的输入,而_kbhit()是识别是否输入字符

隐藏光标

 CONSOLE_CURSOR_INFO cci;
    cci.dwSize = sizeof(cci);
    cci.bVisible = FALSE;
    SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cci);

不要问为什么?打上就对了

代码区

1.创建一个测试文件test.c,里面含有菜单界面就ok

#include<stdio.h>
#include<windows.h>
#include"贪吃蛇.h"
void menu()
{
    printf("***************************************\n");
    printf("************    贪吃蛇    *************\n");
    printf("***************************************\n");
    printf("*********    1. 开始游戏   ************\n");
    printf("*********  2. 查看游戏规则 ************\n");
    printf("*********    0. 退出游戏   ************\n");

}
void game()
{
    start_game();
}
void yinchangguangbiao()
{
    CONSOLE_CURSOR_INFO cci;
    cci.dwSize = sizeof(cci);
    cci.bVisible = FALSE;
    SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cci);
}


int main()
{
    //隐藏光标
    yinchangguangbiao();
    srand((unsigned int)time(NULL));
    menu();
    printf("请输入要选择的选项\n");
    int input=0;
    scanf("%d", &input);
    switch (input)
    {
    case 1:
    {
        system("cls");
        //设置光标位置
        COORD b; b.X = 25; b.Y = 10;
        SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), b);
        printf("游戏开始喽\n");
        //Sleep(5000);//这个要不要都行,就是停止操作5000ms
        system("cls");//清空屏幕操作
        game();
            break;
    }
    case 2:
    {
        printf("游戏规则\n");
        break;
    }
    case 0:
    {
        printf("退出游戏\n");
        break;
    }
    }


}

2.建立一个贪吃蛇.h文件,里面含有函数声明等,还有结构体变量声明

我这里没有补全函数声明

#pragma once
#include<stdio.h>
#include<windows.h>
#include<stdlib.h>
#include<time.h>
#include<conio.h>

#define width 25
#define leng 60
typedef struct place
{
    int x;
    int y;
}place;


typedef struct snack
{
    place body[width * leng];
    place food;
    int size;
    COORD coord;
    int dx;
    int dy;
    int score;
    place transmit;
    place destination;
}snack;

void init_game();

void creatfood();

void move();

void start_game();
 

3.建立一个贪吃蛇.c文件

#include"贪吃蛇.h"
//画边界
void kuang()
{
    for (int i = 0; i <= width+1; i++)
    {
        for (int j = 0; j <= leng+1 ; j++)
        {
            if (j == 0 || j == leng+1  || i == 0 || i == width+1 )
                printf("+");
            else printf(" ");
        }
        printf("\n");
    }
}
//画蛇
void huashe(snack*s1)
{
    int i = 0;
    while(i<s1->size)
    {
        s1->coord.X = s1->body[i].x;
        s1->coord.Y = s1->body[i].y;
        SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), s1->coord);

        if (i == 0)
        {
            printf("@");
        }
        else
        {
            printf("*");
        }
        i++;
    }
}
//初始化游戏界面
void init_game(snack*s1)
{
    s1->destination.x = leng / 2;
    s1->destination.y = width / 2;
    
    s1->size = 2;
    s1->body[0].x = leng / 2;
    s1->body[0].y = width / 2;
    s1->body[1].x = leng / 2+1;
    s1->body[1].y = width / 2;
    s1->dx = 1;
    s1->dy = 0;
    s1->score = 0;
    //1.打印边框
    kuang();
    //2.画起始位置的蛇
    huashe(s1);
    //
    creatfood(s1);
    return s1;
}
//创造食物
void creatfood(snack*s1)
{
    s1->food.x = rand() % (leng - 2) + 1;
    s1->food.y = rand() % (width - 2) + 1;
    
    s1->coord.X = s1->food.x;
    s1->coord.Y = s1->food.y;
    SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), s1->coord);
    //判断食物是否长在体内
    printf("#");

    int i = 0;
    for(i=0;i<s1->size;i++)
    {
        if (s1->food.x == s1->body[i].x &&
            s1->food.y == s1->body[i].y)
        {
            creatfood(s1);
            break;
        }
    }
}
//吃食物
void eat_food(snack* s1)
{
    if (s1->body[0].x == s1->food.x &&
        s1->body[0].y == s1->food.y)
    {
        creatfood(s1);
        s1->size++;
        s1->score += 10;
    }
    
}
//蛇的移动
void snack_move(snack* s1)
{
    s1->coord.X = s1->body[s1->size-1].x;
    s1->coord.Y = s1->body[s1->size-1].y;
    SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), s1->coord);
    printf(" ");
    for (int i = s1->size - 1; i > 0; i--)
        s1->body[i] = s1->body[i - 1];
    s1->body[0].x += s1->dx;
    s1->body[0].y += s1->dy;
    if(s1->body[0].x==s1->transmit.x&&
        s1->body[0].y==s1->transmit.y)
    {
        s1->body[0].x = s1->destination.x;
        s1->body[0].y = s1->destination.y;
    }
    
}
//搭建传送点
void chaunsong(snack* s1)
{
    s1->transmit.x = 23;
    s1->transmit.y = 10;
    s1->coord.X = s1->transmit.x;
    s1->coord.Y = s1->transmit.y;
    SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), s1->coord);
    printf("T");
}
//控制方向
void control_snack(snack* s1)
{
    char key = 0;
    while (_kbhit())
    {
        key = _getch();
    }
    switch (key)
    {
    case 'a':
    {
        if(s1->dx!=1)
        {
            s1->dx = -1;
            s1->dy = 0;
        }
        break;
    }
    case 'w':
    {
        if(s1->dy!=1)
        {
            s1->dx = 0;
            s1->dy = -1;
        }
        break;
    }
    case 's':
    {
        if(s1->dy!=-1)
        {
            s1->dx = 0;
            s1->dy = 1;
        }
        break;
    }
    case 'd':
    {
        if(s1->dx!=-1)
        {
            s1->dx = 1;
            s1->dy = 0;
        }
        break;
    }
    }
}
//结束游戏界面
void end_game(snack* s1)
{
    s1->coord.X = leng/2;
    s1->coord.Y = width/2;
    SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), s1->coord);
    printf("游戏结束\n");
    s1->coord.X = leng / 2;
    s1->coord.Y = width / 2+1;
    SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), s1->coord);
    printf("你的成绩是:%d", s1->score);
    Sleep(3000);
    exit(0);
}
//判断是否结束
void is_end(snack* s1)
{
    if (s1->body[0].x > leng || s1->body[0].x < 1 ||
        s1->body[0].y > width || s1->body[0].y < 1)
        end_game(s1);
    for (int i = 1; i < s1->size; i++)
    {
        if (s1->body[0].x == s1->body[i].x &&
            s1->body[0].y == s1->body[i].y)
            end_game(s1);
    }
}
//开始游戏
void start_game()
{
    
    //初始化界面
    snack* s1 = (snack*)malloc(sizeof(snack));
    init_game(s1);
    while (1)
    {
        chaunsong(s1);
        //改变蛇的方向
        control_snack(s1);
        //蛇的移动
        snack_move(s1);
        //画蛇
        huashe(s1);
        //蛇吃食物
        eat_food(s1);
        //判断结束
        //1.越界
        //2.咬到自己
        is_end(s1);
        Sleep(100);
    }
}
 

如果要其他玩法,可以自行补齐。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值