利用空余时间写出了这么一个简单的小游戏,直接使用dos界面运行。那么问题来了,如何让一个字符在dos界面上自由移动???对于这个问题我采用的解决方案是实现gotoxy函数来控制指针位置从而实现字符的移动。那么我们就先来实现这个函数。

gotoxy 函数并非系统函数,我将其储存于 gotoxy.h 的头文件中方便调用。

gotoxy.h

#include <windows.h>
void gotoxy(int x,int y)
{   COORD pos;  pos.X = x - 1;     pos.Y = y - 1;     SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),pos);
}

现在我们已经能够利用 gotoxy 函数对指针进行控制,那么实现字符的移动则只需将原来位置的字符清除,然后利用此函数移动指针到想去的坐标后打印字符即可。

在对此函数进行测试的时候,我发现了一个重要的问题,因为代码是一行一行的运行,那么在等待我输入方向的时候,其他代码是无法执行的,这意味这我的蛇只能是我给一下方向它移动一下,那么该如何使得字符在等待我输出方向的同时自行移动呢???对于这个问题有两个解决方案:一、创建线程(对于当时的我来说线程还很陌生) 二、利用 kbhit() 非阻塞函数(百度一下,你就知道)。当然我选择的是第二个方案,再配合使用 getch() 函数即可完美实现方向的输入。

该游戏的两个难点都解决了,话不多说 ↓

这里主要运用到的知识有这些:结构体,srand(), rand(), kbhit(), getch(), Sleep().

/*******************http://blog.csdn.net/lcsy000**********************/    #include<iostream>
#include"gotoxy.h"
#include<windows.h>
#include<conio.h>
#include<time.h>
using namespace std;
char direction_a,direction_b;  //方向a、b,用于方向的限制
int scores,num,fool_x,fool_y,speed=100; //得分、num用于蛇身起步、食物x坐标、食物y坐标
bool end;    //结束标记
struct node    //蛇身结点
{   int x,y;    node *next;
}*head=NULL,*p,*tail;  void init();    //初始化开始界面
void start();    //游戏开始入场
void init_snake();   //初始化蛇身
void delete_snake();   //删除蛇身
void control();    //方向控制
void move();    //蛇身移动
void limit();    //方向限制
void panduan();    //配合limit限制方向
void fool();    //食物的出现以及食物被吞
void isEnd();    //结束判断
void zhuangwei();   //撞尾判断
void zhuangqiang();   //撞墙判断    int main ()
{   srand((unsigned)time(NULL));    init(); cin>>direction_a; if(direction_a!='y'&&direction_a!='Y')    return 0;   do  {   system("cls");   //清除屏幕   end=false; start();    delete_snake(); init_snake();   scores=0;  num=0; fool_x=(rand() % (79-2+1))+ 2;   fool_y=(rand() % (22-2+1))+ 2;   gotoxy(fool_x,fool_y);  cout<<"0";  direction_a=getch();   while(direction_a!='d'&&direction_a!='s'&&direction_a!='w') direction_a=getch();  while(true) {   if(num&&direction_a!='d'&&direction_a!='s'&&direction_a!='w'&&direction_a!='a') {   direction_a=direction_b;   }   control();  fool(); Sleep(speed);   if(kbhit())   //kbhit 非阻塞函数 {   direction_a=getch(); //使用 getch 函数获取键盘输入   limit();    }   panduan();  num=1; zhuangqiang();  zhuangwei();    if(end) break;  }   }while(direction_a=='y'||direction_a=='Y'); return 0;
}
void init()
{   gotoxy(35,8);   cout<<"★贪 吃 蛇★";    gotoxy(36,10);  cout<<"开始请输入y:";
}
void start()
{   for(int i=0;i<=79;i++)   {   Sleep(10);  cout<<"*";  gotoxy(i+1,24);    cout<<"*";  gotoxy(i+2,1); }   gotoxy(1,2);    for(int i=0;i<=21;i++)   {   Sleep(20);  cout<<"*";  for(int j=0;j<=77;j++) cout<<" ";    cout<<"*";  }
}
void init_snake()
{   int n=3;   head=new node; tail=head; head->x=40; head->y=12; while(n--)  {   p=new node;    tail->next=p;   p->x=tail->x-1;  p->y=tail->y;    tail=p;    }   tail->next=NULL;    node *q=head->next; gotoxy(head->x,head->y);  cout<<'#';  while(q!=NULL) {   gotoxy(q->x,q->y);    cout<<'*';  q=q->next;  }
}
void delete_snake()
{   while(head!=NULL)  {   node *q=head;  head=q->next;   delete q;   }
}
void move()
{   gotoxy(tail->x,tail->y);  cout<<" ";  gotoxy(head->next->x,head->next->y);    cout<<'*';  gotoxy(head->x,head->y);  cout<<'#';  node *q=tail;  tail=head; while(tail->next!=q)    {   tail=tail->next;    }   tail->next=NULL;    delete q;
}
void control()
{   node *q=new node;  q->next=head;   q->x=head->x;    q->y=head->y;    head=q;    switch(direction_a) {   case 'w': head->y--;break; case 's': head->y++;break;   case 'a': head->x--;break; case 'd': head->x++;break;   default : break;    }   move();
}
void limit()
{   if(direction_b=='s'&&direction_a=='w') direction_a='s';  if(direction_b=='w'&&direction_a=='s') direction_a='w';  if(direction_b=='a'&&direction_a=='d') direction_a='a';  if(direction_b=='d'&&direction_a=='a') direction_a='d';
}
void panduan()
{   if(direction_a=='s') direction_b='s';    if(direction_a=='w') direction_b='w';    if(direction_a=='d') direction_b='d';    if(direction_a=='a') direction_b='a';
}
void fool()
{   node *q;    if(head->x==fool_x&&head->y==fool_y)  {   fool_x=(rand() % (79-2+1))+ 2;   fool_y=(rand() % (22-2+1))+ 2;   gotoxy(fool_x,fool_y);  cout<<"0";  num=0; scores++; node *q=new node;  q->x=tail->x;    q->y=tail->y;    tail->next=q;   tail=q;    tail->next=NULL;    }   q=head;    while(q!=NULL) {   if(q->x==fool_x&q->y==fool_y) {   fool_x=(rand() % (79-2+1))+ 2;   fool_y=(rand() % (22-2+1))+ 2;   gotoxy(fool_x,fool_y);  cout<<"*";  q=head;    continue;   }   q=q->next;  }
}
void isEnd()
{   end=true;  Sleep(600); system("cls");    gotoxy(35,8);   cout<<"您 输 啦 ~";    gotoxy(33,10);  cout<<"您的分数为: "<<scores;  gotoxy(31,12);  cout<<"重新开始请输入y:";  cin>>direction_a;
}
void zhuangwei()
{   node *q=head->next; while(q!=NULL) {   if(head->x==q->x&&head->y==q->y)    {   isEnd();    break;  }   q=q->next;  }
}
void zhuangqiang()
{   if(head->x==80||head->x==1||head->y==24||head->y==1)    isEnd();
}

效果图:

由于考虑到游戏的各种 BUG 故自定义函数很多,有兴趣的朋友可以自行改动一些函数对比效果。

它,

不仅仅是一个码

扫码关注

C++资源免费送

利用C/C++实现较完整贪吃蛇游戏相关推荐

  1. 贪吃蛇c++语言程序,利用C/C++实现较完整贪吃蛇游戏

    记得在大一时刚学习c/c++语言,学到一半突然想用这门语言做一些小游戏出来,首先想到的便是贪吃蛇.于是本人利用空余时间写出了这么一个简单的小游戏. 由于当时的我还没有能力构造出用户界面,故直接使用do ...

  2. 利用python实现简易版的贪吃蛇游戏(面向python小白)

    前言 这篇文章主要给大家介绍了关于如何利用python实现简易版的贪吃蛇游戏的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学 ...

  3. python贪吃蛇最简单代码_利用python实现简易版的贪吃蛇游戏(面向python小白)

    引言 作为python 小白,总是觉得自己要做好百分之二百的准备,才能开始写程序.以至于常常整天在那看各种语法教程,学了几个月还是只会print('hello world'). 这样做效率太低,正确的 ...

  4. 结对-贪吃蛇游戏-开发环境搭建过程

    结对编程成员:赵建辉,马壮 搭建环境: 会 html,css,以及java开发知识. 会应用sublime,dw等编辑软件 编写程序阶段: 1.利用html搭建前端页面,构建游戏的页面框架 2.利用j ...

  5. 利用OpenGL设计贪吃蛇游戏

    利用OpenGL设计贪吃蛇游戏 文章目录 利用OpenGL设计贪吃蛇游戏 任务介绍 游戏玩法 开发环境 游戏实现 贪吃蛇游戏的框架搭建 主程序 游戏类 游戏对象类 工具类 着色器类 摄像机类 精灵渲染 ...

  6. PAOGD个人作业4——利用OpenGL设计贪吃蛇游戏

    中山大学数据科学与计算机学院本科生实验报告 (2019年春季学期) 课程名称 PAOGD 任课老师 郑贵锋 年级 16 专业(方向) 软件工程(计算机应用方向) 学号 16340132 姓名 梁颖霖 ...

  7. 完整!贪吃蛇游戏c语言代码分享(包括界面,计数,提示)

    最近看到身边有些朋友抱怨,网上的贪吃蛇项目完整源码太少,或者说运行不了,甚至还有花钱购买的情况,作为你们的过来人,学长了解你们期末考试的苦,今天的博客我就不啰嗦,我直接放代码给你们. 所有功能都实现了 ...

  8. php贪吃蛇游戏代码下载,JS实现的贪吃蛇游戏完整实例

    本文实例讲述了JS实现的贪吃蛇游戏.分享给大家供大家参考,具体如下: 思想: 1.设计蛇:属性有宽.高.方向.状态(有多少节),方法:显示,跑 2.设计食物:属性宽.高 3.显示蛇:根据状态向地图里加 ...

  9. 如何用python开发一个贪吃蛇游戏_教你一步步利用python实现贪吃蛇游戏

    教你一步步利用python实现贪吃蛇游戏 来源:中文源码网    浏览: 次    日期:2019年11月5日 [下载文档:  教你一步步利用python实现贪吃蛇游戏.txt ] (友情提示:右键点 ...

最新文章

  1. Android setOnPageChangeListener 过时了怎么办?
  2. Spark Streaming之:Flume监控目录下文件内容变化,然后Spark Streaming实时监听Flume,然后从其上拉取数据,并计算出结果
  3. 细胞自动机 通用计算机,细胞自动机
  4. 蓝桥杯第八届省赛JAVA真题----迷宫
  5. 一个5g基站的覆盖范围有多大,有没有4g的大?
  6. Python、Go、JavaScript、Rust 将长盛 5 年!
  7. 如何创建免费的Hyper-V Server故障转移集群
  8. iOS开发-当APP涉及到用户敏感信息适配Xcode9及(ios11)
  9. android viewflipper 动画,Android自定义ViewFlipper实现滚动效果
  10. matlab2010反复激活
  11. Unity 3D中实现敌人追踪
  12. 系统集成---合同法、著作权法、招标投标实施条例+政府采购法实施条例
  13. DataTable 列转行
  14. 上篇日本人经营之道 一制造轰动效应出奇制胜
  15. 排序算法的稳定性和在位性
  16. 【腾讯Bugly干货分享】程序员们也该知道的事——“期权和股票”
  17. 会声会影X7安装中的问题
  18. 三星I9220一键刷机 安卓手机
  19. python干货三例(需基础)
  20. 如何分辨基金是否为量化基金?

热门文章

  1. Java:将JDBC ResultSet作为JSON流式传输
  2. intent隐式和显式_Neo4j:使隐式关系成为显式和双向关系
  3. 如何测试Java类的线程安全性
  4. JSP,JSF和EL简介
  5. idea 编写javafx_用JavaFX编写图块引擎
  6. 将自定义功能添加到Spring数据存储库
  7. maven jpa_使用Hibernate 4,JPA和Maven的架构创建脚本
  8. netbeans7.4_NetBeans 7.1:创建自定义提示
  9. 用Java创建自己的AOP
  10. ChoiceFormat:数字范围格式