贪吃蛇 c语言 不死模式,c语言贪吃蛇游戏完整代码,c语言贪吃蛇教程
//
/***********************************************************
项目名称:贪吃蛇
编译环境:VC2015
<创建时间:2017.1.14>
<创建者:PorYoung>
<最近完成修改:2017.1.15 18:45
遗留问题:①难度选择(包括撞墙、多个食物、障碍) ②背景更换 ③其他细节
修改者:PorYoung0>
<最近完成修改:2017.1.16 23:29
修改内容:①增加暂停②重玩功能,将图片嵌入exe
遗留问题:①难度选择(包括撞墙、多个食物、障碍) ②背景更换 ③其他细节
<最近修改:2017.1.17 14:14
修改内容:①增加一个难度选择 ②增加一个更换音乐图标和更换地图图标 ③修复暂停、重玩bug
遗留问题:①第三个难度选择 ②速度、长度调整 ③实现计数和计时
④实现图标点击切换地图和音乐功能
⑤经典模式碰图片边框不死>
<最近一次完成修改:2017.1.17 19:57
修改内容:①修复选择难度不进入游戏 ②删除判断游戏状态函数,直接在判断蛇是否死亡函数里进行退出或重玩 ③修复嵌入音乐无法播放 ④修复游戏过程不断闪屏
遗留问题:①速度(难度)变更 ②背景更换 ③计数与计时 ④界面优化
************************************************************/
#include "stdafx.h"
#include "graphics.h"
#include "stdlib.h"
#include "time.h"
#include "conio.h"
#include "mmsystem.h"
#include "windows.h"
#include "resource.h"
#pragma comment(lib,"winmm.lib")
#define MAX_NUM 100
IMAGE BackImg;
IMAGE FoodImg;
IMAGE headSk;
IMAGE playBImg;
IMAGE ButtonImg1;
IMAGE ButtonImg2;
MOUSEMSG msg;
char str[10];
HANDLE hThread1, hThread2;
HANDLE hThread3;
int kBoard;
char ch = '0'; //0: 游戏正常运行 1:蛇死亡 2:游戏暂停
int grade = 1; //1:自由模式 2:经典模式 3:挑战模式
typedef struct CoorSnake
{
int x;
int y;
}COOR;
typedef struct Snake
{
COOR skC[MAX_NUM]; //每一节蛇的坐标
int n; //蛇当前的节数
int dir; //蛇的方向, 72上 80下 75左 77右
}SNAKE;
struct Food
{
COOR fdC;
int flag = 0; //初始化为没有食物
}food; //思考:多个食物
SNAKE snake;
void welcome();
void show();
DWORD WINAPI ThreadProc1(LPVOID lpParameter);
DWORD WINAPI ThreadProc2(LPVOID lpParameter);
void drawSnake();
void oprate();
void moveSnake();
void foodShow();
void foodEat();
void deathSnake();
void gradeGame();
DWORD WINAPI ThreadProc3(LPVOID lpParameter);
//游戏模式:1.自由模式; 2.经典模式 3.挑战模式
//更换游戏地图 更换游戏BGM 更改小蛇速度(更改游戏难度) 蛇的长度
void gradeGame()
{
InputBox(str, 2, "选择游戏等级[1][2][3]", 0, 0, 200, 100, false);
switch (str[0])
{
case '1':
grade = 1;
setbkcolor(RGB(125, 234, 50));
cleardevice();
outtextxy(200, 200, "难度为①");
break;
case '2':
grade = 2;
setbkcolor(RGB(125, 234, 50));
cleardevice();
outtextxy(200, 200, "难度为②");
break;
case '3':
grade = 3;
setbkcolor(RGB(125, 234, 50));
cleardevice();
outtextxy(200, 200, "难度为③");
break;
}
outtextxy(200, 250, "空格键继续");
while(kBoard != 32);
}
void foodShow()
{
if (food.flag == 0)
{
do
{
srand((unsigned int)time(NULL));
food.fdC.x = rand() % (640 / 10) * 10; //0 1 2 3 4 5 6 ... 0 10 20 30 40
food.fdC.y = rand() % (480 / 10) * 10;
for (int i = 1; i < snake.n; i++)
{
if (food.fdC.x != snake.skC[i].x&& food.fdC.y != snake.skC[i].y)
{
food.flag = 1;
}
else
{
food.flag = 0;
break;
}
}
} while (food.flag != 1); //避免食物生成在蛇身上
}
putimage(food.fdC.x, food.fdC.y, &FoodImg);
//setfillstyle(image);
//fillroundrect(food.fdC.x, food.fdC.y, food.fdC.x + 8, food.fdC.y + 8, 8, 8);
}
void foodEat()
{
if (snake.skC[0].x >= food.fdC.x&& snake.skC[0].x <= food.fdC.x + 8&& snake.skC[0].y >= food.fdC.y &&snake.skC[0].y <= food.fdC.y + 8)
{
food.flag = 0;
snake.n++;
}
}
void deathSnake()
{
for (int i = 1; i < snake.n; i++)
{
if (snake.skC[0].x == snake.skC[i].x&& snake.skC[0].y == snake.skC[i].y)
{
ch = '1'; //表示游戏停止或结束
settextstyle(40, 0, "华文行楷");
outtextxy(140, 200, "你咬到自己了⊙﹏⊙b");
outtextxy(120, 240, "::>_<::游戏结束::>_<::");
settextstyle(40, 0, "华文彩云");
outtextxy(100, 70, "按空格键重玩,ESC退出");
while (ch == '1')
{
i = _getch();
if (i == 27)
{
PlaySound(NULL, NULL, NULL);
closegraph();
system("close");
}
else if (i == 32)
{
ch = '0'; //游戏继续
break;
}
}
show();
}
} //判断蛇是否咬到自己
if (grade == 1)
{
if (snake.skC[0].x >= 640) snake.skC[0].x = 0;
else if (snake.skC[0].x < 0) snake.skC[0].x = 640;
else if (snake.skC[0].y < 0) snake.skC[0].y = 480;
else if (snake.skC[0].y >= 480) snake.skC[0].y = 0;
//putimage(snake.skC[0].x, snake.skC[0].y, &headSk);
} //自由模式
else if (grade == 2)
{
if (snake.skC[0].x >= 640 || snake.skC[0].x < 0 || snake.skC[0].y < 0 || snake.skC[0].y >= 480)
{
ch = '1'; //表示游戏停止或结束
settextstyle(40, 0, "华文行楷");
outtextxy(140, 200, "你撞到墙了⊙﹏⊙b");
outtextxy(120, 240, "::>_<::游戏结束::>_<::");
settextstyle(40, 0, "华文彩云");
outtextxy(100, 70, "按空格键重玩,ESC退出");
int i;
while (ch == '1')
{
i = _getch();
if (i == 27)
{
PlaySound(NULL, NULL, NULL);
closegraph();
system("close");
}
else if (i == 32)
{
ch = '0'; //游戏继续
break;
}
}
show();
}
}
}
void drawSnake()
{
int i;
setlinecolor(RGB(200, 100, 140));
setfillcolor(RGB(200, 100, 140));
fillroundrect(snake.skC[0].x, snake.skC[0].y, snake.skC[0].x + 10, snake.skC[0].y + 10, 10, 10);
setlinecolor(RGB(100, 50, 80));
setfillcolor(RGB(100, 50, 80));
fillroundrect(snake.skC[0].x + 2, snake.skC[0].y + 2, snake.skC[0].x + 4, snake.skC[0].y + 4, 2, 2);
fillroundrect(snake.skC[0].x + 6, snake.skC[0].y + 6, snake.skC[0].x + 8, snake.skC[0].y + 8, 2, 2);
for (i = 1; i < snake.n; i++)
{
setlinecolor(RGB(215, 115, 155));
setfillcolor(RGB(215, 115, 155));
fillroundrect(snake.skC[i].x, snake.skC[i].y, snake.skC[i].x + 10, snake.skC[i].y + 10, 5, 5);
}
setlinecolor(RGB(180, 80, 120));
setfillcolor(RGB(180, 80, 120));
fillroundrect(snake.skC[i].x, snake.skC[i].y+2, snake.skC[i].x + 12, snake.skC[i].y + 8, 6, 6);
}
void oprate()
{
kBoard = _getch();
switch (kBoard)
{
case 72:
if (snake.dir != 80)
{
snake.dir = 72;
}
break;
case 80:
if (snake.dir != 72)
{
snake.dir = 80;
}
break;
case 77:
if (snake.dir != 75)
{
snake.dir = 77;
}
break;
case 75:
if (snake.dir != 77)
{
snake.dir = 75;
}
break;
case 32:
//暂停
ch = '2'; //表示暂停
system("pause");
ch = '0'; //表示继续
break;
}
Sleep(18); //避免快速按键导致坐标重叠
}
void moveSnake()
{
//hThread3 = CreateThread(0, NULL, ThreadProc3, 0, 0, 0);
for (int i = snake.n; i > 0; i--)
{
snake.skC[i] = snake.skC[i - 1];
}
switch (snake.dir)
{
//上
case 72:
snake.skC[0].y -= 10;
break;
//下
case 80:
snake.skC[0].y += 10;
break;
//左
case 75:
snake.skC[0].x -= 10;
break;
//右
case 77:
snake.skC[0].x += 10;
break;
}
while (ch == '2')
{
settextstyle(60, 0, "华文彩云");
outtextxy(70, 200, "游戏暂停,任意键继续");
}
}
void welcome()
{
//mciSendString("open BGM.mp3 alias bgm", 0, 0, 0);
//mciSendString("play bgm repeat", 0, 0, 0);
PlaySound((LPCSTR)IDR_WAVE1, NULL, SND_RESOURCE| SND_ASYNC | SND_LOOP);
initgraph(640, 480);
loadimage(&BackImg, "IMAGE", MAKEINTRESOURCE(IDR_IMAGE1), 640, 480);
putimage(0, 0, &BackImg);
}
DWORD WINAPI ThreadProc1(LPVOID lpParameter)
{
setbkmode(TRANSPARENT);
for (int r = 0, g = 0, b = 0, c = 0, ch = 1, fx = 620;; r += 15, b += 15, ch++)
{
settextcolor(RGB(r, b, g));
settextstyle(30, 0, "华文彩云");
outtextxy(fx, 0, "欢迎来到贪吃蛇小游戏~O(∩_∩)O~");
settextcolor(RGB(g, r, b));
settextstyle(40, 0, "华文彩云");
outtextxy(fx, 400, "~O(∩_∩)O~制作:PorYoung");
//以上为字幕特效设置,以下为位置变化效果设置
//settextcolor(RGB(r, g, b));
//settextstyle(50, 0, "华文彩云");
//outtextxy(160, 210, "开始游戏");
//Sleep(1000);
//cleardevice();
//putimage(0, 0, &BackImg);
settextcolor(RGB(r, g, b));
settextstyle(50, 0, "华文行楷");
outtextxy(200, 230, "开始游戏");
Sleep(500);
cleardevice();
putimage(0, 0, &BackImg);
if (r >= 250)
{
r = 0;
b = 0;
g = 20;
}
if (ch % 2 == 0)
{
g += 15;
}
if (fx <= -420) c = 1;
else if (fx >= 610) c = 0;
if (c == 0) fx -= 20;
else fx += 20;
}
}
DWORD WINAPI ThreadProc2(LPVOID lpParameter)
{
while (1)
{
msg = GetMouseMsg();
if (msg.x >= 200 && msg.x <= 400 && msg.y >= 230 && msg.y <= 280)
{
if (msg.mkLButton)
{
//终结线程1
TerminateThread(hThread1, 1);
CloseHandle(hThread1);
//进入主界面
gradeGame();
show();
}
}
}
}
DWORD WINAPI ThreadProc3(LPVOID lpParamrter)
{
loadimage(&ButtonImg1, "JPG", MAKEINTRESOURCE(IDR_JPG1), 20, 20);
loadimage(&ButtonImg2, "JPG", MAKEINTRESOURCE(IDR_JPG2), 20, 20);
while (1)
{
putimage(300, 450, &ButtonImg1);
putimage(340, 450, &ButtonImg2);
}
}
void show()
{
loadimage(&FoodImg, "IMAGE", MAKEINTRESOURCE(IDR_IMAGE2), 10, 10);
//loadimage(&headSk, "IMAGE", MAKEINTRESOURCE(IDR_IMAGE3), 10, 10);
hThread3 = CreateThread(NULL, 0, ThreadProc3, NULL, 0, 0);
//初始化数据
snake.dir = 77;
snake.n = 2;
snake.skC[0].x = 0;
snake.skC[0].y = 0;
//开启boardGet函数获取键盘信息
ch = '0';
while (1)
{
//foodEat();
//moveSnake();
//deathSnake();
//cleardevice();
if (grade == 2)
{
loadimage(&playBImg, "IMAGE", MAKEINTRESOURCE(IDR_IMAGE5), 640, 480);
BeginBatchDraw();
putimage(0, 0, &playBImg);
foodShow();
drawSnake();
EndBatchDraw();
foodEat();
moveSnake();
deathSnake();
}
else if (grade == 1)
{
cleardevice();
BeginBatchDraw();
foodShow();
drawSnake();
EndBatchDraw();
foodEat();
moveSnake();
deathSnake();
}
Sleep(100); //调整速度
}
}
int main()
{
welcome();
//创建线程1
hThread1 = CreateThread(
NULL, // default security attributes
0, // use default stack size
ThreadProc1, // thread function
NULL, // argument to thread function
0, // use default creation flags
NULL); // returns the thread identifier
//创建线程2
hThread2 = CreateThread(
NULL, // default security attributes
0, // use default stack size
ThreadProc2, // thread function
NULL, // argument to thread function
0, // use default creation flags
NULL); // returns the thread identifier
while (1)
{
if (ch == '0' || ch == '2')
{
oprate();
}
}
return 0;
}
贪吃蛇 c语言 不死模式,c语言贪吃蛇游戏完整代码,c语言贪吃蛇教程相关推荐
- 贪吃蛇 c语言 不死模式,贪吃蛇大作战不死版v1.0安卓手机版
游戏标签 贪吃蛇大作战 贪吃蛇大作战是一款原生态ios平台移植到安卓平台超好玩的休闲竞技小型游戏,今天艾艾给你带来的是贪吃蛇大作战不死版,言一之说就是不管你怎么撞都不会死,你有无数条生命,让你玩到刷新 ...
- c语言贪吃蛇游戏完整代码
该博文为原创文章,未经博主同意不得转载,如同意转载请注明博文出处 本文章博客地址:https://cplusplus.blog.csdn.net/article/details/105147610 废 ...
- 贪吃蛇游戏java代码_Java实现贪吃蛇游戏
最近JAVA和JSwing上手练习了一下贪吃蛇,供大家参考,具体内容如下 欢迎交流和加入新的内容 用到了JSwing,下面是一些具体的思路 实现 * 蛇: 采用单链表记录首尾,整个蛇被分为lattic ...
- 小学数学闯关游戏 java代码_Java语言实现小学数学练习
package per.java.shejiti; import java.io.*; import java.util.ArrayList; import java.util.Collections ...
- c语言五子棋游戏源程序代码,C语言五子棋游戏源代码
<C语言五子棋游戏源代码>由会员分享,可在线阅读,更多相关<C语言五子棋游戏源代码(12页珍藏版)>请在人人文库网上搜索. 1.include#define N 10void ...
- 天天酷跑电脑版代码C语言,Java实现天天酷跑小游戏完整代码(附源码).pdf
Java实实现现天天天天酷酷跑跑小小游游戏戏完完整整代代码码(附附源源码码) 首首先先,,写写一一个个需需求求文文档档:: 一.项目名称: <天天酷跑> (RunDay ) 二.功能介绍: ...
- C语言小项目 -- 扫雷游戏完整代码(递归展开 + 选择标记)
大家好,今天我们将一起用C语言实现一个经典小游戏 – 扫雷,Let is go ! 文章目录
- c语言堆栈基本代码入栈出栈_C/C++语言栈的出栈入栈操作实现(完整代码)
/* 完整代码 */ #include using namespace std; #define MAX_SIZE 5 //数组大小 struct stack { int top; int ans[M ...
- C语言-附加-给一个数求最大质数(完整代码)
质数:只能被1 和本身整除的数 第一层循环,从这个数,开始,一次次递减,查找 ----除数 第二层循环,从2开始,到这个数的一半 -------被除数 完整代码 #incl ...
- Linux打字游戏程序代码,c语言shell打字游戏.pdf
一.实验说明 1. 环境登录 无需密码自动登录 ,系统用户名shiyanlou ,密码shiyanlou 2. 环境介绍 本实验环境采用带桌面的Ubuntu Linux环境 ,实验中 用到桌面上的程序 ...
最新文章
- 【分治】P1228 地毯填补问题(多联骨牌覆盖棋盘问题)(递归,分治)难度⭐⭐⭐
- [转]解决Android studio升级到3.5的一些问题
- java8 streamlist转化
- np.array(image)的作用
- BZOJ 2821: 作诗(Poetize) [分块]
- matlab 例题sin,matlab基础练习题(带答案).doc
- Android NDK 下载地址
- iapp进度条倒计时_App Store 上的“纪念日提醒 - days matter · 倒数倒计时”
- Linux snapcraft vscode报错snap is unusable due to missing files解决方法
- 微信小程序秀才成语接龙趣味答题小游戏带流量主源码
- vmware-nat模式下网络模型
- 微软认证(MTA)的java,js以及数据库考过了
- calendar java起始于结束时间,java获取一天的开始时间和一天的结束时间
- jqury实现异步文件上传
- 读书笔记 - -《Python网络编程》重点
- Mysql事务原理介绍
- Shell发送邮件+附件
- 华为那个手机是鸿蒙,EMUI 11就是鸿蒙前奏 华为手机全面升级鸿蒙OS稳了
- 个人计算机是由单片,《计算机应础》期终考试卷(B卷).doc
- Python:for循环语句
热门文章
- ZUL页面注解语法与Java注解语法
- JavaScript高级程序设计(第四版) 第二章 HTML中的javascript
- JavaScriipt高级程序设计
- SQL Server 2008超详细安装教程附下载链接
- jQuery倒计时进度条
- clousx6机器人卡密_手机x6机器人词库编程-clousx6词库助手免费版v8.0 安卓最新版-2265安卓网...
- ipad文献管理软件_【MAC上写论文有哪些好的文献管理软件可以推荐?】-看准网
- 悬镜安全在RSAC2022上斩获Global InfoSec Awards四项大奖
- 古代汉语复习资料与练习题(适合王力版教材)
- Matlab 2016a 安装包及破解教程