C语言之贪吃蛇
利用链表的贪吃蛇,感觉自己写的时候还是有很多东西不熟悉,
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语言之贪吃蛇的更多相关文章
- C语言实现贪吃蛇
日期:2018.9.11 用时:150min 项目:贪吃蛇(C语言--数组 结构体实现) 开发工具:vs2013 关键知识:数组,结构体,图形库,键位操作 源代码: #include<std ...
- c语言版贪吃蛇小游戏
编译环境:windows 7 64位 编译工具:codeblocks 13.12 备注:未使用graphics.h 声明:个人原创,未经允许,禁止转载!!! 数据结构:双向链表 1.程序未使用grap ...
- C语言实现贪吃蛇游戏
#include<stdio.h> #include<stdlib.h> #include<string.h> #include<sys/times.h> ...
- C语言实现贪吃蛇源码
先放效果 源代码 //2016-2-12 //zhaoyu //Gmail:zhaoyu1995.com@gmail.com //Language: C //Platform:Code::Blocks ...
- 小项目特供 贪吃蛇游戏(基于C语言)
C语言写贪吃蛇本来是打算去年暑假写的,结果因为ACM集训给耽搁了,因此借寒假的两天功夫写了这个贪吃蛇小项目,顺带把C语言重温了一次. 是发表博客的前一天开始写的,一共写了三个版本,第一天写了第一版,第 ...
- C语言 小游戏之贪吃蛇
还记得非常久曾经听群里人说做贪吃蛇什么的,那时候大一刚学了C语言,认为非常难,根本没什么思路. 前不久群里有些人又在谈论C语言贪吃蛇的事了,看着他们在做,我也打算做一个出来. 如今大三,经过了这一年半 ...
- 贪吃蛇小游戏-----C语言实现
1.分析 众所周知,贪吃蛇游戏是一款经典的益智游戏,有PC和手机等多平台版本,既简单又耐玩.该游戏通过控制蛇头方向吃食物,从而使得蛇变得越来越长,蛇不能撞墙,也不能装到自己,否则游戏结束.玩过贪吃蛇的 ...
- C/C++编程笔记:C语言贪吃蛇源代码控制台(二),分数和食物!
接上文<C/C++编程笔记:C语言贪吃蛇源代码控制台(一),会动的那种哦!>如果你在学习C语言开发贪吃蛇的话,零基础建议从上一篇开始哦!接下来正式开始吧! 三.蛇的运动 上次我已经教大家画 ...
- C语言用面向对象的思想写贪吃蛇
大概一年前这时候,接触C语言一个月,那时候知之甚少,对面向对象只觉”可远观而不可亵玩“,而且会看到很多言论说C语言就是面向过程的语言,C++就是面向对象的语言.不过,不记得什么时候在网上看到过一篇博文 ...
随机推荐
- webpack中output配置项中chunkFilename属性的用法
chunkFilename和webpack.optimize.CommonsChunkPlugin插件的作用差不多,都是用来将公共模块提取出来,但是用法不一样,这里主要介绍chunkFilename的 ...
- 你所未知的3种 Node.js 代码优化方式
from:https://cnodejs.org/topic/56cc2fd6c045c3743304bec6 Node.js 程序的运行可能会受 CPU 或输入输出操作的限制而十分缓慢.从 CPU ...
- javascript中的链表结构
1.定义 很多编程语言中数组的长度是固定的,就是定义数组的时候需要定义数组的长度,所以当数组已经被数据填满的时候,需要再加入新的元素就很困难.只能说在部分变成语言中会有这种情况,在javascript ...
- 深入理解Java之线程池
原作者:海子 出处:http://www.cnblogs.com/dolphin0520/ 本文归作者海子和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则 ...
- P3398 仓鼠找sugar
P3398 仓鼠找sugar 题目描述 小仓鼠的和他的基(mei)友(zi)sugar住在地下洞穴中,每个节点的编号为1~n.地下洞穴是一个树形结构.这一天小仓鼠打算从从他的卧室(a)到餐厅(b),而 ...
- IIS 伪静态配置(安装ISAPI_Rewrite配置)
第一:首先到官方网站下载ISAPI_Rewrite 我的机子是32位的就下32位免费版的,链接地址如下: http://www.helicontech.com/download/isapi_rewri ...
- Android属性(property)机制
1. 属性简介 Android里有很多属性(property),每个属性都有一个名称和值,他们都是字符串格式.这些属性定义了Android系统的一些公共系统属性.比如: [dalvik.vm.dexo ...
- FineUI小技巧(3)表格导出与文件下载
需求描述 实际应用中,我们可能需要导出表格内容,或者在页面回发时根据用户权限下载文件(注意,这里的导出与下载,都是在后台进行的,和普通的一个链接下载文件不同). 点击按钮导出表格 由于FineUI 默 ...
- canvas api
基本骨骼 <canvas id="canvas" width=1000 height=1000 style="border: 1px black dotted&qu ...
- Windows 部署 Redis 群集
1,下载Redis for windows 的最新版本,解压到 c:\Redis 目录下备用https://github.com/MSOpenTech/redis/releases当前我使用的是 3. ...