字符贪吃蛇创新玩法

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();

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
完整版:https://download.csdn.net/download/qq_27595745/89522468 【课程大纲】 1-1 什么是java 1-2 认识java语言 1-3 java平台的体系结构 1-4 java SE环境安装和配置 2-1 java程序简介 2-2 计算机中的程序 2-3 java程序 2-4 java类库组织结构和文档 2-5 java虚拟机简介 2-6 java的垃圾回收器 2-7 java上机练习 3-1 java语言基础入门 3-2 数据的分类 3-3 标识符、关键字和常量 3-4 运算符 3-5 表达式 3-6 顺序结构和选择结构 3-7 循环语句 3-8 跳转语句 3-9 MyEclipse工具介绍 3-10 java基础知识章节练习 4-1 一维数组 4-2 数组应用 4-3 多维数组 4-4 排序算法 4-5 增强for循环 4-6 数组和排序算法章节练习 5-0 抽象和封装 5-1 面向过程的设计思想 5-2 面向对象的设计思想 5-3 抽象 5-4 封装 5-5 属性 5-6 方法的定义 5-7 this关键字 5-8 javaBean 5-9 包 package 5-10 抽象和封装章节练习 6-0 继承和多态 6-1 继承 6-2 object类 6-3 多态 6-4 访问修饰符 6-5 static修饰符 6-6 final修饰符 6-7 abstract修饰符 6-8 接口 6-9 继承和多态 章节练习 7-1 面向对象的分析与设计简介 7-2 对象模型建立 7-3 类之间的关系 7-4 软件的可维护与复用设计原则 7-5 面向对象的设计与分析 章节练习 8-1 内部类与包装器 8-2 对象包装器 8-3 装箱和拆箱 8-4 练习题 9-1 常用类介绍 9-2 StringBuffer和String Builder类 9-3 Rintime类的使用 9-4 日期类简介 9-5 java程序国际化的实现 9-6 Random类和Math类 9-7 枚举 9-8 练习题 10-1 java异常处理 10-2 认识异常 10-3 使用try和catch捕获异常 10-4 使用throw和throws引发异常 10-5 finally关键字 10-6 getMessage和printStackTrace方法 10-7 异常分类 10-8 自定义异常类 10-9 练习题 11-1 Java集合框架和泛型机制 11-2 Collection接口 11-3 Set接口实现类 11-4 List接口实现类 11-5 Map接口 11-6 Collections类 11-7 泛型概述 11-8 练习题 12-1 多线程 12-2 线程的生命周期 12-3 线程的调度和优先级 12-4 线程的同步 12-5 集合类的同步问题 12-6 用Timer类调度任务 12-7 练习题 13-1 Java IO 13-2 Java IO原理 13-3 流类的结构 13-4 文件流 13-5 缓冲流 13-6 转换流 13-7 数据流 13-8 打印流 13-9 对象流 13-10 随机存取文件流 13-11 zip文件流 13-12 练习题 14-1 图形用户界面设计 14-2 事件处理机制 14-3 AWT常用组件 14-4 swing简介 14-5 可视化开发swing组件 14-6 声音的播放和处理 14-7 2D图形的绘制 14-8 练习题 15-1 反射 15-2 使用Java反射机制 15-3 反射与动态代理 15-4 练习题 16-1 Java标注 16-2 JDK内置的基本标注类型 16-3 自定义标注类型 16-4 对标注进行标注 16-5 利用反射获取标注信息 16-6 练习题 17-1 顶目实战1-单机版五子棋游戏 17-2 总体设计 17-3 代码实现 17-4 程序的运行与发布 17-5 手动生成可执行JAR文件 17-6 练习题 18-1 Java数据库编程 18-2 JDBC类和接口 18-3 JDBC操作SQL 18-4 JDBC基本示例 18-5 JDBC应用示例 18-6 练习题 19-1 。。。
完整版:https://download.csdn.net/download/qq_27595745/89522468 【课程大纲】 1-1 什么是java 1-2 认识java语言 1-3 java平台的体系结构 1-4 java SE环境安装和配置 2-1 java程序简介 2-2 计算机中的程序 2-3 java程序 2-4 java类库组织结构和文档 2-5 java虚拟机简介 2-6 java的垃圾回收器 2-7 java上机练习 3-1 java语言基础入门 3-2 数据的分类 3-3 标识符、关键字和常量 3-4 运算符 3-5 表达式 3-6 顺序结构和选择结构 3-7 循环语句 3-8 跳转语句 3-9 MyEclipse工具介绍 3-10 java基础知识章节练习 4-1 一维数组 4-2 数组应用 4-3 多维数组 4-4 排序算法 4-5 增强for循环 4-6 数组和排序算法章节练习 5-0 抽象和封装 5-1 面向过程的设计思想 5-2 面向对象的设计思想 5-3 抽象 5-4 封装 5-5 属性 5-6 方法的定义 5-7 this关键字 5-8 javaBean 5-9 包 package 5-10 抽象和封装章节练习 6-0 继承和多态 6-1 继承 6-2 object类 6-3 多态 6-4 访问修饰符 6-5 static修饰符 6-6 final修饰符 6-7 abstract修饰符 6-8 接口 6-9 继承和多态 章节练习 7-1 面向对象的分析与设计简介 7-2 对象模型建立 7-3 类之间的关系 7-4 软件的可维护与复用设计原则 7-5 面向对象的设计与分析 章节练习 8-1 内部类与包装器 8-2 对象包装器 8-3 装箱和拆箱 8-4 练习题 9-1 常用类介绍 9-2 StringBuffer和String Builder类 9-3 Rintime类的使用 9-4 日期类简介 9-5 java程序国际化的实现 9-6 Random类和Math类 9-7 枚举 9-8 练习题 10-1 java异常处理 10-2 认识异常 10-3 使用try和catch捕获异常 10-4 使用throw和throws引发异常 10-5 finally关键字 10-6 getMessage和printStackTrace方法 10-7 异常分类 10-8 自定义异常类 10-9 练习题 11-1 Java集合框架和泛型机制 11-2 Collection接口 11-3 Set接口实现类 11-4 List接口实现类 11-5 Map接口 11-6 Collections类 11-7 泛型概述 11-8 练习题 12-1 多线程 12-2 线程的生命周期 12-3 线程的调度和优先级 12-4 线程的同步 12-5 集合类的同步问题 12-6 用Timer类调度任务 12-7 练习题 13-1 Java IO 13-2 Java IO原理 13-3 流类的结构 13-4 文件流 13-5 缓冲流 13-6 转换流 13-7 数据流 13-8 打印流 13-9 对象流 13-10 随机存取文件流 13-11 zip文件流 13-12 练习题 14-1 图形用户界面设计 14-2 事件处理机制 14-3 AWT常用组件 14-4 swing简介 14-5 可视化开发swing组件 14-6 声音的播放和处理 14-7 2D图形的绘制 14-8 练习题 15-1 反射 15-2 使用Java反射机制 15-3 反射与动态代理 15-4 练习题 16-1 Java标注 16-2 JDK内置的基本标注类型 16-3 自定义标注类型 16-4 对标注进行标注 16-5 利用反射获取标注信息 16-6 练习题 17-1 顶目实战1-单机版五子棋游戏 17-2 总体设计 17-3 代码实现 17-4 程序的运行与发布 17-5 手动生成可执行JAR文件 17-6 练习题 18-1 Java数据库编程 18-2 JDBC类和接口 18-3 JDBC操作SQL 18-4 JDBC基本示例 18-5 JDBC应用示例 18-6 练习题 19-1 。。。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值