基于C语言实现创意多彩贪吃蛇游戏

基于C语言实现创意多彩贪吃蛇游戏

游戏规则

贪吃蛇游戏是一款经典的益智游戏,其规则如下:

  • 蛇开始时只有一个身体,每当蛇吃到食物时,就会在尾部增加一个身体,同时加分。
  • 蛇每格时间会自动向前移动一格,如果碰到边缘或者碰到自己的身体,则游戏结束。
  • 为了避免蛇一直沿着一条直线前进导致游戏时间过短,游戏中会随机生成食物,蛇需要不断吃食物才能继续游戏。

游戏实现

在C语言中,可以通过控制台进行游戏实现。你可以借助Windows.h头文件中的ANSI控制台文本属性来实现控制台界面的美化,并使用conio.h头文件中的_getch()来实现键盘输入监听。

以下是一份基于C语言的贪吃蛇游戏实现的代码,供你参考。

#include<stdio.h>
#include<conio.h>
#include<windows.h>
#include<stdlib.h>
#include<time.h>
// 定义控制台窗口大小以及游戏区域的宽高
#define WIDTH 20
#define HEIGHT 20
// 定义全局变量
int snake[500][2], food[2], score, end, direction;
// 初始化程序
void start() {
    // 改变控制台窗口大小
    system("mode con cols=40 lines=22");
    // 隐藏光标
    HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
    CONSOLE_CURSOR_INFO CursorInfo;
    GetConsoleCursorInfo(handle, &CursorInfo);
    CursorInfo.dwSize = 1;
    CursorInfo.bVisible = FALSE;
    SetConsoleCursorInfo(handle, &CursorInfo);
    // 初始化游戏摆设
    int i;
    for(i = 0; i < 500; i++){
        snake[i][0] = -1;
        snake[i][1] = -1;
    }
    snake[0][0] = 10;
    snake[0][1] = 10;
    food[0] = -1;
    food[1] = -1;
    score = 0;
    end = 0;
    direction = 1;
}
// 在控制台窗口上打印游戏数据
void draw() {
    int x, y;
    printf("score:%d\n", score);
    printf("===================================\n");
    for(y = 0; y < HEIGHT; y++) {
        printf("|");
        for(x = 0; x < WIDTH; x++){
            if(snake[0][0] == x && snake[0][1] == y) {
                printf("❤");
            } else if(snake[y*WIDTH + x][0] != -1) {
                printf("()");
            } else if(food[0] == x && food[1] == y) {
                printf("★");
            } else {
                printf("  ");
            }
        }
        printf("|\n");
    }
    printf("===================================\n");
}
// 生成食物
void gen_food() {
    if(food[0] == -1) {
        int x = rand() % WIDTH;
        int y = rand() % HEIGHT;
        if(snake[y*WIDTH + x][0] != -1) {
            gen_food();
        } else {
            food[0] = x;
            food[1] = y;
        }
    }
}
// 蛇的移动
void move() {
    int x = snake[0][0], y = snake[0][1];
    switch(direction) {
        case 0://向上
            y--;
            break;
        case 1://向右
            x++;
            break;
        case 2://向下
            y++;
            break;
        case 3://向左
            x--;
            break;
        default:
            break;
    }
    // 判断蛇是否碰到自己的身体
    int i;
    for(i = 1; i < 500; i++) {
        if(snake[i][0] == -1) {
            break;
        }
        if(x == snake[i][0] && y == snake[i][1]) {
            end = 1;
            return;
        }
    }   
    // 判断蛇是否碰到边缘
    if(x < 0 || x >= WIDTH || y < 0 || y >= HEIGHT) {
        end = 1;
        return;
    }
    // 判断蛇是否吃到了食物
    if(x == food[0] && y == food[1]) {
        score++;
        food[0] = -1;
        food[1] = -1;
        for(i = 1; i < WIDTH*HEIGHT; i++){
            if(snake[i][0] == -1){
                snake[i][0] = x;
                snake[i][1] = y;
                return;
            }
        }
    }
    // 移动蛇的身体
    for(i = 499; i > 0; i--){
        if(snake[i][0] != -1){
            snake[i][0] = snake[i-1][0];
            snake[i][1] = snake[i-1][1];
        }
    }   
    // 移动蛇的头部
    snake[0][0] = x;
    snake[0][1] = y;
}
// 处理键盘事件
void input(){
    if(_kbhit()){
        switch(_getch()){
            case 72://↑
                if(direction != 2){
                    direction = 0;
                }
                break;
            case 77://→
                if(direction != 3){
                    direction = 1;
                }
                break;
            case 80://↓
                if(direction != 0){
                    direction = 2;
                }
                break;
            case 75://←
                if(direction != 1){
                    direction = 3;
                }
                break;
            default:
                break;
        }       
    }
}       
// 游戏结束
void gameover(){
    system("cls");
    printf("游戏结束!\n");
    printf("score:%d\n", score);  
}
int main(){
    srand((unsigned)(time(NULL)));
    start();
    while(!end) {
        system("cls");//清除控制台界面
        input();
        gen_food();
        move();
        draw();
        Sleep(100);
    }
    gameover();
    return 0;
}

示例说明

  • 示例1:修改控制台窗口大小
system("mode con cols=40 lines=22");

这条代码可以修改控制台的宽度和高度,使其符合游戏界面的需求。

  • 示例2:打印游戏数据
int x, y;
printf("score:%d\n", score);
printf("===================================\n");
for(y = 0; y < HEIGHT; y++) {
    printf("|");
    for(x = 0; x < WIDTH; x++){
        if(snake[0][0] == x && snake[0][1] == y) {
            printf("❤");
        } else if(snake[y*WIDTH + x][0] != -1) {
            printf("()");
        } else if(food[0] == x && food[1] == y) {
            printf("★");
        } else {
            printf("  ");
        }
    }
    printf("|\n");
}
printf("===================================\n");

这段代码可以打印出游戏界面的状态,包括贪吃蛇的状态、食物的位置和分数的情况。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:基于C语言实现创意多彩贪吃蛇游戏 - Python技术站

(0)
上一篇 2023年5月24日
下一篇 2023年5月24日

相关文章

  • C/C++读写JSON数据的详细过程记录

    C/C++读写JSON数据的详细过程记录 什么是JSON JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于读写和解析,同时也易于机器生成和解析。JSON文本格式在互联网上广泛应用,尤其在Web应用中,如:动态数据的传输。常用于替代XML格式,因为JSON格式更加简洁、易读、易于解析和生成。 读取JSON数据 使…

    C 2023年5月23日
    00
  • python中cPickle类使用方法详解

    下面我将详细讲解“python中cPickle类使用方法详解”的完整攻略。 1. 什么是cPickle cPickle是Python中的一个标准模块,它是pickle模块的C语言版本。它能够将Python对象序列化成一个二进制文件或字符串,使得它们可以在网络上以及在任何其他的Python程序中方便地传递和存储。 2. cPickle的主要用途 2.1 对象的…

    C 2023年5月22日
    00
  • C 标准库 math.h

    首先我们来介绍一下 C 标准库 math.h。 math.h 是 C 标准库的一部分,提供了数学计算相关的函数。使用时需要在程序中包含 math.h 头文件。以下是部分常用的 math.h 函数: 基本数学函数 fabs(x):返回 x 的绝对值 sqrt(x):返回 x 的平方根 pow(x, y):返回 x 的 y 次幂 exp(x):返回 e 的 x …

    C 2023年5月10日
    00
  • C语言给应用程序传递参数

    下面是关于C语言给应用程序传递参数的完整使用攻略,包含以下几个方面的内容: 参数传递方式 使用系统变量 argc 和 argv 获取参数 示例说明 使用 getopt 函数解析参数 参数传递方式 C语言中,给应用程序传递参数可以通过以下两种方式: 通过命令行传递参数 通过环境变量传递参数 通常较常见的是通过命令行传递参数。 使用系统变量 argc 和 arg…

    C 2023年5月9日
    00
  • 详解C语言初阶基础

    详解C语言初阶基础 C语言是一种强大的编程语言,可用于编写操作系统、游戏、桌面应用程序等。本文将详细介绍C语言的初阶基础,以帮助初学者快速掌握C语言的入门知识。 1. C语言的基本概念 C语言是一种结构化的高级编程语言,最初由Dennis Ritchie于1972年开发。它是一门静态类型的编程语言,意味着在编写代码时,程序员必须声明变量的类型,而且一旦声明后…

    C 2023年5月23日
    00
  • C 程序 检查数字是偶数还是奇数

    以下是 “C 程序 检查数字是偶数还是奇数” 的完整使用攻略,包括概述、功能介绍、使用方法及示例说明: 概述 该程序是一个简单的 C 语言程序,可用于检查数字是偶数还是奇数。 功能介绍 该程序接受用户输入一个整数,并检查该整数是偶数还是奇数。如果该整数是偶数,则输出 “Even”;如果该整数是奇数,则输出 “Odd”。 使用方法 打开任意一个 C 语言编译器…

    C 2023年5月9日
    00
  • ACProtect Professional 1.3C 主程序脱壳(1)(图)

    ACProtect Professional 1.3C 主程序脱壳攻略 1. 准备环境 系统环境:Windows操作系统(建议Windows 7以上) 调试器:OllyDbg、x64dbg或者IDA Pro HEX编辑器:WinHex等工具 脱壳工具:ACProtect Unpacker等 2. 破解过程 2.1 加载目标程序并分析 将ACProtect P…

    C 2023年5月23日
    00
  • QT中如何读写ini配置文件

    QT中可以很方便地读写ini格式的配置文件,下面是读写ini配置文件的完整攻略: 1. 先创建QSettings对象 QSettings对象是QT中读写配置文件的对象,调用它的相关方法可以轻松完成对配置文件的读写操作。需要调用QSettings对象的构造函数来创建对象,构造函数的参数有两个:文件名和格式。 例如,在mainwindow.cpp中创建一个叫做m…

    C 2023年5月23日
    00
合作推广
合作推广
分享本页
返回顶部