利用C/C++实现较完整贪吃蛇游戏
利用空余时间写出了这么一个简单的小游戏,直接使用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++实现较完整贪吃蛇游戏相关推荐
- 贪吃蛇c++语言程序,利用C/C++实现较完整贪吃蛇游戏
记得在大一时刚学习c/c++语言,学到一半突然想用这门语言做一些小游戏出来,首先想到的便是贪吃蛇.于是本人利用空余时间写出了这么一个简单的小游戏. 由于当时的我还没有能力构造出用户界面,故直接使用do ...
- 利用python实现简易版的贪吃蛇游戏(面向python小白)
前言 这篇文章主要给大家介绍了关于如何利用python实现简易版的贪吃蛇游戏的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学 ...
- python贪吃蛇最简单代码_利用python实现简易版的贪吃蛇游戏(面向python小白)
引言 作为python 小白,总是觉得自己要做好百分之二百的准备,才能开始写程序.以至于常常整天在那看各种语法教程,学了几个月还是只会print('hello world'). 这样做效率太低,正确的 ...
- 结对-贪吃蛇游戏-开发环境搭建过程
结对编程成员:赵建辉,马壮 搭建环境: 会 html,css,以及java开发知识. 会应用sublime,dw等编辑软件 编写程序阶段: 1.利用html搭建前端页面,构建游戏的页面框架 2.利用j ...
- 利用OpenGL设计贪吃蛇游戏
利用OpenGL设计贪吃蛇游戏 文章目录 利用OpenGL设计贪吃蛇游戏 任务介绍 游戏玩法 开发环境 游戏实现 贪吃蛇游戏的框架搭建 主程序 游戏类 游戏对象类 工具类 着色器类 摄像机类 精灵渲染 ...
- PAOGD个人作业4——利用OpenGL设计贪吃蛇游戏
中山大学数据科学与计算机学院本科生实验报告 (2019年春季学期) 课程名称 PAOGD 任课老师 郑贵锋 年级 16 专业(方向) 软件工程(计算机应用方向) 学号 16340132 姓名 梁颖霖 ...
- 完整!贪吃蛇游戏c语言代码分享(包括界面,计数,提示)
最近看到身边有些朋友抱怨,网上的贪吃蛇项目完整源码太少,或者说运行不了,甚至还有花钱购买的情况,作为你们的过来人,学长了解你们期末考试的苦,今天的博客我就不啰嗦,我直接放代码给你们. 所有功能都实现了 ...
- php贪吃蛇游戏代码下载,JS实现的贪吃蛇游戏完整实例
本文实例讲述了JS实现的贪吃蛇游戏.分享给大家供大家参考,具体如下: 思想: 1.设计蛇:属性有宽.高.方向.状态(有多少节),方法:显示,跑 2.设计食物:属性宽.高 3.显示蛇:根据状态向地图里加 ...
- 如何用python开发一个贪吃蛇游戏_教你一步步利用python实现贪吃蛇游戏
教你一步步利用python实现贪吃蛇游戏 来源:中文源码网 浏览: 次 日期:2019年11月5日 [下载文档: 教你一步步利用python实现贪吃蛇游戏.txt ] (友情提示:右键点 ...
最新文章
- Android setOnPageChangeListener 过时了怎么办?
- Spark Streaming之:Flume监控目录下文件内容变化,然后Spark Streaming实时监听Flume,然后从其上拉取数据,并计算出结果
- 细胞自动机 通用计算机,细胞自动机
- 蓝桥杯第八届省赛JAVA真题----迷宫
- 一个5g基站的覆盖范围有多大,有没有4g的大?
- Python、Go、JavaScript、Rust 将长盛 5 年!
- 如何创建免费的Hyper-V Server故障转移集群
- iOS开发-当APP涉及到用户敏感信息适配Xcode9及(ios11)
- android viewflipper 动画,Android自定义ViewFlipper实现滚动效果
- matlab2010反复激活
- Unity 3D中实现敌人追踪
- 系统集成---合同法、著作权法、招标投标实施条例+政府采购法实施条例
- DataTable 列转行
- 上篇日本人经营之道 一制造轰动效应出奇制胜
- 排序算法的稳定性和在位性
- 【腾讯Bugly干货分享】程序员们也该知道的事——“期权和股票”
- 会声会影X7安装中的问题
- 三星I9220一键刷机 安卓手机
- python干货三例(需基础)
- 如何分辨基金是否为量化基金?