C语言实现贪吃蛇_第1页
C语言实现贪吃蛇_第2页
C语言实现贪吃蛇_第3页
C语言实现贪吃蛇_第4页
C语言实现贪吃蛇_第5页
已阅读5页,还剩19页未读 继续免费阅读

付费下载

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、C 语言实现贪吃蛇/*贪吃蛇实现原理:*贪吃蛇游戏在理论上是可以无限的进行下去的(除了撞墙和 咬到自己),那么游戏主体就一定是个循环。*蛇是如何动起来的?在这里就是通过不断改变蛇的坐标,然 后根据蛇的坐标不断刷新屏幕在视觉上形成蛇的移动效果。*食物出现在随机位置(当然不能出现在障碍物和蛇身上)蛇能吃到食物其实就是蛇头的坐标与食物的坐标重合时。当蛇咬到自己或者撞到墙的时候游戏结束(坐标判断)* */#incl ude <stdio.h>#include <conio.h>#include <stdlib.h>#include <windows.h>

2、#include <time.h>/72,80,75,77 是方向键对应的键值#define UP 72#define DOWN 80#define LEFT 75#define RIGHT 77#define SNAKE 1/蛇的坐标标识#define FOOD 2/食物的坐标标识#define BAR 3/ 墙的坐标标识 /初始化地图 17*17char map1717 = 0;/初始化蛇头坐标unsigned char snake50 = 77;/初始化食物坐标unsigned char food = 68;/蛇长 char len = 1;/ 存储坐标数字与 x、 y 的转

3、换函数 void tran(unsigned char num,unsigned char * x,unsigned char * y);/打印游戏void print_game(void);/获取方向函数(注意当蛇身长度超过一节时不能回头)int get_dir(int old_dir);/移动蛇身函数 (游戏大部分内容在其中 )void move_snake(int dir);/生产食物的函数unsigned char generate_food(void);/判断蛇死活的函数 (判断了蛇是否撞到边界或者自食 ) int isalive(void);int main(void)int di

4、r = UP;/初始方向默认向上, UP 是我们定义的宏/按道理该游戏是可以无限继续下去的,因此是个循环while(1)print_game();dir = get_dir(dir); 向)move_snake(dir);if(!isalive()/打印游戏/获取方向 (我们摁下的方/移动蛇身/判断蛇的生命状态break; printf(Game Over!n);return 0;/void tran(unsigned char num,unsigned char * x,unsigned char * y)*x = num >> 4;*y = (unsigned char)(nu

5、m << 4) >> 4;/ 注意这里要做个强制类型转换/根据汇 编,如果不做强制转换, y 的值与 num 的值相同void print_game(void)int i,j;/根据地图上每点的情况绘制游戏(i 表示 x 轴, j 表示 y 轴),按行打印, j 表示行, i 表示列 for(j = 0;j < 17;j +)for(i = 0;i < 17;i +)/空白地方if(mapij = 0)putchar( );/蛇身else if(mapij = SNAKE)putchar(*);/围栏else if(mapij = BAR) putchar(

6、#);/食物else if(mapij = FOOD) putchar($);putchar(n);Sleep(500);/休眠函数 将进程挂起 500ms, 包含在 window.h( 在 linux 下用 sleep(),#include <unistd.h> )system(cls); / 清屏函数 配合下一次 print_game() 起到刷新作用,包含在 stdlib.h 中int get_dir(int old_dir)int new_dir = old_dir;/ 用kbhit() 与 getch() 组合实现键盘响应/kbhit() 检查当前是否有键盘输入,若有则返

7、回一个非0 值,否则返回 0/getch() 用 ch=_getch(); 会等待你按下任意键之后,把 该键字符所对应的 ASCII 码赋给 ch, 再执行下面的语句。if(_kbhit()_getch();/第一次输出的方向键的扩展值,第二次是方向键的实际值,只有方向键上下左右这new_dir = _getch(); /getch() 函数要使用两次 原因是因为第一次返回的值指示该键扩展的字符,第二次调 用才返回实际的键代码 /如果蛇身长度大于 1,则不 能回头,如果摁回头方向,则按原来方向走/abs(new_dir - old_dir) = 2 表示 |LEFT-RIGHT|/abs(ne

8、w_dir - old_dir) = 8 表示 |UP-DOWN|if(len > 1 && (abs(new_dir - old_dir)= 2 | abs(new_dir - old_dir) = 8)new_dir = old_dir; return new_dir;void move_snake(int dir)int last = snake0,current; /last 与 current 用于之 后蛇坐标的更新int i,j;int grow=0; /判断是否要长身体unsigned char x, y,fx,fy;/蛇坐标与食物坐标tran(food,

9、&fx, &fy); / 食物坐标tran(snake0, &x, &y); / 蛇头坐标switch (dir)/ 更新蛇头坐标 (坐标原点是左上角)case UP:y-;break;case DOWN:y+;break;case LEFT:x-;break;case RIGHT:break;/按位抑或(妙! )/将 x,y 换回一snakeO = (x A 0) & It ;&It; 4) A y;个数/x 与 0 抑或保留原值/将 x 与 y 重新合成一个值/蛇吃到了食物if (snake0 = food) grow = 1;food = generate

10、_food();/产生新食物/*/for (i = 0; i<len; i+) /蛇移动的关键,通过将蛇头原来的坐标赋给第二节,原来的第二节赋给第三节,依 次下去,完成蛇坐标的更新if (i = 0)/如果只有头,跳过,因为前面已更新蛇头坐标continue;/将当前操作的蛇节坐current = snakei; 标存储到 current 里snakei = last;的更新/完成当前操作蛇节坐标last = current;/last 记录的是上一次操作蛇节的坐标,这次操作已经结束,故把 current 赋给 last*/如果蛇边长了if (grow) snakelen = last;

11、len+;for (j = 0; j < 17; j +)/ 将边界与食物加到地图里去( i,j 对应 x 轴和 y 轴)for (i = 0; i < 17; i +)if (i = 0 | i = 16 | j = 0 | j = 16)mapij = BAR;else if (i = fx&&j = fy)mapij = FOOD;elsemapij = 0;/将蛇加到地图里去for (i = 0; i < len; i+) tran(snakei, &x, &y);if (snakei > 0)mapxy = SNAKE;unsi

12、gned char generate_food(void)unsigned char food_,fx,fy;int in_snake=0,i;/以当前时间为参数提供种子供 rand() 函数生成更为随 机的数srand(unsigned int)time(NULL);/循环产生在边界内且不在蛇身上的食物do food_ = rand() % 255;/ 产生一个 0-255 的随机数 tran(food_, &fx, &fy);for (i = 0; i < len; i+)if (food_ = snakei)/在不在蛇身上in_snake = 1; while (fx = 0 | fx = 16 | fy = 0 | fy = 16 |in_snake);return food_;int isalive(void)int self_eat = 0;i

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论