C语言实战演练之贪吃蛇游戏

贪吃蛇游戏的C语言实现主要包括以下几个步骤:

 

 

1. 初始化游戏界面:

 

设置窗口大小,背景颜色等。

 


2. 创建蛇的数据结构:

 

 

包括蛇头的位置、蛇身的长度、蛇身的坐标等。


3. 创建食物的数据结构:

 

包括食物的位置等。


4. 控制蛇的移动:

 

根据用户的输入(上下左右键)来改变蛇头的位置,然后更新蛇身的坐标。

 


5. 判断游戏是否结束:

 

如果蛇头碰到自己的身体或者窗口边界,则游戏结束。

 

 


6. 绘制游戏界面:

 

在每次更新游戏状态后,都需要重新绘制游戏界面,包括蛇和食物。

 

 

 

 

 

以下是一个简单的贪吃蛇游戏的C语言代码示例:

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

#define WIDTH 50
#define HEIGHT 25

int snake_x[WIDTH * HEIGHT], snake_y[WIDTH * HEIGHT];
int food_x, food_y;
int snake_length;
int direction; // 0:上, 1:右, 2:下, 3:左

void gotoxy(int x, int y) {
    COORD coord;
    coord.X = x;
    coord.Y = y;
    SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);
}

void init() {
    srand((unsigned)time(NULL));
    snake_length = 3;
    direction = rand() % 4; // 随机生成初始方向
    for (int i = 0; i < snake_length; i++) {
        snake_x[i] = snake_length - i - 1;
        snake_y[i] = rand() % (HEIGHT - 2) + 1; // 蛇身不能出界
    }
    food_x = rand() % (WIDTH - 2) + 1;
    food_y = rand() % (HEIGHT - 2) + 1;
}

void draw() {
    system("cls"); // 清屏
    for (int i = 0; i < WIDTH; i++) {
        printf("#");
    }
    printf("
");
    for (int i = 1; i < HEIGHT - 1; i++) {
        printf("#");
        for (int j = 1; j < WIDTH - 1; j++) {
            int is_snake = 0;
            for (int k = 0; k < snake_length; k++) {
                if (snake_x[k] == j && snake_y[k] == i) {
                    printf("*"); // 蛇身用*表示
                    is_snake = 1;
                    break;
                }
            }
            if (!is_snake) {
                if (food_x == j && food_y == i) {
                    printf("@"); // 食物用@表示
                } else {
                    printf(" "); // 空白表示空地
                }
            }
        }
        printf("#
");
    }
    for (int i = 0; i < WIDTH; i++) {
        printf("#");
    }
    printf("
");
}

void update() {
    int next_x = snake_x[0], next_y = snake_y[0];
    switch (direction) {
        case 0: next_y--; break; // 上移一格
        case 1: next_x++; break; // 右移一格
        case 2: next_y++; break; // 下移一格
        case 3: next_x--; break; // 左移一格
    }
    if (next_x == food_x && next_y == food_y) { // 如果吃到食物,长度加一,重新生成食物位置
        snake_length++;
        food_x = rand() % (WIDTH - 2) + 1;
        food_y = rand() % (HEIGHT - 2) + 1;
    } else { // 如果没吃到食物,移除蛇尾,即当前位置不变,其他位置向前移动一位,最后一位设为空位(即空地)
        for (int i = snake_length - 1; i > 0; i--) {
            snake_x[i] = snake_x[i - 1];
            snake_y[i] = snake_y[i - 1];
        }
        snake_x[0] = next_x; // 新头部位置设为next_x, next_y(即蛇头的新位置)
        snake_y[0] = next_y; // 因为前面已经把其他位置都向前移动了一位,所以这里不需要再移动了,直接设为next_x, next_y即可(即蛇头的新的坐标)
    }
}
```

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/193599.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【面试HOT200】二叉树——广度优先搜索篇

系列综述&#xff1a; &#x1f49e;目的&#xff1a;本系列是个人整理为了秋招面试的&#xff0c;整理期间苛求每个知识点&#xff0c;平衡理解简易度与深入程度。 &#x1f970;来源&#xff1a;材料主要源于【CodeTopHot200】进行的&#xff0c;每个知识点的修正和深入主要参…

Leetcode 2952. Minimum Number of Coins to be Added

Leetcode 2952. Minimum Number of Coins to be Added 1. 解题思路2. 代码实现 题目链接&#xff1a;2952. Minimum Number of Coins to be Added 1. 解题思路 这一题思路上就是一个贪婪算法的思路&#xff0c;偏数学性多一点。 首先&#xff0c;我们将面值有序排列&#x…

SpringSecurity工作原理

实现功能就是继承这几个对应功能的类。 大概工作流程 Spring Security 的过滤器&#xff08;Filters&#xff09;和拦截器&#xff08;Interceptors&#xff09;是 Spring Security 框架中用于保护 web 应用安全的重要组件。它们在处理 HTTP 请求时扮演不同的角色&#xff0c…

Go 模块系统最小版本选择法 MVS 详解

目录 Golang 模块系统简介 包版本管理 最小版本选择&#xff08;MVS&#xff09;原理 MVS 的优点 MVS的缺点 实际使用MVS 小结 参考资料 Golang 模块系统简介 Golang 模块系统是 Go 1.11 版本引入的一个新特性&#xff0c;主要目的是解决 Go 项目中的依赖管理问题。在模…

Python IDLE: 一个简单易用的Python集成开发环境

简介 Python是一种高级编程语言&#xff0c;被广泛用于科学计算、数据分析、Web开发等领域。要编写和运行Python代码&#xff0c;您需要一个集成开发环境&#xff08;Integrated Development Environment&#xff0c;简称IDE&#xff09;。Python IDLE&#xff08;Integrated …

数学杂谈:残次品的无砝码天平定位问题

数学杂谈&#xff1a;残次品的无砝码天平定位问题 1. 问题描述2. 问题解答3. 问题拓展 1. 引理12. 引理23. 引理34. 推论15. 推论2 1. 问题描述 给出问题如下&#xff1a; 12个乒乓球&#xff0c;有一个次品&#xff0c;不知轻重&#xff0c;用一台无砝码天平称三次&#xf…

uni-app一些目录结构、方法、生命周期、打包、微信小程序登录与支付

1、关于uniapp的目录结构 跟普通vue项目目录结构差不多&#xff0c;多了几个核心文件&#xff0c;manifest.json是配置应用名称、appid、logo、版本等打包信息用的&#xff0c;pages.json的作用是配置页面路径、页面窗口样式、tabBar、navigationBar等页面类信息 2、页面适配方…

c# 浮点余数

double x; double y; double zx%y;对于以上代码 z&#xff08;如果不为零&#xff09;的符号与 x 的符号相同。 z 的绝对值是 |x| - n * |y| 得出的值&#xff0c;其中 n 是小于或等于 |x| / |y| 的最大可能整数&#xff0c;|x| 和 |y| 分别是 x 和 y 的绝对值。 代码示例&am…

【Node.js】笔记梳理 8 - API和JWT

写在最前&#xff1a;跟着视频学习只是为了在新手期快速入门。想要学习全面、进阶的知识&#xff0c;需要格外注重实战和官方技术文档&#xff0c;文档建议作为手册使用 系列文章 【Node.js】笔记整理 1 - 基础知识【Node.js】笔记整理 2 - 常用模块【Node.js】笔记整理 3 - n…

什么是npm?能干什么?

npm是Node.js的包管理器。 npm的主要功能是管理node包&#xff0c;包括&#xff1a;安装、卸载、更新、查看、搜索、发布等。 npm是随同Node.js一起安装的包管理工具&#xff0c;能解决Node.js代码部署上的很多问题&#xff0c;常见的使用场景有以下几种&#xff1a; 允许用…

31、LCD1602功能函数代码

LCD1602功能函数代码 main.c #include <REGX52.H> #include "LCD1602.h" #include "Delay.h"void main() {LCD_Init(); //LCD初始化LCD_ShowChar(1,1,A); //在1行1列显示字符ALCD_ShowString(1,3,"Hello"); //在1行3列显示字符串…

12月03日,每日信息差/菲律宾发生7.4级强震后共录得955次余震/腾讯惩处超 400 万个 QQ 号:这三大行为零容忍

_灵感 ​ &#x1f396; 中国联通&#xff1a;选举陈忠岳为公司董事长 &#x1f384; 菲律宾发生7.4级强震后共录得955次余震 &#x1f30d; 京沪高铁二线“收官段”尘埃落定&#xff1a;潍宿高铁初步设计正式获批 &#x1f30b; 我国燃料电池汽车产业进入提速关键期 &#…

树与二叉树堆:经典OJ题集(2)

目录 二叉树的性质及其问题&#xff1a; 二叉树的性质 问题&#xff1a; 一、对称的二叉树&#xff1a; 题目&#xff1a; 解题思路&#xff1a; 二、另一棵树&#xff1a; 题目&#xff1a; 解题思路&#xff1a; 三、翻转二叉树&#xff1a; 题目&#xff1a;…

synchronized和volatile的区别是什么?

synchronized和volatile是Java中的两个关键词&#xff0c;分别用于实现线程同步和线程间的可见性。 synchronized用于实现线程之间的互斥同步&#xff0c;即同一时刻只能有一个线程访问被synchronized修饰的代码块或方法&#xff0c;其他线程需要等待。synchronized确保了线程…

非功能关键知识总结(一)

文章目录 一、稳定性(一)、服务级别协议1、SLA2、OLA3、UC (二)、可用性指标(三)、突发事件等级 三、质量(一)、千行代码缺陷数量(二)、软件质量模型的发展(三)、产品质量模型 四、安全(一)、网络安全 五、灾备(一)、灾备指标(二)、灾难恢复等级(三)、容灾技术分类 一、稳定性 …

一次电气——电抗器(一)

我之前的工作是在国外建联合循环电厂&#xff0c;现在的工作是研发一次电力设备。虽然仍是在电力行业发展&#xff0c;但这两份不同岗位不同职能的工作究其感受而言有很大的不同。相较于第一份工作&#xff0c;第二份工作带给我带来的更多的是一种由广及微&#xff0c;由浅入深…

为什么已经有了ThreadLocal,还需要SecurityContextHolder呢?

提出一个问题&#xff1a; 为什么已经有了ThreadLocal&#xff0c;还需要有SecurityContextHolder呢&#xff1f; 1、SecurityContextHolder是什么 先解释一些SecurityContextHolder是什么&#xff1a;是SpringSecurity中的一个核心类。 它的作用是&#xff1a;用来管理当前线…

kafka3.6.0部署

部署zk https://mirrors.tuna.tsinghua.edu.cn/apache/zookeeper/zookeeper-3.9.1/apache-zookeeper-3.9.1.tar.gz tar -xf apache-zookeeper-3.9.1.tar.gz -C /apps cd /apps/ && ln -s apache-zookeeper-3.9.1 zookeeper 修改配置bash grep -vE ^$|^# conf/zo…

buuctf [极客大挑战 2019]Havefun1

解题思路&#xff1a; 小习惯 本题先看看源码或者检查一下&#xff0c;可能这是俺的一个小习惯。 源码里面都看到了php的代码 php代码解析&#xff1a; $cat$_GET[cat]; echo $cat; if($catdog){ echo Syc{cat_cat_cat_cat}; } 1.$ca…

<蓝桥杯软件赛>零基础备赛20周--第8周第2讲--排序的应用

报名明年4月蓝桥杯软件赛的同学们&#xff0c;如果你是大一零基础&#xff0c;目前懵懂中&#xff0c;不知该怎么办&#xff0c;可以看看本博客系列&#xff1a;备赛20周合集 20周的完整安排请点击&#xff1a;20周计划 每周发1个博客&#xff0c;共20周&#xff08;读者可以按…