基于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日

相关文章

  • java中JSONObject转换为HashMap(方法+main方法调用实例)

    将JSONObject转换为HashMap的方法: 首先,需要导入如下两个包: import org.json.JSONObject; import java.util.HashMap; 接着,通过以下代码可以将JSONObject对象转换为HashMap对象: JSONObject jsonObject = new JSONObject("{\&…

    C 2023年5月23日
    00
  • 神舟K570C怎么样?神舟精盾K570C笔记本评测图文详细介绍

    神舟K570C笔记本评测 神舟K570C是一款高性能笔记本电脑,它被广泛应用于办公和娱乐等方面。本篇文章将从外观、配置、性能等多个方面来介绍神舟K570C。 外观 神舟K570C采用了一款黑色金属材质,整体风格简约大气,手感舒适,具有一定的耐磨性。机身较为轻薄,采用14英寸的IPS屏幕,分辨率为1920*1080。键盘布局合理,手感柔软,背光灯的设计让用户在…

    C 2023年5月23日
    00
  • Python JSON格式数据的提取和保存的实现

    下面是“Python JSON格式数据的提取和保存的实现”的完整攻略。 JSON格式概述 JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于人阅读和编写,同时也易于机器解析和生成。JSON使用Unicode字符集,支持数字、字符串、布尔值、null、数组和对象,具有较高的可读性。 提取JSON数据 在Python…

    C 2023年5月23日
    00
  • 荣耀畅玩7c怎么开启热点?荣耀畅玩7c开启热点教程

    下面给您详细讲解荣耀畅玩7c如何开启热点的完整攻略: 一、前置条件 在进行热点开启之前,请确保您的荣耀畅玩7c已经连接到移动网络,并且您已经知道热点开启会消耗您的移动网络流量。 二、开启热点 从荣耀畅玩7c的系统设置进入到 “更多连接方式” 页面。 在更多连接方式页面中,点击 “个人热点”。如果您没有在荣耀畅玩7c上设置过热点,第一次点击个人热点会提示您开启…

    C 2023年5月23日
    00
  • win10蓝屏0xc0000001安全模式进不了怎么办?win10出现0xc0000001的解决方法

    win10蓝屏0xc0000001安全模式进不了的解决方法 如果你在使用win10时,突然遇到了蓝屏问题,并且提示0xc0000001错误代码,那么该怎么办呢?事实上,很多用户在此遇到问题时感到很困惑,接下来,我们将为大家详细讲解win10蓝屏0xc0000001安全模式进不了的解决方法,帮助大家轻松摆脱此问题。 方法一:通过修复启动 修复启动是一种通用的解…

    C 2023年5月23日
    00
  • C语言实现ATM机存取款系统

    C语言实现ATM机存取款系统 介绍 本文将介绍如何使用C语言实现一个简单的ATM机存取款系统。该系统包括用户登录、查询余额、存款、取款等基本功能。我们将使用C语言编写程序,使用结构体、函数、文件存储等技术实现系统的各项功能。 准备 在开始编写程序之前,需要确保您已经安装了C语言编译器。您可以选择常用的编译器,例如gcc或者Visual Studio等。本文将…

    C 2023年5月23日
    00
  • PHP实现基于图的深度优先遍历输出1,2,3…n的全排列功能

    实现基于图的深度优先遍历并输出1,2,3…n的全排列功能可以分为以下几个步骤: 构建无向图 为了实现深度优先遍历,我们需要先构建一个无向图。对于1,2,3…n,我们可以将它们看成节点,而对于任意两个节点i和j,如果它们代表的数字的差的绝对值等于1,那么i和j之间就可以连一条边。这样,我们就可以得到一个无向图,方便后续的遍历操作。 实现深度优先遍历 深…

    C 2023年5月22日
    00
  • C++中的类成员函数当线程函数

    C++中的线程库(std::thread)可以处理各种类型的函数作为线程函数,包括类的成员函数。对于类成员函数,我们需要考虑如何处理this指针,并注意线程的生命周期。 以下是将类成员函数作为线程函数的完整攻略: 步骤1:定义类 首先,需要定义一个含有成员函数的类。本例中,我们定义了一个简单的Counter类,它具有公共函数increment(),用于增加计…

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