字符贪吃蛇创新玩法

2023-11-03

C语言贪吃蛇:

include

include

include

include

include

include

include

pragma comment(lib,”Winmm.lib”)

/*宏定义区********/

define X 500 // 保存蛇节点坐标的个数

define Y 500

int len = 640;
int wide = 480;
MCI_PLAY_PARMS mciplay;//定义播放参数mciplay
/*结构定义区******/
struct food
{
int x; // 横坐标
int y; // 纵坐标
int flag; // 食物状态 1: 有食物; 0:没有食物
}food;

struct snake
{
int x[X]; // 蛇身横坐标
int y[Y];
int life; // 生命状态
int node; // 蛇的长度
char direction; // 蛇的方向
int score; // 分数
int grade; // 难度
int speed; // 速度
}snake;

/***函数声明区****/
void initsnake(); // 初始化一条蛇
void print_wall(); // 输出围墙
void out_food(); // 出现食物
void Gameover(); // 结束游戏
void Gamebegin(); // 开始游戏
void dead_case(); // 死亡情况(撞墙 撞自身)
void eat_food(); // 吃掉食物
void init_data(); // 初始化数据
void get_direction(char ch); // 得到方向
void print_snake(); // 输出蛇
void print_score(); // 输出分数
void set_grade(); // 设置等级
void RealseMusic(LPCTSTR strResName,char *DeviceStr); // 播放资源文件中的音乐
void pass(); // 通关函数

/******************************************/
// 提取指定模块中的资源文件
// 参数:
// strDstFile: 目标文件名。提取的资源将保存在这里;
// strResType: 资源类型;
// strResName: 资源名称;
// 返回值:
// true: 执行成功;
// false: 执行失败。
/******************************************/
bool ExtractResource(LPCTSTR strDstFile, LPCTSTR strResType, LPCTSTR strResName); // 提取资源到临时文件

/**函数定义区*****/
void pass()
{
if (snake.speed == 20)
{
EndBatchDraw();
IMAGE img;
loadimage(&img,”IMAGE”,”PASS”,len,wide,true); // s输出通关图片
putimage(0,0,&img);
_getch();
exit(0);
}
}

bool ExtractResource(LPCTSTR strDstFile, LPCTSTR strResType, LPCTSTR strResName)
{
// 创建文件
HANDLE hFile = ::CreateFile(strDstFile, GENERIC_WRITE, NULL, NULL, CREATE_ALWAYS,
FILE_ATTRIBUTE_TEMPORARY, NULL);
if (hFile == INVALID_HANDLE_VALUE)
return false;

// 查找资源文件中、加载资源到内存、得到资源大小
HRSRC    hRes    = ::FindResource(NULL, strResName, strResType);
HGLOBAL    hMem    = ::LoadResource(NULL, hRes);
DWORD    dwSize    = ::SizeofResource(NULL, hRes);

// 写入文件
DWORD dwWrite = 0;      // 返回写入字节
::WriteFile(hFile, hMem, dwSize, &dwWrite, NULL);
::CloseHandle(hFile);

return true;

}

void RealseMusic(LPCTSTR strResName,char *DeviceStr)
{
// 产生临时文件的文件名
TCHAR tmpmp3[_MAX_PATH];
::GetTempPath(_MAX_PATH, tmpmp3);
_tcscat_s(tmpmp3,strResName); // VC 请用 _tcscat函数

// 将 MP3 资源提取为临时文件
ExtractResource(tmpmp3, "MP3",strResName);

// 打开音乐
TCHAR mcicmd[300];
_stprintf_s(mcicmd,"open \"%s\" alias %s",tmpmp3,DeviceStr);
mciSendString(mcicmd, NULL, 0, NULL);

// 播放音乐

// mciSendString(“play mymusic”, NULL, 0, NULL);
}

void set_grade()
{
int grade = 0;

if (snake.speed > 30)
{   
    grade = snake.score / 100 + 1;
    if (snake.grade != grade)
    {
        snake.grade = grade;    // 最高只有7级
        snake.speed -= 30;
    }
}

}

void print_score()
{
char score[10] = “0”;
char grade[3] = “0”;
int x = 0, y1 = 0,y2 = 0;

x =( len /3 + len % 3) * 2;
y1 = wide / 5;
y2 = wide / 3;
set_grade();
_itoa_s(snake.score,score,10);
_itoa_s(snake.grade,grade,10);

setbkmode(TRANSPARENT);                                // 设置文字背景透明
setcolor(RGB(255,255,0));                                    // 设置文字颜色
outtextxy(x + len / 10,y1,"分数:");
outtextxy(x + len / 6,y1,score);
outtextxy(x + len / 10,y2,"操作说明");
outtextxy(x + len / 10,y2 + 20,"a:向左走");
outtextxy(x + len / 10,y2 + 40,"d:向右走");
outtextxy(x + len / 10,y2 + 60,"w:向上走");
outtextxy(x + len / 10,y2 + 80,"s:向下走");
outtextxy(x + len / 10,y1 * 4,"等级:");
outtextxy(x + len / 10 + 40,y1 * 4,grade);
outtextxy(x + len / 10 + 50,y1 * 4,"级");

}

void print_snake()
{
int i;

setfillcolor(BLACK);                        // 设置当前填充色为黑色
/* 输出蛇 */
for (i = 0; i < snake.node; i++)
    fillrectangle(snake.x[i],snake.y[i],snake.x[i] + 10,snake.y[i] + 10);
for (i = snake.node; i > 0; i--)        // 蛇体坐标除了蛇头都读取前一位坐标
{
    snake.x[i] = snake.x[i - 1];
    snake.y[i] = snake.y[i - 1];
}

}

void get_direction(char ch)
{
/* 排除反方向 */
if (snake.direction != ‘a’ && ch == ‘d’)
snake.direction = ‘d’;
else if (snake.direction != ‘d’ && ch == ‘a’)
snake.direction = ‘a’;
else if (snake.direction != ‘w’ && ch == ‘s’)
snake.direction = ‘s’;
else if (snake.direction != ‘s’ && ch == ‘w’)
snake.direction = ‘w’;

/* 蛇移动过程中的方向 */
switch (snake.direction)
{
case 'a': snake.x[0] -= 10; break;
case 'd': snake.x[0] += 10;break;                       
case 'w': snake.y[0] -= 10;break;
case 's': snake.y[0] += 10;break;
}

}

void init_data()
{
/初始化/
snake.score = 0;
snake.x[0] = 20,snake.y[0] = 30;
snake.node = 1;
snake.life = 1; // 1表示活着
food.flag = 0;
snake.grade = 1;
snake.speed = 200;
}

void eat_food()
{
mciplay.dwFrom = 0;
/* 吃掉食物 */
if (snake.x[0] == food.x && snake.y[0] == food.y)
{
// 播放吃的音乐
mciSendString(“seek AteMusic to 0”,0,0,0);
mciSendString(“play AteMusic”,NULL,0,0);
setfillcolor(RGB(219,49,0));
fillrectangle(food.x,food.y,food.x + 10,food.y + 10); // 擦掉食物

    snake.node++;                            // 蛇长加1
    food.flag = 0;                            // 改变食物状态
    snake.score += 10;                    // 改变分数   
}

}

void dead_case()
{
int i = 0;
int x = 0;
x =( len /3 + len % 3) * 2;

/*  判断撞到自身 */
for (i = 2; i < snake.node; i++)               
{
    if (snake.x[i] == snake.x[0] && snake.y[i] == snake.y[0])
    {
        snake.life = 0;
        break;
    }
}

/* 判断是否撞墙 */
if (snake.x[0] > x || snake.x[0] < 10 || snake.y[0] < 10 || snake.y[0] > 470)
    snake.life = 0;

}

void Gamebegin()
{
IMAGE image;
MOUSEMSG msg;

// 初始化
RealseMusic("BeginMusic.mp3","BeginMusic");
RealseMusic("AteMusic.mp3","AteMusic");
// 播放开始的音乐
mciSendString("play BeginMusic", NULL, 0, NULL);

loadimage(&image,"IMAGE","StartCover",len,wide,true);        // s输出开始图片
putimage(0,0,&image);

// setbkmode(TRANSPARENT); // 设置文字背景透明
// setcolor(RGB(255,255,0)); // 设置文字颜色
// outtextxy(len / 3 + 50,wide * 4 / 5,”按任意键继续”);

while (1)                                                        // 等待鼠标点击
{
    msg = GetMouseMsg();
    if (msg.uMsg ==WM_LBUTTONDOWN)
        break;
}
mciSendString("close BeginMusic",NULL,0,NULL);        // 关闭开始音乐
setbkcolor(RGB(219,49,0));        // 设置屏幕背景色为褐色
cleardevice();                   
print_wall();                            // 输出围墙

}

void Gameover()
{

cleardevice();                            // 清屏
IMAGE image;                        // 定义图片对像
char score[10] = "0";                // 临时存储成绩

loadimage(&image,"IMAGE","End",len,wide,true);        // 获取图片
putimage(0,0,&image);                        // 输出图片
setcolor(RED);
_itoa_s(snake.score,score,10);                // 转换分数为自符
outtextxy(270,160,"分数:");                // 输出分数
outtextxy(320,160,score);
outtextxy(270,180,"GAME OVER");

}

void out_food()
{
int x = 0;

x =( len /3 + len % 3) * 2;

srand((unsigned)time(NULL));
if (food.flag == 0)                                // 获取食物坐标
{
    food.x = rand() % (x - 30) + 10;        // 避免出现在围墙范围
    food.y = rand() % 450 + 10;
    food.flag = 1;
}
while (food.x % 10 != 0)                    // 保证食物在格子里面要不吃不到
    food.x++;
while (food.y % 10 != 0)
    food.y++;
setfillcolor(RED);
if (food.flag == 1)                                // 输出食物
    fillrectangle(food.x,food.y,food.x + 10,food.y + 10);

}

/* 画出围墙 */
void print_wall()
{
int i =0;
int x = 0;

x =( len /3 + len % 3) * 2;
setfillcolor(RGB(220,115,10));                            // 设置围墙填充色
for (i = 0; i < wide; i += 10)
{
    fillrectangle(0,i,10,i + 10);                            // 左边围墙
    fillrectangle(x,i,x + 10,i + 10);                        // 中间围墙
    fillrectangle(len - 10,i,len,i + 10);                // 右边围墙                               
}
for (i = 0; i < len; i += 10)
{
    fillrectangle(i,0,i + 10,10);                            // 上边围墙
    fillrectangle(i,wide - 10,i + 10,wide);            // 下边围墙
}

}

void snake_game()
{
char ch = ‘0’;

init_data();

print_score();
setfillcolor(BLACK);                            // 设置当前填充色为黑色
/* 开始时显示一个点蛇头 */
solidrectangle(snake.x[0],snake.y[0],snake.x[0] + 10,snake.y[0] + 10);

snake.direction = _getch();                // 得到方向

BeginBatchDraw();
while (ch != 27)                                    // 按下esc键就退出循环
{   
    print_wall();
    out_food();                                    // 输出食物

    if (_kbhit())
        ch = _getch();

    get_direction(ch);
    print_snake();
    dead_case();        // 蛇是否撞墙或者撞到自身
    /* 判断生命状态 */
    if (snake.life == 0)
        break;   
    eat_food();
    print_score();
    FlushBatchDraw();
    Sleep(snake.speed);
    cleardevice();
    pass();                // 判断通关
}
EndBatchDraw();

}

void main()
{
initgraph(len,wide);

Gamebegin();
snake_game();
Gameover();

_getch();
closegraph();

}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

字符贪吃蛇创新玩法 的相关文章

  • Java 8 中的抽象类和接口到底有啥区别?

    在我们面试时也会经常遇到面试官问抽象类和接口的区别是什么 大部人肯定会说 接口中的所有方法都是抽象的 抽象类中的方法除了抽象方法还可以写实现方法 如果你还这样回答那你就 OUT 啦 要跟上形式 这个问题我在面试一个 39 岁的程序员时 他居
  • Redis配置文件解读

    转载自 http www cnblogs com daizhj articles 1956681 html 对部分配置选项做了一些说明 把配置项目从上到下看了一遍 有了个大致的了解 暂时还用不到一些高级的配置选项 先放在这 用到的时候再回来
  • Teradata SQL 线性回归函数

    基于budget amounts排队得到前三个部门 显示部门号和预算 SELECT department number salary amount RANK salary amount AS Rank FROM dapartment QUA
  • Typescript(九)配置文件 tsconfig.json

    TypeScript 使用 tsconfig json 文件作为其配置文件 当一个目录中存在 tsconfig json 文件 则认为该目录为 TypeScript 项目的根目录 通常 tsconfig json 文件主要包含两部分内容 指
  • unity

    一 理解我们要做的事 原本图片放入文件夹后是Default 默认 模式 但是需要大量处理图片的时候 我们希望它拖进去就是sprite模式 我们想修改unity原本的功能 二 unity是允许我们去修改它本身的一些功能的 你可以定制属于你的u
  • JVM系列(十) 垃圾收集器之 Parallel Scavenge/Old

    上篇文章我们讲解了单线程垃圾收集器 Serial SerialOld 与之相对应的多线程垃圾收集器就是 Parallel Scavenge Old 本文我们讲解下多线程垃圾收集器 Parallel Scavenge Old 垃圾收集器 新生
  • 2018年TI杯电子设计竞赛感悟

    2018年7月27日 电赛结束已经有三四天的时间了 今年的感悟和去年的相比很是不同 去年大一 刚刚入门单片机 搞点东西也都是瞎搞 没有一个像模像样的作品 即使是有也都是一些次品 半成品 得知学校选拔学生参加全国大学生电子设计竞赛 单数年为国
  • linux添加sshkey,linux 配置 ssh密钥登陆

    配置这个其实很简单 一点也不复杂 首先需要在服务器安装openssh 如果你不安装你是找不到配置密钥登陆的配置文件的 yum install y openssh 安装好后就需要去配置密钥登陆了 vi etc ssh sshd config
  • kali持久化U盘镜像安装教程

    https zhuanlan zhihu com p 436210497 utm id 0
  • opencv 轻松入门 面向python pdf_面向Python 的OpenCV轻松入门——第三章(3)

    3 3 按位逻辑运算 逻辑运算是一种非常重要的运算方式 图像处理过程中经常要按照位进行逻辑运算 本节 介绍 Opencv中的按位逻辑运算 简称位运算 在 Opencv内 常见的位运算函数如表3 1所示 表3 1 常见的位运算函数 函数名 基
  • linux的依赖关系

    依赖关系最简单的一个理解就是 Windows 上你玩游戏结果提示 directx 版本过低无法运行 以及常见的运行某个程序之后提示 mfc71 dll 未找到 还有就是用个软件结果安装说明上让你先去安装 net Linux 的依赖关系因为他
  • iOS开发入门教程

    当涉及到详细的教程和排版要求时 纯文本形式的回答无法满足您的需求 以下是一个简单的iOS开发入门教程大纲 您可以按照该大纲进行深入学习和实践 iOS开发入门教程大纲 1 开发环境搭建 下载和安装Xcode 配置iOS模拟器 2 Swift语
  • Echarts

    目录 1 1 什么是ECharts 1 2 ECharts基本使用 1 3 ECharts标题组件 1 4 ECharts工具箱组件 1 5 ECharts弹窗组件 1 6 ECharts饼状图 1 7 ECharts航线图 更详细的教程请
  • spice协议详解(二):spice支持功能和优势

    SPICE Simple Protocol for Independent Computing Environments 是目前最有潜力的开源虚拟桌面协议 最初是由Qumranet开发 后来被RedHat收购并开源 经过几年的社区开发 sp
  • 爆肝整理,Python自动化测试-Pytest参数化实战封装,一篇打通...

    目录 导读 前言 一 Python编程入门到精通 二 接口自动化项目实战 三 Web自动化项目实战 四 App自动化项目实战 五 一线大厂简历 六 测试开发DevOps体系 七 常用自动化测试工具 八 JMeter性能测试 九 总结 尾部小
  • [大话IT]圈套玄机—《圈子圈套》中的案例分析

    2006 02 22 00 20 14 Filter pattern 楼主 supernal pig 地址 http www12 tianya cn new Publicforum Content asp idWriter 2974942
  • 【拒绝主观!】C++继承中父类的构造函数和析构函数调用情况

    C 继承中父类的构造函数和析构函数调用情况 父类构造函数调用规则 子类会默认调用父类的无参构造函数 且发生在子类所有代码执行之前 原因 父类里面的一些成员可能被设置为private 导致该成员变量只能由父类自己初始化 如果父类不存在无参构造
  • java求s=a+aa+aaa+aaaa+aa...a的值,其中a是一个数字。例如2+2....(java50道经典编程题)

    题目 求s a aa aaa aaaa aa a的值 其中a是一个数字 例如2 22 222 2222 22222 此时共有5个数相加 几个数相加有键盘控制 对于这个题目来说还是比较简单的不过我在编码过程中好像漏了点东西 调试了几遍才好 这
  • React路由懒加载的方式之一

    第一步 在组件中引入 lazy Suspense这两个api import React Component lazy Suspense from react 导入我们的路由组件 示例 import Home from Home import
  • vue-router路由中对query中的参数进行加密

    vue router路由中对query中的参数进行加密 源码地址在文末 在创建路由的时候 添加两个方法 stringifyQuery 序列化传入的query参数 方法可以接收一个对象参数 在new Router的时候传递这个属性 在序列化q

随机推荐

  • HDU寝室断电快乐上网指南(基于树莓派3B+的软路由

    HDU寝室断电快乐上网指南 基于树莓派3B 的软路由 前言 准备工作 1 PPPOE拨号上网 2 解除禁用网卡 3 安装一些其它必要程序 3 1 hostapd 3 2 dnsmasq 4 WIFI热点配置 4 1 解除禁用hostapd
  • MySQL的子查询

    文章目录 什么是子查询 单行子查询和多行子查询 单行子查询 多行子查询 什么是子查询 子查询 是指一个查询语句嵌套在另一个查询语句内的查询 因此也称为 嵌套查询 比如 要查询谁的工资比Abel高 谁的工资比Abel高 方式1 两次查询 SE
  • UnityWebGL 设置启动后自动网页全屏2020.3.40f1版本

    Unity版本2020 3 40f1 这是原版 开始修改 1 打开html修改此处代码 数字改为auto 风格改为100 可直接粘贴代码如下 div style width 100 height 100 div
  • 【HttpRunnerManager】搭建接口自动化测试平台操作流程

    一 需要准备的知识点 1 linux 安装 python3 nginx 安装和配置 mysql 安装和配置 2 python django 配置 uwsgi 配置 二 我搭建的环境 1 Centos7 配置 rabbitmq mysql S
  • 解读Logistic回归模型

    一 logistic回归的由来 logistic回归在百度百科是这样定义的 logistic回归又称logistic回归分析 是一种广义的线性回归分析模型 常用于数据挖掘 疾病自动诊断 经济预测等领域 由此可见 logistic回归是从线性
  • C++:栈(stack)的模板类实现

    1 基本概念 栈中的元素遵守 先进后出 的原则 LIFO Last In First Out 只能在栈顶进行插入和删除操作 压栈 或推入 进栈 即push 将数据放入栈顶并将栈顶指针加一 出栈 或弹出 即pop 将数据从栈顶删除并将栈顶指针
  • intellij idea调试小技巧: 循环调试

    public static void main String args throws InterruptedException int sign 0 for int i 0 i lt 100 i sign i System out prin
  • GPIO子系统-中断子系统

  • 计算机应用与音乐论文,计算机应用论文的专辑

    计算机应用文如何写 下面是小编整理的一些关于计算机应用论文的范文 欢迎阅读 希望对你有帮助 微课运用下中职计算机应用的教学方法 摘要 微课在教育领域中的应用 可以被视为科学技术快速发展与教学水平不断优化的外在表现形式 在中职计算机应用基础教
  • 清理MSConfig系统设置下的启动项

    我使用的系统是windows server 2008 r2 最近发现msconfig很多以前禁用的启动项 太多想删除一下 第一下想到的就是使用xp下的msconfig cleanup 没想到在这个系统上也不能用了 system repair
  • Java中的集合框架

    一 概述 1 集合 数组都是对多个数据进行存储操作的结构 简称java容器 说明 此时的存储 只要指的是内存层面的存储 不涉及到持久化的存储 txtjpg avi 数据 2 数组在存储多个数据方面的特点 一旦初始化以后 其长度就确定了 数组
  • 为自己的 SSM项目设计评论功能

    为自己的 SSM项目设计评论功能 设计思路 增加评论 显示评论 评论总数 设计思路 首先需要设计评论信息的实体类 对应评论表 主要分为以下2个功能 显示所有评论 当我们进入文章详情页的时候 页面就会通过 ajax 发送请求给服务器 这个请求
  • 8,tcl注释与续行

    注 学习 交流就在博主的个人weixin公众号 FPGA动力联盟 留言或直接 博主weixin fpga start 私信 关于xilinx vivado FPGA XDC约束的所有讲解文档汇总 关于xilinxvivadoFPGAXDC约
  • 期货基础知识

    期货基础知识 1期货交易概述 1 1概念 一 期货合约 是指由期货交易所统一制订的 规定在将来某一特定的时间和地点交割一定数量和质量实物商品或金融商品的标准化合约 所谓标准化合约是指合约的数量 质量 交货时间和地点等都是既定的 唯一的变量是
  • golang学习demo5-redis和redis连接池的使用

    知识点 redis 的安装与了解 golang中对redis的操作 golang中的redis 连接池 安装并启动redis server之后的界面 我们就可以使用了 默认端口是6379 在client客户端里可以进行命令操作 一个基本的g
  • Python +selenium+unittest+ddt数据化实现自动化运行和脚本并生成报告

    一 unittest 框架解析 unittest 是 python 的单元测试框架 unittest 单元测试提供了创建测试用例 测试套件以及批量执行的方案 unittest 在安装 pyhton 以后就直接自带了 直接 import un
  • Linux Kernel:syscall之fork与exec

    目录 环境 一 前言 二 进程复制 1 写时复制 2 系统调用 3 kernel c
  • Web Socket rfc6455 握手 (C++)

    std string data const char buf gt data bytes transferred recycle buffer buf std string key Sec WebSocket Key auto pos da
  • 嵌入式系统调试方式

    word文档免费下载地址 https download csdn net download weixin 55953651 87962202 1 嵌入式系统调试方法概述 通用计算机一般采用桌面操作系统 调试器与被调试的程序常位于同一台计算机
  • 字符贪吃蛇创新玩法

    C语言贪吃蛇 include include include include include include include pragma comment lib Winmm lib 宏定义区 define X 500 保存蛇节点坐标的个数