#define _CRT_SECURE_NO_WARNINGS 1
#include"Snake.h"
//设置窗口大小 ,名称
void Set_cols_lines() {
//设置控制台窗口的长宽,设置控制台窗口的大小,x=100,y=40
system("mode con cols=100 lines=40");
//设置cmd窗口的名称
system("title 贪吃蛇");
}
//隐藏光标
void Corsor_False() {
CONSOLE_CURSOR_INFO corsor_info = { 0 };
//结构体指针,包含光标的显示大小 dwSize(默认25)和 可见性bVisible(默认为true)
HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);//取得标准输出的句柄
GetConsoleCursorInfo(handle, &corsor_info);//获取控制台光标信息
//corsor_info.dwSize = 100;//光标大小为100
corsor_info.bVisible = false;//光标可见性为false
SetConsoleCursorInfo(handle, &corsor_info);//设置控制台光标信息
}
//设置光标位置信息
void SetPos(short x, short y)
{
//COORD是Windows API中定义的一个结构体,表示一个字符在控制台屏幕的坐标
COORD pos = { x,y };
HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);//取得标准输出的句柄
SetConsoleCursorPosition(handle, pos);//设置光标位置信息
}
//游戏欢迎界面
void WelcomeToGame() {
//移动光标位置——居中
SetPos(35, 10);
//欢迎来到贪吃蛇小游戏
printf("欢迎来到贪吃蛇小游戏!\n");
printf("\n");
SetPos(38, 20);
//按任意键继续
system("pause");
//清理屏幕——进入下一界面
system("cls");
//打印操作说明
SetPos(20, 15);
printf("用 ↑ → ↓ ← 分别控制蛇的移动,F3为加速,F4为减速");
SetPos(38, 20);
//按任意键继续
system("pause");
//清理屏幕——进入下一界面
system("cls");
}
//打印地图
void CreateMap() {
//打印围墙
int i = 1;
//上一行围墙
SetPos(0, 0);
for (i = 1; i <= 30; i++) {
wprintf(L"%lc", WALL);
}
//下一行围墙
SetPos(0, 29);
for (i = 1; i <= 30; i++) {
wprintf(L"%lc", WALL);
}
//左一列围墙
SetPos(0, 0);
for (i = 1; i <= 30; i++)
{
wprintf(L"%lc", WALL);
SetPos(0, i);
}
//右一列围墙
SetPos(58, 0);
for (i = 1; i <= 30; i++)
{
wprintf(L"%lc", WALL);
SetPos(58, i);
}
////刻度
//int count = 0;
//SetPos(60, 0);
//for (i = 1; i <= 30; i++)
//{
// count++;
// printf("%2d", count);
// SetPos(60, i);
//}
}
// 初始化蛇身
void InitSnake(pSnake ps) {
int i = 0;
pSnakeNode cur = NULL;
//开辟蛇身空间5个节点
for (i = 0; i < 5; i++) {
//创建蛇的节点
cur = (pSnakeNode)malloc(sizeof(SnakeNode));
if (cur == NULL) {
perror("InitSnake():malloc()");
return;
}
//设置初始化坐标
cur->next = NULL;
cur->x = POS_X + i * 2;
cur->y = POS_Y;
//连接5个蛇身节点--头插法
if (ps->pSnake == NULL) {
ps->pSnake = cur;
}
else {
cur->next = ps->pSnake;
ps->pSnake = cur;
}
}
//打印初始化蛇身
cur = ps->pSnake;
while (cur) {
SetPos(cur->x, cur->y);
wprintf(L"%lc", BODY);
cur = cur->next;
}
//初始化蛇身其他数据
ps->Dir = RIGHT;
ps->FoodWeight = 10;
ps->SleepTime = 200;
ps->Socre = 0;
ps->status = OK;
}
// 初始化食物
void CreateFood(pSnake ps) {
//随机出现在x偶数列,y列上
//在墙内
//不能在蛇身上
int x = 0;
int y = 0;
pSnakeNode pFood = NULL;
pSnakeNode cur = ps->pSnake;
again:
do {
//在墙内
x = rand() % 57 + 2;
y = rand() % 29 + 1;
} while (x % 2);//在x的偶数列————模2非1继续运行
//出现在蛇身上——进入循环重新生成
while (cur) {
if (x == cur->x && y == cur->y)
{
goto again;
}
cur = cur->next;
}
//创建食物的节点
pFood = (pSnakeNode)malloc(sizeof(SnakeNode));
if (pFood == NULL) {
perror("CreateFood():malloc()");
return;
}
//打印食物
pFood->x = x;
pFood->y = y;
ps->pFood = pFood;
SetPos(x,y);
wprintf(L"%lc", FOOD);
}
//游戏前的准备工作
void GameStart(pSnake ps) {
//设置窗口大小 ,名称
Set_cols_lines();
//隐藏光标
Corsor_False();
//打印游戏欢迎界面
WelcomeToGame();
//打印地图
CreateMap();
// 初始化蛇身
InitSnake(ps);
// 初始化食物
CreateFood(ps);
}
//打印右侧帮助栏
void PrintHelpInfo() {
SetPos(65, 20);
printf("不能穿墙,不能咬到自己\n");
SetPos(65, 21);
printf("用↑ → ↓ ←分别控制蛇的移动\n");
SetPos(65, 22);
printf("F3为加速,F4为减速\n");
SetPos(65, 23);
printf("ESC:退出游戏. space:暂停游戏. \n");
}
//暂停
void pause() {
//休眠时长改为无限
while (1) {
Sleep(300);
//直到再次按下空格键跳出循环
if (KEY_PRESS(VK_SPACE)) {
break;
}
}
}
//是食物,吃掉,增加蛇身节点,头插,加分
void IsNextFood(pSnake ps, pSnakeNode pNextNode) {
//头插
pNextNode->next = ps->pSnake;
ps->pSnake = pNextNode;
//打印新蛇身
pSnakeNode cur = ps->pSnake;
while (cur) {
SetPos(cur->x, cur->y);
wprintf(L"%lc", BODY);
cur = cur->next;
}
//加分
ps->Socre += ps->FoodWeight;
//释放旧食物,创建新食物
free(ps->pFood);
CreateFood(ps);
}
//不是食物,头插,释放尾节点,打印
void NotNextFood(pSnake ps, pSnakeNode pNextNode) {
//头插
pNextNode->next = ps->pSnake;
ps->pSnake = pNextNode;
//找尾节点
pSnakeNode cur = ps->pSnake;
while (cur->next->next) {
SetPos(cur->x, cur->y);
//打印蛇身
wprintf(L"%lc", BODY);
cur = cur->next;
}
SetPos(cur->next->x, cur->next->y);
//尾节点打印空格
printf(" ");
free(cur->next);
cur->next = NULL;
}
//撞墙结束游戏
int KILLBY_WALL(pSnake ps) {
//下一个节点是墙的节点
if (ps->pSnake->x == 58
|| ps->pSnake->x == 0
|| ps->pSnake->y == 0
|| ps->pSnake->y == 29
) {
ps->status = KILL_BY_WALL;
return 1;
}
return 0;
}
//撞到自己结束游戏
int KILLBY_SELF(pSnake ps) {
//遍历蛇身节点
pSnakeNode cur = ps->pSnake->next;
while (cur) {
if (cur->x == ps->pSnake->x
&& cur->y == ps->pSnake->y)
{
ps->status = KILL_BY_SELF;
return;
}
cur = cur->next;
}
}
//蛇的移动
void SnakeMove(pSnake ps) {
//创建下一个节点
pSnakeNode pNextNode = (pSnakeNode)malloc(sizeof(SnakeNode));
if (pNextNode == NULL) {
perror("pNextNode:malloc");
return;
}
//确定下一个节点坐标,根据下一个节点坐标,确定蛇头的坐标和方向
switch (ps->Dir)
{
case UP: {
pNextNode->x = ps->pSnake->x;
pNextNode->y = ps->pSnake->y - 1;
}break;
case DOWN: {
pNextNode->x = ps->pSnake->x;
pNextNode->y = ps->pSnake->y + 1;
}break;
case LEFT: {
pNextNode->x = ps->pSnake->x - 2;
pNextNode->y = ps->pSnake->y;
}break;
case RIGHT: {
pNextNode->x = ps->pSnake->x + 2;
pNextNode->y = ps->pSnake->y;
}break;
}
//下一个节点是否为 食物
if ((pNextNode->x == ps->pFood->x) &&( pNextNode->y == ps->pFood->y))
{
//是食物,吃掉,增加蛇身节点,尾插,加分
IsNextFood(ps, pNextNode);
}
else
{
//不是食物,每个蛇身节点依次前移
NotNextFood(ps, pNextNode);
}
//撞墙结束游戏
KILLBY_WALL(ps);
//撞到自己结束游戏
KILLBY_SELF(ps);
}
//游戏运行的过程
void GameRun(pSnake ps) {
//打印右侧帮助栏
PrintHelpInfo();
do {
//得分栏
SetPos(65, 10);
printf("得分:%d 分 ", ps->Socre);
printf("每个食物的分数为%d分\n", ps->FoodWeight);
//按下\上不能向上\下移动时
//按左\右不能向左\右移动时
if (KEY_PRESS(VK_UP) && ps->Dir != DOWN) {
ps->Dir = UP;
}
else if (KEY_PRESS(VK_DOWN) && ps->Dir != UP) {
ps->Dir = DOWN;
}
else if (KEY_PRESS(VK_LEFT) && ps->Dir != RIGHT) {
ps->Dir = LEFT;
}
else if (KEY_PRESS(VK_RIGHT) && ps->Dir != LEFT) {
ps->Dir = RIGHT;
}
else if (KEY_PRESS(VK_SPACE)) {
pause();//暂停
}
else if (KEY_PRESS(VK_ESCAPE)) {
ps->status = END;
break;
}
else if (KEY_PRESS(VK_F3)) {
//加速
if (ps->SleepTime > 50) {
ps->SleepTime -= 40;
ps->FoodWeight += 2;
}
}
else if (KEY_PRESS(VK_F4)) {
//减速
if (ps->SleepTime < 360) {
ps->SleepTime += 40;
ps->FoodWeight -= 2;
}
}
//移动一下
SnakeMove(ps);
//睡眠一下
Sleep(ps->SleepTime);
} while (ps->status == OK);
}
//游戏结束的善后工作
void GameEnd(pSnake ps) {
//按照结束游戏的情况打印提示语
SetPos(20, 10);
switch (ps->status)
{
case END: {
printf("游戏正常结束,已退出 ");
}break;
case KILL_B
没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
收起资源包目录
C语言集训营代码项目源码.zip (90个子文件)
c-language-code-master
test_3_5
test_3_5
test.c 2KB
TopK_3_15
TopK_3_15
Test.c 1KB
Heap.h 1016B
Heap.c 3KB
TreeLevelOrder_3_23
TreeLevelOrder_3_23
Test.c 3KB
Heap.h 1016B
Queue.c 2KB
Queue.h 859B
Heap.c 3KB
OJ_3_3
OJ.c
test.c 1KB
Stack.h 555B
Stack.c 1KB
Queue_3_4
Queue_3_4
test.c 361B
Queue.c 2KB
Queue.h 843B
test_2_23
test_2_23
test.c 2KB
test_2_22
test_2_22
test.c 1KB
test_1_30
test_1_30
test.c 2KB
test_2_2
test_2_2
test.c 442B
Sort_3_25
Sort_3_25
Test.c 2KB
Sort.h 269B
Sort.c 2KB
MyCircularQueue_3_10
MyCircularQueue_3_10
test.c 3KB
无标题.png 307KB
Sort_3_27
Sort_3_27
Test.c 3KB
Sort.h 315B
Sort.c 3KB
Snack_2_20
Snack_2_20
Test.c 336B
Snake.c 5KB
Snake.h 1KB
基础.c 2KB
.vs
Snack_2_20
v17
.suo 40KB
FileContentIndex
1c664e1f-1199-49b9-b29e-b92a3ad5585f.vsidx 2KB
OJ_3_6
OJ_3_6
test.c 1KB
test_2_3
test_2_3
test.c 1KB
test_2_7
test_2_7
SeqList.c 5KB
test_2_27
test_2_27
test.c 2KB
Sort_3_28
Sort_3_28
Test.c 3KB
Sort.h 400B
Sort.c 4KB
test_2_15
test_2_15
test.c 2KB
test_2_4
test_2_4
SeqList.h 1KB
ConTest.c 1KB
contact.c 2KB
Contact.h 646B
SeqList.c 3KB
test_2_1
test_2_1
SeqList.h 1007B
SeqList.c 3KB
tset.c 1KB
test_2_6
test_2_6
test.c 1KB
OJ_3_21
OJ.png 884KB
OJ_3_21
test.c 2KB
InOrder_3_23
InOrder_3_23
test.c 807B
test_2_28
test_2_28
test.c 1KB
Stack_3_2
Stack_3_2
test.c 400B
Stack.h 601B
Stack.c 1KB
test_1_29
.vs
test_1_29
v17
Browse.VC.db 1.71MB
.suo 18KB
test_1_29
test.c 4KB
test_1_29.sln 1KB
Snake_2_21
Snake_2_21
test.c 579B
Snake.c 8KB
Snake.h 2KB
Tree_3_17
Tree_3_17
test.c 2KB
Heap.h 663B
Heap.c 2KB
SList_2_25
SList_2_25
SList.c 4KB
List_2_26
List_2_26
List.c 1KB
test_2_5
test_2_5
SList.h 875B
test.c 1KB
SList.c 4KB
Sort_3_31
Sort_3_31
排序.png 649KB
Test.c 4KB
Sort.h 524B
Sort.c 7KB
Heap_3_11
堆的排序.png 977KB
Heap_3_11
test.c 350B
Heap.h 664B
Heap.c 2KB
OJ_3_9
OJ_3_9
test.c 4KB
test_2_16
test_2_16
test.c 1000B
List.c 3KB
List.h 835B
test_4_5
test_4_5
test.cpp 2KB
test_3_1
test_3_1
test.c 3KB
test_2_17
test_2_17
test.c 604B
Tree_3_18
Tree_3_18
Test.c 3KB
Heap.h 1016B
Heap.c 3KB
共 90 条
- 1
资源评论
yava_free
- 粉丝: 4466
- 资源: 1788
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- [高等教育]串行通信概念及51系列单片机的串行口问题.ppt
- (课件)计算机化系统验证(共100页).pdf
- [工学]CH7-Java语言程序设计中的若干问题.ppt
- 【Java毕业设计】Java基于springboot+vue的服装生产管理的设计与实现.rar
- [工学]chapter01计算机基础知识另.ppt
- [工程科技]微机原理与接口技术-郭兰英-第1章.ppt
- 【Java毕业设计】Java基于springboot+vue的电影评论网站系统设计与实现.rar
- [工学]第9章-计算机控制系统中的抗干扰技术.ppt
- [工学]第1章--数据库技术基础.ppt
- [工学]sql2005基础知识简单操作.ppt
- [计算机软件及应用]2-变量、数据类型和运算符.ppt
- [工学]高级办公自动化课件.ppt
- [计算机]2-linux基本命令.ppt
- 【Java毕业设计】Java基于springboot+vue的房产销售系统.rar
- [计算机软件及应用]14681-第2章.ppt
- [计算机软件及应用]API-接口doc文档.doc
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功