c语言小游戏 精简_一个简易的贪吃蛇小游戏C语言源码

/*

*程序名称:贪吃蛇v2.1

*程序描述:一个简易的贪吃蛇小游戏

*版本信息:v2.1

*v1.1版本更新:1:加入菜单选择项

*v1.2版本更新:1:修复菜单选择bug

*v1.3班本更新:1:加入难度选择项

*             2:增加键盘采集频率,大大增加操作灵敏度

*             3:优化屏幕刷新频率,平衡刺眼的情况

*v2.0版本更新:1:使用新的数据存储结构

*             2:使用全新的蛇的形状,更加美观

*             3:解决了1.X版本地图长宽不等距的问题

*v2.1版本更新:1:修复蛇行进过程中快速切换方向至死亡的bug

*             2:屏幕刷新改为蛇每前进一次刷新一次,闪屏更柔和

*             3:更新退出后版本信息的输出

*/

#include

#include

#include

#include

#include

#include

int i;

#define N 25

#define M 22

//结构体名的宏定义

#define STRU_B struct board

//结构体元素part的值定义

#define bBORDER "◆"

#define sHEAD "■"

#define sBODY "◆"

#define sTAIL "◇"

#define bNONE "  "

#define bFOOD "☆"

//结构体元素drection的值定义

#define UP 24

#define DOWN 25

#define RIGHT 26

#define LEFT 27

struct board{

char drection;

char part[4];

};

void print_first(void);

int degree_difficulty(void);

void start(int diff);

void initialise_board(STRU_B(*p)[N]);

void creat_sanke(STRU_B(*p)[N]);

void show_board(STRU_B(*p)[N]);

int move_snake(STRU_B(*p)[N], char drection);

void delete_tail(STRU_B(*p)[N]);

void lose(STRU_B(*p)[N]);

void add_food(STRU_B(*p)[N]);

void print_last();

int main(void)

{

print_first();

do

{

start(degree_difficulty());

printf("1:再来一局\n2:退出\n请选择:");

fflush(stdin);

scanf("%d", &i);

} while (i == 1);

print_last();

return 0;

}

void print_first(void)

{

printf("*************欢迎来到贪吃蛇*************\n\n");

printf("使用键盘上、下、左、右键控制方向\n\n\n");

}

int degree_difficulty(void)

{

int diff;

do

{

printf("\n请选择难度:(1——3):");

scanf("%d", &diff);

switch (diff)

{

case 1:diff = 10; break;

case 2:diff = 6; break;

case 3:diff = 2; break;

default:

break;

}

if (2 <= diff && diff <= 10)

return diff;

printf("\n请输入正确的编号选择难度:(1——3):");

} while (1);

}

void start(int diff)

{

STRU_B board[M][N];

char drection = RIGHT;

int isn_lose = 1, i, dc;

initialise_board(board);

creat_sanke(board);

while (isn_lose)

{

dc = 0;

system("CLS");

show_board(board);

for (i = 0; i < diff; i++)

{

if (GetKeyState(VK_UP) < 0 && drection != DOWN && dc == 0) drection = UP, dc++;

if (GetKeyState(VK_DOWN) < 0 && drection != UP && dc == 0) drection = DOWN, dc++;

if (GetKeyState(VK_LEFT) < 0 && drection != RIGHT && dc == 0) drection = LEFT, dc++;

if (GetKeyState(VK_RIGHT) < 0 && drection != LEFT && dc == 0) drection = RIGHT, dc++;

Sleep(10);

}

isn_lose = move_snake(board, drection);

}

system("CLS");

show_board(board);

}

void initialise_board(STRU_B(*p)[N])

{

int i, j;

for (j = 0; j < N; j++)

strcpy(p[0][j].part , bBORDER);

for (i = 1; i < M - 1; i++)

for (j = 0; j < N; j++)

if (j == 0 || j == (N - 1))

strcpy(p[i][j].part , bBORDER);

else

strcpy(p[i][j].part , bNONE);

for (j = 0; j < N; j++)

strcpy(p[M - 1][j].part , bBORDER);

}

void creat_sanke(STRU_B(*p)[N])

{

p[M / 2][N / 2].drection = RIGHT;

strcpy(p[M / 2][N / 2].part , sHEAD);

p[M / 2][N / 2 - 1].drection = RIGHT;

strcpy(p[M / 2][N / 2 - 1].part , sBODY);

p[M / 2][N / 2 - 2].drection = RIGHT;

strcpy(p[M / 2][N / 2 - 2].part , sTAIL);

add_food(p);

}

void show_board(STRU_B(*p)[N])

{

int i, j;

for (i = 0; i < M; i++)

{

for (j = 0; j < N; j++)

printf("%s", p[i][j].part);

printf("\n");

}

}

int move_snake(STRU_B(*p)[N], char drection)

{

int i, j, NH = 0;

for (i = 0; i < M; i++)

for (j = 0; j < N; j++)

{

if (strcmp(p[i][j].part, bNONE) == 0 || strcmp(p[i][j].part, sBODY) == 0);

else if (strcmp(p[i][j].part , sHEAD) == 0 && NH == 0)

{

p[i][j].drection = drection;

switch (drection)

{

case UP:if (strcmp(p[i - 1][j].part , bBORDER) == 0) { lose(p); return 0; }

if (strcmp(p[i - 1][j].part , bFOOD) == 0) add_food(p);

else delete_tail(p);

p[i - 1][j] = p[i][j];

break;

case DOWN:if (strcmp(p[i + 1][j].part, bBORDER) == 0) { lose(p); return 0; }

if (strcmp(p[i + 1][j].part, bFOOD) == 0) add_food(p);

else delete_tail(p);

p[i + 1][j] = p[i][j];

break;

case LEFT:if (strcmp(p[i][j - 1].part, bBORDER) == 0) { lose(p); return 0; }

if (strcmp(p[i][j - 1].part, bFOOD) == 0) add_food(p);

else delete_tail(p);

p[i][j - 1] = p[i][j];

break;

case RIGHT:if (strcmp(p[i][j + 1].part, bBORDER) == 0) { lose(p); return 0; }

if (strcmp(p[i][j + 1].part, bFOOD) == 0) add_food(p);

else delete_tail(p);

p[i][j + 1] = p[i][j];

break;

}

strcpy(p[i][j].part, sBODY);

NH++;

}

}

return 1;

}

void delete_tail(STRU_B(*p)[N])

{

int i, j, NT = 0;

for (i = 0; i < M; i++)

for (j = 0; j < N; j++)

if (strcmp(p[i][j].part, sTAIL) == 0 && NT == 0)

{

switch (p[i][j].drection)

{

case UP:strcpy(p[i - 1][j].part, p[i][j].part), strcpy(p[i][j].part, bNONE);

break;

case DOWN:strcpy(p[i + 1][j].part, p[i][j].part), strcpy(p[i][j].part, bNONE);

break;

case LEFT:strcpy(p[i][j - 1].part, p[i][j].part), strcpy(p[i][j].part, bNONE);

break;

case RIGHT:strcpy(p[i][j + 1].part, p[i][j].part), strcpy(p[i][j].part, bNONE);

break;

}

NT++;

}

}

void lose(STRU_B(*p)[N])

{

strcpy(p[M / 2][N / 3].part, "Yo");

strcpy(p[M / 2][N / 3 + 1].part, "u ");

strcpy(p[M / 2][N / 3 + 2].part, "lo");

strcpy(p[M / 2][N / 3 + 3].part, "se");

strcpy(p[M / 2][N / 3 + 4].part, "! ");

}

void add_food(STRU_B(*p)[N])

{

int x, y;

srand(time(0));

x = (rand() % N - 2) + 1;

y = (rand() % M - 2) + 1;

while (strcmp(p[y][x].part, bNONE) != 0)

{

x = (rand() % N - 2) + 1;

y = (rand() % M - 2) + 1;

}

strcpy(p[y][x].part, bFOOD);

}

void print_last()

{

system("CLS");

printf("\n\n\n********************************************************\n");

printf("*                                                      *\n");

printf("*                      贪吃蛇v2.1                      *\n");

printf("*                                                      *\n");

printf("********************************************************\n");

Sleep(1000);

}

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

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

相关文章

IntelliJ IDEA for Mac 如何设置 tab 键为 4 个空格?

使用快捷键 Command , 打开偏好设置窗口如下所示&#xff1a; 设置好以后&#xff0c;可以按 Option Command L 整理格式&#xff0c;然后选中缩进的部分&#xff0c;如果能选中缩进的部分&#xff0c;证明是空格&#xff1a; 如果不想整理格式&#xff0c;还可以用 edit…

gc垃圾收集器 与gc算法_GC解释:收集器概述

gc垃圾收集器 与gc算法当前版本的HotSpot JVM包括三种类型的垃圾收集器&#xff1a; –串行收集器 –并行收集器 –多数同时收集者 它们都是世代的&#xff0c;这意味着它们利用了堆的划分方式 。 垃圾收集器负责三个主要操作&#xff1a; –查找不再使用的对象 –释放这…

安兔兔跑分可信吗_安兔兔安卓手机跑分性能榜公布:第一名实至名归?

3月5日消息&#xff0c;安兔兔官方放出了2019年2月份国内安卓手机的性能跑分排行榜。从榜单中我们可以看到排名前三的分别是&#xff1a;小米9、联想Z5 Pro GT 855版、红魔Mars电竞手机。不出所料&#xff0c;前三名都是高通平台的旗舰Soc&#xff0c;骁龙855和骁龙845。骁龙85…

c语言sort函数排序二维数组,c++ - 如何使用stl sort函数根据第二列对二维数组进行排序? - 堆栈内存溢出...

stl排序要求迭代器的rvalue作为参数传递。 如果你想使用sort函数&#xff0c;你必须在c 11中编译并使用数组stl来存储数组。 代码如下#include "bits/stdc.h"using namespace std;bool compare( array a, array b){return a[0]}int main(){int i,j;array, 5> ar1…

IntelliJ IDEA for Mac 类和方法注释模板设置

文章目录类注释模板设置使用 File and Code Templates方法 1&#xff1a;直接在编辑区编写模板代码方法 2&#xff1a;使用 parse 指令来引用注释模板使用 Live Templates方法注释模板设置注意事项解决注释模板无法获取参数名和返回值类型的问题类注释模板设置 使用 File and …

java streams_使用JShell的Java 9 Streams API

java streams这篇文章着眼于使用JShell的Java 9 Streams API。 Streams API的更改以Java 8中Streams的成功为基础&#xff0c;并引入了许多实用程序方法– takeWhile&#xff0c;dropWhile和iterate。 这篇文章延续了My Top Java 9功能&#xff0c;并使用Jshell探索了这些方法。…

c语言中dfs用pos做参数,LeetCode算法练习——深度优先搜索 DFS(2)

更多干货就在我的个人博客 BlackBlog.tech 欢迎关注&#xff01;也可以关注我的csdn博客&#xff1a;黑哥的博客谢谢大家&#xff01;我们继续LeetCode之旅.做了一段时间的LeetCode&#xff0c;感觉还是不错的。算法很基础&#xff0c;没有特别难的(至少我看在做的)&#xff0c…

机试题型_2020年焊工(技师)新版试题及焊工(技师)试题及答案

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序2020年焊工(技师)新版试题及焊工(技师)试题及答案&#xff0c;包含焊工(技师)新版试题答案和解析及焊工(技师)试题及答案练习。由安全生产模拟考试一点通公众号结合国家焊工(技师)考试最新大纲及焊工(技师)考试真题汇总…

Eclipse 如何修改默认工作空间和切换工作空间(Workspace)

文章目录如何关闭/开启 Eclipse Launcher 弹窗提示通过配置文件设置通过 IDE 的偏好设置如何修改 Eclipse 默认的工作空间和切换工作空间通过配置文件修改通过 Eclipse Launcher 窗口修改通过菜单来切换工作空间如何关闭/开启 Eclipse Launcher 弹窗提示 通过配置文件设置 ec…

hashmap java_Java – HashMap详细说明

hashmap javaHashMap基于哈希算法工作&#xff0c;根据Java文档HashMap具有以下四个构造函数&#xff0c; 建设者 描述 HashMap ​() 构造一个空的 具有默认初始容量&#xff08;16&#xff09;和默认加载因子&#xff08;0.75&#xff09;的HashMap 。 HashMap ​(int i…

Tomcat 的目录结构

bin&#xff1a;存放的是可执行文件&#xff0c;比如启动和关闭服务器的一些脚本命令 conf&#xff1a;存放的是 Tomcat 服务器的各种全局配置文件&#xff0c;其中包括 server.xml&#xff08;Tomcat的主要配置文件&#xff09;、tomcat-users.xml 和 web.xml 等配置文件 li…

广州电子厂房净化工程_简述设计电子车间净化工程的注意要点

在电子车间净化工程的设计、安装、选择净化设备与彩钢夹芯板的时候有哪些需要注意的要点呢?这些看起来不太重要的细节&#xff0c;却往往大大的影响了电子净化车间的净化效率与洁净度。而且这些注意要点&#xff0c;不仅在电子净化车间中适用&#xff0c;在食品加工厂、制药净…

C语言循环结构素数判断,C语言实验之判断素数(循环结构java)方法讲解

C语言实验之判断素数(循环结构java)方法讲解Problem Description从键盘上输入任意一个正整数&#xff0c;然后判断该数是否为素数。如果是素数则输出"This is a prime."否则输出“This is not a prime.”Input输入任意一个正整数n(1 < n < 1000000)。Output判断…

使用log4j记录日志_使用log4j2免费分配日志记录

使用log4j记录日志介绍 最近&#xff0c;我正在为一个客户端工作&#xff0c;试图为大型精心制作的Java系统消除一些GC暂停。 经过分析后&#xff0c;我意识到大部分垃圾都是通过日志记录产生的&#xff01; 是否有一种简单的方法来删除所有分配&#xff1f; 原来有:) 我应该使…

Java Web工程结构_项目结构

文章目录Eclipse 的 Java Web 工程目录结构IDE 的目录结构截图本地的工作空间&#xff08;Workspace&#xff09;中的目录结构目录说明Eclipse 的 Java 工程目录结构IDE 的目录结构截图本地的工作空间中的工程目录MyEclipse 的 Java Web 工程目录结构IDE 目录结构截图本地的工作…

一天发多少短信会封号_枸杞一天吃多少?吃多了会怎样?黑枸杞红枸杞哪个好?...

●枸杞一天吃多少&#xff1f;其实枸杞作为一种滋补品&#xff0c;不适合过多的使用&#xff0c;因为那样反而会造成反作用和不良影响&#xff0c;健康的成年人每天吃20克左右就合适了&#xff0c;这样对一些疾病的治疗&#xff0c;才可以发挥更好的效果。如果是用枸杞子泡水喝…

c语言线程传int值,如何用C语言实现多线程

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼Windows操作系统&#xff0c;C语言实现多线程&#xff1a;#include #include DWORD APIENTRY ThreadOne ( LPVOID threadArg ){printf ( "线程开始啦&#xff0c;参数是&#xff1a;%s\n" , (char *)threadArg );return …

aws集群重启_在AWS中设置Cassandra集群

aws集群重启Apache Cassandra是一个NoSQL数据库&#xff0c;它使用一致的哈希机制可以轻松进行水平扩展。 七年前&#xff0c;我尝试了它&#xff0c;并决定不将其用于我的附带项目&#xff0c;因为它太新了。 现在情况有所不同&#xff0c;Cassandra早已建立起来&#xff0c;背…

IntelliJ IDEA for Mac 如何将普通 Java 项目变为 Web 项目

点击菜单栏 File --> Project Structure 在弹出的窗口中点击选择左侧的 Facets&#xff0c;接着点击右边的 &#xff0c;弹出的菜单中选择 web 在弹出的 『Choose Module』窗口中选择要转为 web 的项目&#xff08;模块&#xff09;&#xff0c;然后点击 OK 选择好模块后…

python flagin flagout_Python 进阶之路 (十) 再立Flag, 社区最全的itertools深度解析(中)...

前情回顾大家好&#xff0c;我又回来了。今天我会继续和大家分享itertools这个神奇的自带库&#xff0c;首先&#xff0c;让我们回顾一下上一期结尾的时候我们讲到的3个方法&#xff1a;combinations()combinations_with_replacement()permutations()让我们对这3个在排列组合中…