一个控制台贪吃蛇小游戏(wsad控制移动)

/********************************************
* 程序名称:MR.DUAN 的贪吃蛇游戏(链表法)
* 作 者:WindAutumn <fluttingleaves@hotmail.com>
* 最后修改:2012-7-25-PM
* 版 本 号:1.3
*
*
* 以后有空再修改
* *****************************************/ #include<stdio.h>
#include<windows.h>
#include<conio.h>
#include<time.h> #define MAXWIDE 80
#define MAXHIGH 24 typedef struct
{
int x;
int y;
} POSITION; // 食物,节点 typedef struct snackbody
{
POSITION body;
snackbody * link;
} SNACK; // 蛇身的链表 void StartGame();
void InitScreen(HANDLE hSnack);
void HideCursor(HANDLE hSnack);
void GotoXY(HANDLE hSnack, int x, int y); void PrintRandFood(HANDLE hSnack, POSITION * food);
void PrintSnack(HANDLE hSnack, SNACK * snack, int mode);
//int HeadDirection();
SNACK * SnackHeadWalk(SNACK * snack, int direction);
void IsDied(HANDLE hSnack, SNACK * snack, POSITION * food);
void GameOver(HANDLE hSnack); void main()
{
system("color 7b");// 白色背景
SetConsoleTitle("MR.DUAN 的贪吃蛇游戏");
StartGame();
} void StartGame()
{
POSITION food;
SNACK * snack = (SNACK *)malloc(sizeof(SNACK));
char length = ;// 定义长度
int direction_get = ;// 定义获取的方向
int direction_last = ;// 定义之后的方向
int key_direct;// 按下的按键
int foodflag = ;// 食物是否存在,1--是,0--否 HANDLE hSnack = GetStdHandle(STD_OUTPUT_HANDLE);
HideCursor(hSnack);
InitScreen(hSnack); srand(time(NULL));// 初始化随机数生成器,以便产生随机 食物
snack->body.x = ;// 蛇头
snack->body.y = ;
snack->link = NULL; PrintSnack(hSnack, snack, );// mode 0 打印初始蛇头
Sleep();
while()// 贪吃蛇操作
{
if(_kbhit())
{
key_direct = getch();
switch(key_direct)
{
case 'w' :
direction_get = ;
break;// 上// 键盘四按键的逆序
case 'a' :
direction_get = ;
break;// 左
case 's' :
direction_get = ;
break;// 下
case 'd' :
direction_get = ;
break;// 右
}
}
if((direction_last != direction_get + )&&(direction_last != direction_get - ))
direction_last = direction_get;// 如果行进方向和获取方向不为相反,则改变行进方向
snack = SnackHeadWalk(snack, direction_last); if( == foodflag)
{
PrintRandFood(hSnack, &food);// 如果食物已经被吃,则产生新的食物
foodflag = ;// 食物标记为 未吃
} if(snack->body.x == food.x && snack->body.y == food.y)// 头碰到食物
{
PrintSnack(hSnack, snack, );// 只打头不去尾
foodflag = ;// 食物被吃,没有食物了
length++;
}
else
{
PrintSnack(hSnack, snack, );// 打头
PrintSnack(hSnack, snack, );// 去尾
}
IsDied(hSnack, snack, &food);
Sleep();
}
} void InitScreen(HANDLE hSnack)// 打印周围红框框
{
int i;
SetConsoleTextAttribute(hSnack, FOREGROUND_INTENSITY | FOREGROUND_RED |
BACKGROUND_BLUE | BACKGROUND_GREEN | BACKGROUND_RED);// 红色字体,白色背景
GotoXY(hSnack, , );
printf("╔");
for(i=; i<(MAXWIDE-)/; i++)
printf("═");
printf("╗"); for(i=; i< MAXHIGH; i++)
{
GotoXY(hSnack, , i);
printf("║");
GotoXY(hSnack, MAXWIDE-, i);
printf("║");
} GotoXY(hSnack, , MAXHIGH);
printf("╚");
for(i=; i<(MAXWIDE-)/; i++)
printf("═");
printf("╝"); GotoXY(hSnack, , );
} void HideCursor(HANDLE hSnack)
{
CONSOLE_CURSOR_INFO cursor_info = {, };
SetConsoleCursorInfo(hSnack, &cursor_info);
} void GotoXY(HANDLE hSnack, int x, int y)
{
COORD coord;
coord.X = x;
coord.Y = y;
SetConsoleCursorPosition(hSnack, coord);
} void PrintRandFood(HANDLE hSnack, POSITION * food)// 2--78 中的偶数, 1--23
{
food->x = (rand()% + )/*;
food->y = rand()% + ;
SetConsoleTextAttribute(hSnack,FOREGROUND_GREEN | BACKGROUND_BLUE | BACKGROUND_GREEN | BACKGROUND_RED);
GotoXY(hSnack, food->x, food->y);
printf("█");
} void PrintSnack(HANDLE hSnack, SNACK * snack, int mode)
{
if( == mode)
{
GotoXY(hSnack, snack->body.x, snack->body.y);
SetConsoleTextAttribute(hSnack,FOREGROUND_BLUE | BACKGROUND_BLUE | BACKGROUND_GREEN | BACKGROUND_RED);
printf("□");
}
if( == mode)
{
SNACK * ptail, *pnext;
ptail = snack;
pnext = ptail->link;
while(pnext->link!=NULL)
{
ptail = ptail->link;
pnext = ptail->link;
}
GotoXY(hSnack, pnext->body.x, pnext->body.y);
printf(" ");
ptail->link = NULL;
free(pnext);
}
} /*int HeadDirection()
{
HANDLE hInput = GetStdHandle(STD_INPUT_HANDLE);
INPUT_RECORD inRec;
DWORD res; ReadConsoleInput(hInput, &inRec, 0, &res);
if(inRec.EventType == KEY_EVENT)
{
switch(inRec.Event.KeyEvent.wVirtualKeyCode)
{
case VK_UP : return 1;
case VK_DOWN : return 2;
case VK_LEFT : return 3;
case VK_RIGHT : return 4;
}
}
return 0;
}*/ SNACK * SnackHeadWalk(SNACK * snack, int direction)
{
// 0为默认值,默认向右,1为向上,2为向下,3为向左,4为向右 SNACK * newhead = (SNACK * )malloc(sizeof(SNACK));
switch(direction)
{
case :
newhead->body.x = snack->body.x;
newhead->body.y = snack->body.y - ;
break;
case :
newhead->body.x = snack->body.x;
newhead->body.y = snack->body.y + ;
break;
case :
newhead->body.x = snack->body.x - ;
newhead->body.y = snack->body.y;
break;
case :
case :
newhead->body.x = snack->body.x + ;
newhead->body.y = snack->body.y;
break;
}
newhead->link = snack;
return newhead;
} void IsDied(HANDLE hSnack, SNACK * snack, POSITION * food)
{
SNACK * pCompare = snack;
if(snack->body.x == || snack->body.y == || snack->body.x == MAXWIDE ||snack->body.y == MAXHIGH)
GameOver(hSnack);// 撞墙死亡
while(pCompare->link!=NULL)
{
if(pCompare->body.x == snack->body.x && pCompare->body.y == snack->body.y && pCompare!=snack)
GameOver(hSnack);// 吃到自己死亡
pCompare = pCompare->link;
}
} void GameOver(HANDLE hSnack)
{
GotoXY(hSnack, MAXWIDE/, MAXHIGH/);
printf("GAME OVER!");
GotoXY(hSnack, MAXWIDE/, MAXHIGH/ + );
printf("PRESS ANY KEY TO EXIT.");
getch();
exit();
}
一个控制台贪吃蛇小游戏(wsad控制移动)的更多相关文章
- C++ 简单的控制台贪吃蛇小游戏
由于比较懒,所以不怎么写,觉得这样不应该.我应该对自己学的做出整理,不管是高端低端,写出来是自己的. // 贪吃蛇.cpp : 定义控制台应用程序的入口点. // #include "std ...
- 贪吃蛇小游戏-----C语言实现
1.分析 众所周知,贪吃蛇游戏是一款经典的益智游戏,有PC和手机等多平台版本,既简单又耐玩.该游戏通过控制蛇头方向吃食物,从而使得蛇变得越来越长,蛇不能撞墙,也不能装到自己,否则游戏结束.玩过贪吃蛇的 ...
- JS高级---案例:贪吃蛇小游戏
案例:贪吃蛇小游戏 可以玩的小游戏,略复杂,过了2遍,先pass吧 先创建构造函数,再给原型添加方法.分别创建食物,小蛇和游戏对象. 食物,小蛇的横纵坐标,设置最大最小值,运动起来的函数,按上下左右键 ...
- Java GUI学习,贪吃蛇小游戏
JAVA GUI练习 贪吃蛇小游戏 前几天虽然生病了,但还是跟着狂神学习了GUI的方面,跟着练习了贪吃蛇的小项目,这里有狂神写的源码点我下载,还有我跟着敲的点我下载,嘿嘿,也就注释了下重要的地方,这方 ...
- 用GUI实现java版贪吃蛇小游戏
项目结构 新建一个JFrame窗口,作为程序入口 public class GameStart{ public static void main(String[] args) { JFrame jFr ...
- Java 用java GUI写一个贪吃蛇小游戏
目录 主要用到 swing 包下的一些类 上代码 游戏启动类 游戏数据类 游戏面板类 代码地址 主要用到 swing 包下的一些类 JFrame 窗口类 JPanel 面板类 KeyListener ...
- html5面向对象做一个贪吃蛇小游戏
canvas加面向对象方式的贪吃蛇 2016-08-25 这个小游戏可以增加对面向对象的理解,可以加强js逻辑能力,总之认真自己敲一两遍收获还是不少啊!!适合刚学canvas的同学练习!! 废话不多说 ...
- 用js写一个贪吃蛇小游戏
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 用python+pygame写贪吃蛇小游戏
因为python语法简单好上手,前两天在想能不能用python写个小游戏出来,就上网搜了一下发现了pygame这个写2D游戏的库.了解了两天再参考了一些资料就开始写贪吃蛇这个小游戏. 毕竟最开始的练手 ...
随机推荐
- DEDE站点从网站根目录移到子目录
修改DedeCms系统配置参数-站点设置 a.站点根网址修改为:http://域名/子目录 b.网页主页链接:/子目录 修改DedeCms系统配置参数-核心设置 a.安装目录:/子目录 批量修改原数据 ...
- 使用django-mssql时候报pythoncom模块不存在
pip install django-mssql是链接sqlserver的数据库db引擎,这里用到了pythoncom模块,所以还需要安装 pip install pypiwin32 settings ...
- django 内建标签和过滤器参考
下面的标签和过滤器参考就是为那些没有 admin 站点的可用的人准备的.由于 Django 是高度可定制的,你的 admin 里的关于标签和过滤器的参考可以认为是最可信的. 内建标签参考 block ...
- lua curl动态链接库编译安装
关于lua curl的资料网上并不是很多.找来找去就那么几个,所以我绝得很有必要把我的经验记下来,以防下次忘记 ...
- Ant快速入门(三)-----定义生成文件
适应Ant的关键就是编写生成文件,生成文件定义了该项目的各个生成任务(以target来表示,每个target表示一个生成任务),并定义生成任务之间的依赖关系. Ant生成文件的默认名为build.xm ...
- 上海招聘FPGA讲师(专兼职均可)
上海招聘FPGA讲师(专兼职均可) 招聘FPGA培训讲师(专兼职均可) 诚聘FPGA培训讲师_软件无线电方向 ◆精通FPGA设计方法及技巧 ◆精通无线电知识及System View设计方法,有基于Sy ...
- .net反射详解
前言 之所以要写这篇关于C#反射的随笔,起因有两个: 第一个是自己开发的网站需要用到 其次就是没看到这方面比较好的文章. 所以下定决心自己写一篇,废话不多说开始进入正题. 前期准备 在VS20 ...
- 电源VCC、VSS、VDD、VEE、VPP、Vddf标号的区别
一.解释VCC:C=circuit表示电路的意思,即接入电路的电压: VDD:D=device表示器件的意思,即器件内部的工作电压:VEE:发射极电源电压,EmitterVoltage,一般用于ECL ...
- NOIP
最近把历年题刷一下吧... 发现0几年的题不是爆搜就是高精度,恶心死了...直接跳过,做些有意思的... P1129产生数 floyed之后乘法原理统计 P1810导弹拦截 贪心,按距某个点的距离 ...
- 【转】整理一下Android中的ListView
原文网址:http://sunbofu.blog.51cto.com/6431507/1280441 Android中的listview目测是一个使用频率很高的组件,所以今天来总结一下listview ...