#include<stdio.h>
#include<easyx.h>
#include<conio.h>
#include<time.h>
#define ROW 46
#define COL 64
//枚举
enum game
{
SPACE, WALL, SNAKE, FOOD, HEAD//空地 墙 蛇 食物 蛇头
};
/************全局变量************/
int mode = 0; //游戏模式
int score = 0; //分数
DWORD t1, t2; //定义两个时间控制移动速度
int map[ROW][COL]; //地图大小
COORD snake[1024]; //蛇 typedef struct _COORD {SHORT X;SHORT Y;} COORD, *PCOORD;
size_t SnakeSize; //蛇的尺度 typedef unsigned int size_t;
char SnakeDir; //蛇移动方向
/************全局函数************/
void start(); //开始界面
void chose(); //选择模式 0:普通模式 1:穿墙模式 2:无敌模式
void DrawMap(); //画图
void init(); //初始化游戏数据
void addfood(); //添加食物
void ChangeDir(); //修改蛇的方向
void move();//蛇的移动
int main()
{
initgraph(640, 480);
start();
outtextxy(260, 150, L"->"); //初始默认模式一
chose();
init();
while (1)
{
t2 = GetTickCount();
DrawMap();
if (kbhit())
{
ChangeDir();
move();
t2 = GetTickCount();
t1 = t2;
}
if (t2 - t1 > 50)
{
move();
t1 = t2;
}
}
getchar();
closegraph();
return 0;
}
void init()
{
srand((unsigned)time(NULL)); //随机种子
setbkcolor(WHITE); //设置背景颜色
memset(map, SPACE, sizeof(map));//初始化map数组为0即SPACE
//每一行的 第一个 和 最后一个 是墙
for (int i = 0; i < ROW; i++)
{
map[i][0] = map[i][COL - 1] = WALL;
}
//每一列的 第二个 和 倒数第二 个是墙
for (int j = 1; j < COL - 1; j++)
{
map[0][j] = map[ROW - 1][j] = WALL;
}
//定义蛇头和蛇的身体
map[3][5] = HEAD;
map[3][4] = map[3][3] = SNAKE;
//初始化蛇
SnakeSize = 3; //蛇 长
SnakeDir = 'D'; //蛇方向向右
snake[0].X = 3;
snake[0].Y = 5;
snake[1].X = 3;
snake[1].Y = 4;
snake[2].X = 3;
snake[2].Y = 3;
addfood();
}
void start()
{
setbkcolor(WHITE); //设置窗口背景色为白色
cleardevice(); //刷新屏幕
setbkmode(TRANSPARENT); //设置字体背景色为透明
settextcolor(BLACK); //设置字体颜色为黑色
/*****************游戏规则*****************/
outtextxy(290, 80, L"功能选择:");
outtextxy(280, 150, L"1.普通模式");
outtextxy(280, 200, L"2.穿墙模式");
outtextxy(280, 250, L"3.无敌模式");
outtextxy(200, 280, L"数字键 1,2,3 选择模式,Enter键进入游戏");
outtextxy(200, 300, L"字母键 W,S,A,D 方向键 上下左右 控制方向");
outtextxy(130, 350, L"相关内容:");
outtextxy(160, 380, L"关注微信公众号: 编程学习基地 获取源码");
outtextxy(160, 410, L"编程学习加群: 879098023");
}
void chose()
{
while (1)
{
switch (getch())
{
case '1':
start();
outtextxy(260, 150, L"->");
mode = 0;
break;
case '2':
start();
outtextxy(260, 200, L"->");
mode = 1;
break;
case '3':
start();
outtextxy(260, 250, L"->");
mode = 2;
break;
case 13:
return;
break;
}
}
}
void DrawMap()
{
BeginBatchDraw(); //开始绘图
setbkcolor(WHITE); //设置背景颜色为白色
settextcolor(RGB(238,0,0));
cleardevice(); //清屏
WCHAR arr[10]; //保存成绩
wsprintf(arr, L"总分:%d", score); //将成绩格式化输出到字符串arr中
outtextxy(0, 0, arr); //显示成绩
for (int y = 0; y < ROW; y++) //y轴方向向下
{
for (int x = 0; x < COL; x++) //x轴方向下上
{
switch (map[y][x])
{
case SPACE:
break;
case WALL:
setlinecolor(BLACK);
setfillcolor(RGB(238, 233, 233)); //灰色
fillrectangle(x * 10, y * 10 + 20, x * 10 + 10, y * 10 + 30);
break;
case SNAKE:
setlinecolor(RGB(0, 245, 255)); //绿色
setfillcolor(WHITE);
fillrectangle(x * 10, y * 10 + 20, x * 10 + 10, y * 10 + 30);
break;
case HEAD:
//画七彩蛇头
switch (rand() % 7)
{
case 0:
setfillcolor(RGB(255, 0, 0)); //红色 255 0 0
solidrectangle(x * 10, y * 10 + 20, x * 10 + 10, y * 10 + 30);
break;
case 1:
setfillcolor(RGB(255, 165, 0)); //橙 255 165 0
solidrectangle(x * 10, y * 10 + 20, x * 10 + 10, y * 10 + 30);
break;
case 2:
setfillcolor(RGB(255, 255, 0)); //黄 255 255 0
solidrectangle(x * 10, y * 10 + 20, x * 10 + 10, y * 10 + 30);
break;
case 3:
setfillcolor(RGB(0, 255, 0)); //绿色 0, 255, 0
solidrectangle(x * 10, y * 10 + 20, x * 10 + 10, y * 10 + 30);
break;
case 4:
setfillcolor(RGB(0, 255, 255)); //青 0 255 255
solidrectangle(x * 10, y * 10 + 20, x * 10 + 10, y * 10 + 30);
break;
case 5:
setfillcolor(RGB(0, 0, 255)); //蓝 0 0 255
solidrectangle(x * 10, y * 10 + 20, x * 10 + 10, y * 10 + 30);
break;
case 6:
setfillcolor(RGB(160, 32, 240)); //紫 160 32 240
solidrectangle(x * 10, y * 10 + 20, x * 10 + 10, y * 10 + 30);
break;
default:
break;
}
break;
case FOOD:
setfillcolor(RGB(255, 0, 0)); //红色
solidrectangle(x * 10, y * 10 + 20, x * 10 + 10, y * 10 + 30);
break;
default:
break;
}
}
}
EndBatchDraw();
}
void addfood()
{
int row, col;
do
{
row = rand() % (ROW - 1) + 1;
col = rand() % (COL - 1) + 1;
} while (map[row][col] != SPACE);
map[row][col] = FOOD;
}
void ChangeDir()
{
switch (getch())
{
case'A':
case'a':
case 75:
if (SnakeDir != 'D') SnakeDir = 'A'; //蛇不能后退
break;
case'D':
case'd':
case 77:
if (SnakeDir != 'A') SnakeDir = 'D';
break;
case'W':
case'w':
case 72:
if (SnakeDir != 'S') SnakeDir = 'W';
break;
case'S':
case's':
case 80:
if (SnakeDir != 'W') SnakeDir = 'S';
break;
case 32:
getch();
break;
default:
break;
}
}
void move()
{
COORD next; //蛇头的下一个位置
switch (SnakeDir)
{
case'A':
next.X = snake[0].X;
next.Y = snake[0].Y - 1;
break;
case'W':
next.X = snake[0].X - 1;
next.Y = snake[0].Y;
break;
case'D':
next.X = snake[0].X;
next.Y = snake[0].Y + 1;
break;
case'S':
next.X = snake[0].X + 1;
next.Y = snake[0].Y;
break;
default:
break;
}
switch (map[next.X][next.Y])
{
case SPACE://直接移动
map[snake[SnakeSize - 1].X][snake[SnakeSize - 1].Y] = SPACE;//地图蛇尾所在地置空
for (int i = SnakeSize - 1; i > 0; i--) //蛇尾到蛇头整体移动一位
{
snake[i] = snake[i - 1];
}
map[snake[0].X][snake[0].Y] = SNAKE; //蛇头置 蛇
snake[0] = next; //将下一个位置赋值给蛇头
map[snake[0].X][snake[0].Y] = HEAD; //设置头
break;
case WALL:
if (mode) //模式1模式2可穿墙
{
map[snake[SnakeSize - 1].X][snake[SnakeSize - 1].Y] = SPACE;//蛇尾置空
for (int i = SnakeSize - 1; i > 0; i--) //蛇尾到蛇头整体移动一位
{
snake[i] = snake[i - 1];
}
map[snake[0].X][snake[0].Y] = SNAKE; //蛇头置 蛇
switch (SnakeDir) //穿墙
{
case'A':next.Y = COL - 2; break;
case 'D':next.Y = 1; break;
case 'W': next.X = ROW - 2; break;
case 'S':next.X = 1; break;
default:
break;
}
snake[0] = next; //蛇头移动到新位置
map[snake[0].X][snake[0].Y] = HEAD; //新的蛇头所在的位置
}
else {
MessageBox(GetHWnd(), L"游戏结束", L"SORRY", MB_OK);
exit(0);
}
break;
case SNAKE:
if (mode == 2) //模式二无敌
{
break;
}
else {
MessageBox(GetHWnd(), L"游戏结束", L"SORRY", MB_OK);
exit(0);
}
break;
case FOOD://食物 蛇尾不变
for (int i = SnakeSize; i > 0; i--) //蛇尾到蛇头整体移动一位
{
snake[i] = snake[i - 1];
}
map[snake[0].X][snake[0].Y] = SNAKE; //蛇头 置 蛇
snake[0] = next; //将下一个位置赋值给蛇头
score++; //分数加一
(SnakeSize)++; //蛇尺度加一
map[snake[0].X][snake[0].Y] = HEAD; //地图上重置蛇头
addfood();
break;
default:break;
}
}
浊池
- 粉丝: 57
- 资源: 4779
最新资源
- MATLAB代码:基于改进K-means算法的含电动汽车负荷源荷场景聚类 关键词:有序聚类 改进k-means聚类 电动汽车负荷聚类 风光场景聚类 仿真平台:MATLAB 主要内容:代码主要做的
- Matlab基于POA-LSSVM鹈鹕算法优化最小二乘支持向量机的数据多输入单输出回归预测(含完整的程序,GUI设计和代码详解)
- MATLAB 实现基于长短期记忆网络(LSTM)进行时间序列预测模型的项目详细实例(含完整的程序,GUI设计和代码详解)
- 八自由度车辆动力学Simulink仿真模型 模型包括.slx文件.m车辆参数文件和word说明文档 Matlab版本2018a,可生成低版本 八自由度包括纵向,横向,横摆,侧倾及四个车轮旋转运动,另外
- 毕设基于Dlib和OpenCV的人脸识别考勤系统设计与实现(python源码+数据库).zip
- 葡萄酒质量数据集,葡萄酒品质数据集(包含21,000条记录和12个变量)
- 电网+图像样本+voc格式
- MATLAB代码:基于遗传算法的风电混合储能容量优化配置 关键词:混合储能 容量配置优化 遗传算法 参考文档:《基于遗传算法的风电混合储能容量优化配置》无超级电容器 ; 仿真平台:MATLAB
- javascript为了在前面插入一个新节点,我们创建一个新节点并将其下一个引用指向
- 基于python+OpenCV人脸识别系统设计与实现.docx
- MATLAB代码:含多种需求响应及电动汽车的微网 电厂日前优化调度 关键词:需求响应 空调负荷 电动汽车 微网优化调度 电厂调度 参考文档:计及电动汽车和需求响应的多类电力市场下电厂竞标模型
- javascript在链表中的给定节点之前插入一个节点
- 基于Matlab实现ASK、FSK、PSK仿真包括信号产生,调制,加噪声,解调和还原信号误码率分析(源码+数据).rar
- 转矩补偿,振动、谐振抑制 可用于实际项目… matlab二质量模型… 使用巴特沃斯高通滤波器提取转速波动进行转矩补偿,实现主动阻尼 加速度反馈: 等效增加电机惯量 提供详实文档、仿真模型… 效果如图
- 汇川H5U-EtherCAT四轴定位,其中两轴联动做矩形涂胶 显示屏涂胶机 1.主cpu汇川H5U搭载四个汇川ISV6系列总线伺服驱动器,进行运动控制,单轴控制,双轴联动控制 2.汇川IT7000系
- 金融机构数据集,银行数据集,金融数据,全球最大的金融机构(银行业、保险业、金融集团等)的综合概览(数据集包括重要的财务指标,例如收入、净利润和总资产)
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈