利用链表的贪吃蛇,感觉自己写的时候还是有很多东西不熟悉,

1.预编译

2.很多关于系统的头文件也不是很熟悉

3.关于内存

第一个是.h头文件

#ifndef _SNAKE_H_H_H
#define _SNAKE_H_H_H //调节游戏界面大小,这里设置为15*15
int const COL=15;
int const ROW=15; //蛇结点
typedef struct Node
{
//data域
int x;
int y; //指针域
struct Node* pre;
struct Node* next;
}NODE,*pNODE; //食物
typedef struct Food
{
int x;
int y;
char c;
}FOOD,*pFOOD; //初始化函数 //初始化蛇链表,创建蛇的第一节
pNODE InitSnake(); //初始化食物
FOOD InitFood(void); //其它函数 //蛇运动函数
int MoveSnake(pNODE pHead,char c); //检查键盘按键
char KbHit(char orient);//函数重载 //蛇吃到食物时的处理函数
pNODE SnakeEatFood(pNODE pHead,pFOOD pFood); //打印游戏界面函数
void Print(pNODE pHead,FOOD food); //游戏结束,释放内存函数
void FreeMemory(pNODE *ppHead); #endif

  

第二个是.cpp文件

#include "stdafx.h"
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<conio.h>//windows/dos界面下可以用来生成一些漂亮的字符,另外getchar(),getch()等函数包含在其中
#include<Windows.h>
#include"Snake.h" //主函数
int main(void)
{
char orien = 'a', get_char;
int game_over = 0; FOOD food = InitFood();
pNODE head = InitSnake(); while (1)
{
head = SnakeEatFood(head, &food);
get_char = KbHit(orien);
if (27 == get_char)
{
game_over = 1;
break;
}
else
orien = get_char;
game_over = MoveSnake(head, orien);
if (game_over)
break; system("cls");
Print(head, food);
Sleep(200); //ms级,刷屏间隔时间
}
if (game_over)
{
printf("游戏结束!\n"); FreeMemory(&head);
if (NULL == head)
printf("内存释放成功!\n");
else
printf("内存释放失败!\n");
}
_getch();
return 0;
}
//初始化,创建蛇的第一节
pNODE InitSnake(void)
{
pNODE pHead = (pNODE)malloc(sizeof(NODE));
srand((unsigned)(time(NULL)+1)); if (NULL == pHead)
{
printf("内存分配失败!\n");
exit(-1);
} pHead->x = rand() % ROW;
pHead->y = rand() % COL;
pHead->next = NULL;
pHead->pre = NULL; return pHead;
}
//初始化食物成员
FOOD InitFood(void)
{
FOOD food;
srand((unsigned)time(NULL)); food.x = rand() % ROW;
food.y = rand() % COL;
food.c = 65 + rand()%26; return food;
}
//蛇吃到食物处理函数
pNODE SnakeEatFood(pNODE pHead, pFOOD pFood)
{
pNODE p_add = NULL, pt = NULL, rear = NULL; if (pFood->x == pHead->x && pFood->y == pHead->y)
{
p_add = (pNODE)malloc(sizeof(NODE));
if (NULL == p_add)
{
printf("内存分配失败!\n");
exit(-1);
} pt = pHead;
while (pt->next != NULL)
{
pt = pt->next;
}
p_add->pre = pt;
p_add->next = NULL;
pt->next = p_add; *pFood = InitFood();
//不让食物出现在蛇的位置上
pt = pHead;
while (pt != NULL)
{
if (pFood->x == pHead->x && pFood->y == pHead->y)
{
*pFood = InitFood();
break;
}
pt = pt->next;
}
} return pHead;
}
//检查键盘按键
char KbHit(char orient)
{
char c; if (_kbhit())
{
c = _getch();
if (orient != 'd' && c == 'a')
{
orient = c;
}
else if (orient != 'a' && c == 'd')
{
orient = c;
}
else if (orient != 'w' && c == 's')
{
orient = c;
}
else if (orient != 's' && c == 'w')
{
orient = c;
}
else if (27 == c)
{
orient = c;
}
} return orient;
}
//蛇运动函数
int MoveSnake(pNODE pHead, char c)
{
INT game_over = 0;
pNODE pt = pHead; //让pt指向蛇尾
while (pt->next != NULL)
{
pt = pt->next;
} //从蛇尾向向蛇头前进
while(pt != pHead)
{
pt->x = pt->pre->x;
pt->y = pt->pre->y;
pt = pt->pre;
} if ('d' == c)
{
pHead->x += 1;
if (pHead->x >= ROW)
{
pHead->x -= ROW;
}
} if ('a' == c)
{
pHead->x -= 1;
if (pHead->x < 0)
{
pHead->x += ROW;
}
} if ('s' == c)
{
pHead->y += 1;
if (pHead->y >= COL)
{
pHead->y -= COL;
}
} if ('w' == c)
{
pHead->y -= 1;
if (pHead->y < 0)
{
pHead->y += COL;
}
} //当蛇头碰到蛇身,游戏结束
pt = pHead->next;
while (pt != NULL)
{
if (pt->x == pHead->x && pt->y == pHead->y)
{
game_over = 1;
}
pt = pt->next;
} return game_over;
}
//打印游戏界面函数
void Print(pNODE pHead, FOOD food)
{
int row = 0, col = 0, flag = 0;
pNODE pt = NULL; printf(" 方向控制——上:w 下:s 左:a 右:d(Esc退出)\n ");
for (row=0; row<ROW; row++)
{
printf("—");
}
putchar('\n'); for (col=0; col<COL; col++)
{
printf(" |");
for (row=0; row<ROW; row++)
{
pt = pHead;
flag = 0;
//打印出蛇
while (pt != NULL)
{
if (row == pt->x && col == pt->y)
{
if (pt == pHead)
printf("■");
else
printf("□");
flag = 1;
break;
}
pt = pt->next;
}
//打印出食物或两个空格
if (0 == flag)
{
if (row == food.x && col == food.y)
{
putchar(food.c);
putchar(food.c);
continue;
}
printf(" ");
}
}
printf("|");
putchar('\n');
} printf(" ");
for (row=0; row<ROW; row++)
{
printf("—");
}
putchar('\n');
}
//释放内存函数
void FreeMemory(pNODE *ppHead)
{
pNODE p_delete = NULL, pt = NULL; while (*ppHead != NULL)
{
pt = (*ppHead)->next;
if (pt != NULL)
{
pt->pre = NULL;
}
p_delete = *ppHead;
free(p_delete);
p_delete = NULL;
*ppHead = pt;
}
}

  

C语言之贪吃蛇的更多相关文章

  1. C语言实现贪吃蛇

    日期:2018.9.11 用时:150min 项目:贪吃蛇(C语言--数组   结构体实现) 开发工具:vs2013 关键知识:数组,结构体,图形库,键位操作 源代码: #include<std ...

  2. c语言版贪吃蛇小游戏

    编译环境:windows 7 64位 编译工具:codeblocks 13.12 备注:未使用graphics.h 声明:个人原创,未经允许,禁止转载!!! 数据结构:双向链表 1.程序未使用grap ...

  3. C语言实现贪吃蛇游戏

    #include<stdio.h> #include<stdlib.h> #include<string.h> #include<sys/times.h> ...

  4. C语言实现贪吃蛇源码

    先放效果 源代码 //2016-2-12 //zhaoyu //Gmail:zhaoyu1995.com@gmail.com //Language: C //Platform:Code::Blocks ...

  5. 小项目特供 贪吃蛇游戏(基于C语言)

    C语言写贪吃蛇本来是打算去年暑假写的,结果因为ACM集训给耽搁了,因此借寒假的两天功夫写了这个贪吃蛇小项目,顺带把C语言重温了一次. 是发表博客的前一天开始写的,一共写了三个版本,第一天写了第一版,第 ...

  6. C语言 小游戏之贪吃蛇

    还记得非常久曾经听群里人说做贪吃蛇什么的,那时候大一刚学了C语言,认为非常难,根本没什么思路. 前不久群里有些人又在谈论C语言贪吃蛇的事了,看着他们在做,我也打算做一个出来. 如今大三,经过了这一年半 ...

  7. 贪吃蛇小游戏-----C语言实现

    1.分析 众所周知,贪吃蛇游戏是一款经典的益智游戏,有PC和手机等多平台版本,既简单又耐玩.该游戏通过控制蛇头方向吃食物,从而使得蛇变得越来越长,蛇不能撞墙,也不能装到自己,否则游戏结束.玩过贪吃蛇的 ...

  8. C/C++编程笔记:C语言贪吃蛇源代码控制台(二),分数和食物!

    接上文<C/C++编程笔记:C语言贪吃蛇源代码控制台(一),会动的那种哦!>如果你在学习C语言开发贪吃蛇的话,零基础建议从上一篇开始哦!接下来正式开始吧! 三.蛇的运动 上次我已经教大家画 ...

  9. C语言用面向对象的思想写贪吃蛇

    大概一年前这时候,接触C语言一个月,那时候知之甚少,对面向对象只觉”可远观而不可亵玩“,而且会看到很多言论说C语言就是面向过程的语言,C++就是面向对象的语言.不过,不记得什么时候在网上看到过一篇博文 ...

随机推荐

  1. js获取可视区大小和页面大小的兼容性写法

    var getPageSize = function() { var scrW, scrH; if(window.innerHeight && window.scrollMaxY) { ...

  2. 如何为logo配色

    原网链接:http://design.jobbole.com/125287/ 色彩是带有情绪的.我们能感知到的色彩能带来各种各样的情绪,也能传达一种思想或一种文化. 企业logo的色彩就是利用上面的原 ...

  3. notes:spm多重比较校正

    SPM做完统计后,statistical table中的FDRc实际上是在该p-uncorrected下,可以令FDR-correcred p<=0.05的最小cluster中的voxel数目: ...

  4. 007商城项目:商品列表查询-需求分析,以及Spinmvc的访问知识

    我们之前已经整合了ssm框架并且调试已经好了,接下来我们实现商品列表的查询. 我们先进入到首页: 方法如下: 我们看到我们把所有的jsp页面都是放在: 这些页面都是放在WEB-IN下面的,也就是说这些 ...

  5. C语言 malloc()与sizeof运算的盲点

    //malloc()与sizeof运算的盲点 #include <stdio.h> #include <stdlib.h> #include <string.h> ...

  6. LINQ 查询表达式(C# 编程指南)

    语言集成查询 (LINQ) 是一组技术的名称,这些技术建立在将查询功能直接集成到 C# 语言(以及 Visual Basic 和可能的任何其他 .NET 语言)的基础上.  借助于 LINQ,查询现在 ...

  7. WampServer下如何实现多域名配置(虚拟域名配置)

    之前在学习跨域的时候,我写过一篇叫做WampServer下使用多端口访问的文章,默认的 localhost 采用的是 80 端口,能使用多端口访问的核心是得新建一个端口,也就是新建一个 http 服务 ...

  8. 一次莽撞的行为:在phpmyadmin中修改MySQL root密码后无法操作数据库

    一.手贱行为(✿◡‿◡) 在一次开发中通过xampp方式安装了PHP环境,需要操作数据库时通过phpmyadmin访问MySQL,在一次数据库操作时想起没有设置密码,于是直接在mysql数据库中的us ...

  9. GitHub 上一份很受欢迎的前端代码优化指南-强烈推荐收藏

    看到一份很受欢迎的前端代码指南,根据自己的理解进行了翻译,但能力有限,对一些JS代码理解不了,如有错误,望斧正. HTML 语义化标签 HTML5 提供了很多语义化元素,更好地帮助描述内容.希望你能从 ...

  10. [BZOJ1264][AHOI2006]Match(DP+树状数组)

    题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=1264 分析: 考虑做一般的LCS的时候,更新结果的条件是a[i]==b[j]时候 于是 ...