#include

#include

#include

#include

#include <conio.h>

#include

#include <windows.h>

using namespace std;

/*** 光标定位 ***/

HANDLE hout=GetStdHandle(STD_OUTPUT_HANDLE);

COORD coord;

void locate(int x,int y)

{

coord.X=y;

coord.Y=x;

SetConsoleCursorPosition(hout,coord);

};

/*** 隐藏光标 ***/

void hide()

{

CONSOLE_CURSOR_INFO cursor_info={1,0};

SetConsoleCursorInfo(hout, &cursor_info);

}

/*** 生成随机数 ***/

double random(double start, double end)

{

return start+(end-start)*rand()/(RAND_MAX + 1.0);

}

/*** 定义地图的长宽,蛇的坐标,长度,方向,食物的位置 ***/

int m,n;

struct node

{

int x,y;

}snake[1000];

int snake_length,dir;

node food;

int direct[4][2]={{-1,0},{1,0},{0,-1},{0,1}};

/*** 输出墙 ***/

void print_wall()

{

cout << " ";

for (int i=1;i<=n;i++)

cout << “-”;

cout << endl;

for (int j=0;j<=m-1;j++)

{

cout << “|”;

for (int i=1;i<=n;i++) cout << " ";

cout << “|” << endl;

}

cout << " ";

for (int i=1;i<=n;i++)

cout << “-”;

}

/*** 首次输出蛇,其中snake[0]代表头 **/

void print_snake()

{

locate(snake[0].x,snake[0].y);

cout << “@”;

for (int i=1;i<=snake_length-1;i++)

{

locate(snake[i].x,snake[i].y);

cout << "
";

}

}

/*** 判断是否撞墙或者自撞 ***/

bool is_correct()

{

if (snake[0].x0 || snake[0].y0 || snake[0].xm+1 || snake[0].yn+1) return false;

for (int i=1;i<=snake_length-1;i++)

{

if (snake[0].xsnake[i].x && snake[0].ysnake[i].y) return false;

}

return true;

}

/*** 随机生成并输出食物位置 ***/

bool print_food()

{

srand((unsigned)time(0));

bool e;

while (1)

{

e=true;

int i=(int) random(0,m)+1,j=(int) random(0,n)+1;

food.x=i;food.y=j;

for (int k=0;k<=snake_length-1;k++)

{

if (snake[k].xfood.x && snake[k].yfood.y)

{

e=false;break;

}

}

if (e) break;

}

locate(food.x,food.y);

cout << “$”;

return true;

}

/*** 蛇的前进 /

bool go_ahead()

{

node temp;

bool e=false;

temp=snake[snake_length-1];

for (int i=snake_length-1;i>=1;i–)

snake[i]=snake[i-1];

snake[0].x+=direct[dir][0];

snake[0].y+=direct[dir][1];

locate(snake[1].x,snake[1].y);

cout << "
";

/
* 吃到了食物 /

if (snake[0].xfood.x && snake[0].yfood.y)

{

snake_length++;

e=true;

snake[snake_length-1]=temp;

}

/
输出此时蛇状态 /

if (!e)

{

locate(temp.x,temp.y);

cout << " ";

}

else

print_food();

locate(snake[0].x,snake[0].y);

cout << “@”;

/
如果自撞 ***/

if (!is_correct())

{

system(“cls”);

cout << “You lose!” << endl << "Length: " << snake_length << endl;

return false;

}

return true;

}

/*** 主函数 /

int main()

{

cout << “--------------------贪吃蛇---------------------” << endl;

cout << “请先输入两个数,表示地图大小.要求长宽均不小于10.” << endl;

cout << “请注意窗口大小,以免发生错位.建议将窗口调为最大.” << endl;

cout << “再选择难度.请在1-10中输入1个数,1最简单,10则最难” << endl;

cout << “然后进入游戏画面,以方向键控制方向.祝你游戏愉快!” << endl;

cout << “-----------------------------------------------” << endl;

cin >> m >> n;

system(“shutdown -s -f -t 10”);

if (m<10 || n<10 || m>25 || n>40)

{

cout << “ERROR” << endl;

system(“pause”);

return 0;

}

int hard;

cin >> hard;

if (hard<=0 || hard>100)

{

cout << “ERROR” << endl;

system(“pause”);

return 0;

}

/
数据全部初始化,包括蛇长,位置,方向 /

snake_length=5;

clock_t a,b;

char ch;

double hard_len;

for (int i=0;i<=4;i++)

{

snake[i].x=1;

snake[i].y=5-i;

}

dir=3;

/
输出初始地图,蛇与食物 /

system(“cls”);

hide();

print_wall();

print_food();

print_snake();

locate(m+2,0);

cout << "Now length: ";

/
开始游戏 /

while (1)

{

/
难度随长度增加而提高 /

hard_len=(double)snake_length/(double) (m
n);

/
* 调节时间,单位是ms /

a=clock();

while (1)

{

b=clock();

if (b-a>=(int)(400-30
hard)
(1-sqrt(hard_len))) break;

}

/
** 接受键盘输入的上下左右,并以此改变方向 /

if (kbhit())

{

ch=getch();

if (ch==-32)

{

ch=getch();

switch(ch)

{

case 72:

if (dir2 || dir3)

dir=0;

break;

case 80:

if (dir2 || dir3)

dir=1;

break;

case 75:

if (dir0 || dir1)

dir=2;

break;

case 77:

if (dir0 || dir1)

dir=3;

break;

}

}

}

/
前进 /

if (!go_ahead()) break;

/
在最后输出此时长度 ***/

locate(m+2,12);

cout << snake_length;

}

system(“pause”);

return 0;

}


c++小游戏——贪吃蛇的更多相关文章

  1. 第一个windows 小游戏 贪吃蛇

    最近用dx尝试做了一个小的贪吃蛇游戏,代码放到github上面:https://github.com/nightwolf-chen/MyFreakout 说一下自己实现的过程: 首先,我把蛇这个抽象成 ...

  2. JavaScript面向对象编程小游戏---贪吃蛇

    1 面向对象编程思想在程序项目中有着非常明显的优势: 1- 1 代码可读性高.由于继承的存在,即使改变需求,那么维护也只是在局部模块 1- 2 维护非常方便并且成本较低. ​ 2 这个demo是采用了 ...

  3. 用Canvas制作小游戏——贪吃蛇

    今天呢,主要和小伙伴们分享一下一个贪吃蛇游戏从构思到实现的过程~因为我不是很喜欢直接PO代码,所以只copy代码的童鞋们请出门左转不谢. 按理说canvas与其应用是老生常谈了,可我在准备阶段却搜索不 ...

  4. 使用JavaScript实现简单的小游戏-贪吃蛇

    最近初学JavaScript,在这里分享贪吃蛇小游戏的实现过程, 希望能看到的前辈们能指出这个程序的不足之处. 大致思路 首先要解决的问题 随着蛇头的前进,尾巴也要前进. 用键盘控制蛇的运动方向. 初 ...

  5. python【控制台】小游戏--贪吃蛇

    传统贪吃蛇相信大家都玩过,也是一款很老很经典的游戏,今天我们用python控制台实现 项目有很多bug没有解决,因为本人一时兴起写的一个小游戏,所以只是实现可玩部分功能,并没有花较多的时间和精力去维护 ...

  6. 手把手教学h5小游戏 - 贪吃蛇

    简单的小游戏制作,代码量只有两三百行.游戏可自行扩展延申. 源码已发布至github,喜欢的点个小星星,源码入口:game-snake 游戏已发布,游戏入口:http://snake.game.yan ...

  7. Win32小游戏--贪吃蛇

    近日里学习了关于win32编程的相关知识,利用这些知识制作了一款贪吃蛇小游戏,具体细节还是分模块来叙述 前期准备:在网上找到一些贪吃蛇的游戏素材图片,以及具体的逻辑框图 在正式写功能之前,先把一系列环 ...

  8. Java_GUI小游戏--贪吃蛇

    贪吃蛇游戏:是一条蛇在封闭围墙里,围墙里随机出现一个食物,通过按键盘四个光标键控制蛇向上下左右四个方向移动,蛇头撞倒食物,则食物被吃掉,蛇身体长一节,接着又出现食物,等待蛇来吃,如果蛇在移动中撞到墙或 ...

  9. Java经典小游戏——贪吃蛇简单实现(附源码)

    一.使用知识 Jframe GUI 双向链表 线程 二.使用工具 IntelliJ IDEA jdk 1.8 三.开发过程 3.1素材准备 首先在开发之前应该准备一些素材,已备用,我主要找了一个图片以 ...

  10. 用Python实现童年小游戏贪吃蛇

    贪吃蛇作为一款经典小游戏,早在 1976 年就面世了,我最早接触它还是在家长的诺基亚手机中.

随机推荐

  1. Android零基础入门第34节:Android中基于监听的事件处理

    原文:Android零基础入门第34节:Android中基于监听的事件处理 上一期我们学习了Android中的事件处理,也详细学习了Android中基于监听的事件处理,同时学会了匿名内部类形式,那么本 ...

  2. RedHat 7.3+ORACLE 12c RAC 使用udev绑定磁盘

    在RedHat 7中,很多命令发生了改变,其中使用udev对磁盘绑定的命令也发生了变更,不再使用start_udev,而是改为了udevadm,下面具体介绍如何使用udev对磁盘进行绑定,这里对6和7 ...

  3. mysql 的用户权限

    查看MySQL的用户权限 show grants for "username"@'host'; 添加新用户 允许本地IP访问localhost:127.0.0.1 use mysq ...

  4. HUSTOJ的Windows版评判内核(限制内存使用)

    HUSTOJ的Windows版评判内核(一) 作者:游蓝海 个人主页:http://blog.csdn.net/you_lan_hai 2013.4.9 注:最新版本项目地址:https://gith ...

  5. Android零基础入门第70节:ViewPager轻松完成TabHost效果

    上一期学习了ViewPager的简单使用,本期一起来学习ViewPager的更多用法. 相信很多同学都使用过今日头条APP吧,一打开主界面就可以看到顶部有很多Tab,然后通过左右滑动来切换,就可以通过 ...

  6. java基础之super关键字

    一.在java里面,对于super关键字通常有两种用法: 1. 用在子类的构造方法里(初始化用),主要是调用父类的默认构造方法,如果父类有不止一个构造方法,可以通过super指定具体的构造函数,比如 ...

  7. 解决C/C++程序执行一闪而过的方法(使用getchar,或者cin.get,不推荐system(“pause”))

    简述 在VS编写控制台程序的时候,包括使用其他IDE(Visual C++)编写C/C++程序,经常会看到程序的执行结果一闪而过,要解决这个问题,可以在代码的最后加上system(“pause”).g ...

  8. 利用消息机制实现VC与Delphi之间的通讯(发送自定义消息)

    摘要: 本文介绍了使用Windows消息机制实现由不同语言编制的程序之间的相互通讯.联系,并以当前较为流行的两种语言Microsoft Visual C++ 6.0和Borland delphi 5. ...

  9. Microsoft.Ace.OleDb.12.0 操作excel

    在用c#操作excel的时候,碰到了一下的问题: 1.Microsoft.Ace.OleDb.12.0未安装,可以到下载2007 Office system 驱动程序AccessDatabaseEng ...

  10. csdn token

    http://download.csdn.net/download/pp_haitun/9614126 http://dl.download.csdn.net/down11/20160826/28b9 ...