[010]转+修正---C++的贪吃蛇程序(未用面向对象封装)
在网上看到一段贪吃蛇程序,自己心痒下了下来又稍微做了一点修改。
没有用面向对象的方式来进行封装,下次准备试试。
需要在windows环境下进行编译
- #include<iostream>
- #include<windows.h>
- #include<conio.h>
- #include<time.h>
- #include<stdlib.h>
- using namespace std;
- #define COUT cout<<"■"
- #define MOVE_UP 1
- #define MOVE_LEFT 2
- #define MOVE_DOWN 3
- #define MOVE_RIGHT 4
- struct Body {
- int x,y;
- Body *next;
- };
- int Food=,Food_x,Food_y,Direction=MOVE_RIGHT,Grade,Score=;
- // 定义蛇的头部
- Body *body001=new Body[sizeof(Body)];
- // 在指定位置输出需要显示的字符
- void Position(int x,int y) {
- // 定位坐标
- COORD pos={y-,x-};
- // 把字符输出到屏幕(命令行)
- HANDLE Out=GetStdHandle(STD_OUTPUT_HANDLE);
- // 定位光标位置
- SetConsoleCursorPosition(Out,pos);
- }
- // 初始化蛇开始时的数量(4)
- void CreatSneak() {
- // 定义初始状态蛇头后的三个身体
- Body *body002=new Body[sizeof(Body)];
- Body *body003=new Body[sizeof(Body)];
- Body *body004=new Body[sizeof(Body)];
- // 固定初始状态的蛇的位置
- body001->x=;body001->y=;
- body002->x=;body002->y=;
- body003->x=;body003->y=;
- body004->x=;body004->y=;
- // 初始状态的蛇连接(最后一个蛇身体指向即将被连接的身体)
- body001->next=body002;
- body002->next=body003;
- body003->next=body004;
- body004->next=NULL;
- }
- // 创建游戏的框体
- void Prt_Map() {
- int i;
- for(i=;i<=;i+=) {
- Position(,i);COUT;
- Position(,i);COUT;
- }//x:2~23 共22个
- for(i=;i<=;i++) {
- Position(i,);COUT;
- Position(i,);COUT;//y:3~55共27个
- Position(i,);COUT;
- }
- }
- // 创建右侧的分数和选取的速度级别
- void Prt_Sneak() {
- // 定义蛇并使其指向蛇头
- Body *p;
- p=body001;
- // 通过循环不断指向下一个指针指向的位置来实现蛇的移动
- while(p!=NULL) {
- Position(p->x,p->y);COUT;
- p=p->next;
- }
- Position(Food_x,Food_y);COUT;
- // 实时分数
- Position(,);cout<<"Score: "<<Score;
- // 选取的速度级别
- Position(,);cout<<"Grade: "<<Grade;
- }
- // 是否有异常的操作导致游戏结束
- int JudgeOver() {
- Body *p;
- p=body001->next;
- // 如果蛇碰到边框,则游戏结束
- if(body001->y==||body001->y==||body001->x==||body001->x==){
- return ;
- }
- // 如果没有碰到自身,那么正常执行
- while(!(p->x==body001->x&&p->y==body001->y)) {
- if(p->next==NULL) {
- return ;
- }
- p=p->next;
- }
- // 碰到自身,游戏结束
- return ;
- }
- // 创建贪吃蛇的下一个食物
- void Creat_Food() {
- // 如果页面上没有食物,则创建
- if(Food==) {
- // 用当前的时间值来作为随机数种子,在随机位置定义
- srand((int)time());
- // 取随机数定义食物的横轴,后面的数操作是确保生成的食物在游戏框体内
- Food_x=rand()%+;
- int temp=rand()%+;
- // 定义食物的竖轴
- if(temp%==) {
- Food_y=temp+;
- }
- else {
- Food_y=temp;
- }
- Food=;
- }
- }
- // 操作贪吃蛇随着键盘的移动而移动
- void Move() {
- Body *p=new Body[sizeof(Body)],*q,*temp=new Body[sizeof(Body)];
- // 向上
- if(Direction==MOVE_UP) {
- if(body001->x==(Food_x+)&&body001->y==Food_y) {
- temp->x=Food_x;temp->y=Food_y;temp->next=body001;body001=temp;Food=;Score+=;
- }
- else {
- temp->x=body001->x-;temp->y=body001->y;temp->next=body001;body001=temp;
- q=body001;
- while((q->next)->next!=NULL)q=q->next;
- Position((q->next)->x,(q->next)->y);cout<<" ";
- delete(q->next); q->next=NULL;
- }
- }
- // 向左
- if(Direction==MOVE_LEFT) {
- if(body001->x==Food_x&&body001->y==(Food_y+)) {
- temp->x=Food_x;temp->y=Food_y;temp->next=body001;body001=temp;Food=;Score+=;
- }
- else {
- temp->x=body001->x;temp->y=body001->y-;temp->next=body001;body001=temp;
- q=body001;
- while((q->next)->next!=NULL)q=q->next;
- Position((q->next)->x,(q->next)->y);cout<<" ";
- delete(q->next); q->next=NULL;
- }
- }
- // 向下
- if(Direction==MOVE_DOWN) {
- if(body001->x==(Food_x-)&&body001->y==Food_y) {
- temp->x=Food_x;temp->y=Food_y;temp->next=body001;body001=temp;Food=;Score+=;
- }
- else {
- temp->x=body001->x+;temp->y=body001->y;temp->next=body001;body001=temp;
- q=body001;
- while((q->next)->next!=NULL)q=q->next;
- Position((q->next)->x,(q->next)->y);cout<<" ";
- delete(q->next); q->next=NULL;
- }
- }
- // 向右
- if(Direction==MOVE_RIGHT) {
- if(body001->x==Food_x&&body001->y==(Food_y-)) {
- temp->x=Food_x;temp->y=Food_y;temp->next=body001;body001=temp;Food=;Score+=;
- }
- else{
- temp->x=body001->x;temp->y=body001->y+;temp->next=body001;body001=temp;
- q=body001;
- while((q->next)->next!=NULL)q=q->next;
- Position((q->next)->x,(q->next)->y);cout<<" ";
- delete(q->next); q->next=NULL;
- }
- }
- }
- // 执行游戏
- void Game() {
- while() {
- // 如果游戏失败,返回
- if(JudgeOver()==) {
- return;
- }
- // 键盘操作光标键上
- if(GetAsyncKeyState(VK_UP)&&Direction!=MOVE_DOWN) {
- Direction=MOVE_UP;
- }
- // 键盘操作光标键左
- if(GetAsyncKeyState(VK_LEFT)&&Direction!=MOVE_RIGHT) {
- Direction=MOVE_LEFT;
- }
- // 键盘操作光标键下
- if(GetAsyncKeyState(VK_DOWN)&&Direction!=MOVE_UP) {
- Direction=MOVE_DOWN;
- }
- // 键盘操作光标键右
- if(GetAsyncKeyState(VK_RIGHT)&&Direction!=MOVE_LEFT) {
- Direction=MOVE_RIGHT;
- }
- // 创建贪吃蛇的下一个食物
- Creat_Food();
- // 取得贪吃蛇随着键盘的移动而移动的坐标
- Move();
- // 移动蛇
- Prt_Sneak();
- // 根据输入的速度,决定程序执行挂起的时间,以便得到移动速度
- Sleep(-Grade*);
- }
- }
- void main() {
- Position(,);
- cout<<"Plese Select Grade:[1~10]";
- // 输入蛇的运行速度
- cin>>Grade;
- // 限制速度在1~10
- if(Grade<||Grade>) {
- system("cls");
- Position(,);
- cout<<"Wrong Grade!"<<endl;
- return;
- }
- // 清除屏幕上的显示信息
- system("cls");
- // 创建初始状态的蛇
- CreatSneak();
- // 创建并显示游戏的框体
- Prt_Map();
- // 定义蛇的移动,创建右侧的分数和选取的速度级别
- Prt_Sneak();
- // 运行游戏
- Game();
- system("cls");
- Position(,);
- // 如果满屏,则输出成功,反之则输出失误
- if (Score >= ) {
- cout<<"You Win !"<<endl;
- } else {
- cout<<"You Lost !"<<endl;
- }
- Position(,);
- cout<<"You Got "<<Score<<" Scores"<<endl;
- Position(,);
- getch();
- }
[010]转+修正---C++的贪吃蛇程序(未用面向对象封装)的更多相关文章
- 一个简单的c# 贪吃蛇程序
一个简单的c#贪吃蛇程序 程序分为界面设计和程序设计:界面设计和程序设计均参考了一些游戏实例,但是所有代码内容是本人编写. 由于看到别人写的程序并没有署名,这里的署名全部都是csdn官网. 游戏界面设 ...
- C#简单实现贪吃蛇程序(LinQ + Entity)
做梦想起来的C#简单实现贪吃蛇程序(LinQ + Entity) 最近一直在忙着单位核心开发组件的版本更新,前天加了一个通宵,昨天晚上却睡不着,脑子里面突然不知怎的一直在想贪吃蛇的实现方法.以往也有类 ...
- 做梦想起来的C#简单实现贪吃蛇程序(LinQ + Entity)
最近一直在忙着单位核心开发组件的版本更新,前天加了一个通宵,昨天晚上却睡不着,脑子里面突然不知怎的一直在想贪吃蛇的实现方法.以往也有类似的情况,白天一直想不通的问题,晚上做梦有时会想到更好的版本,于是 ...
- Java小游戏贪吃蛇
package snake; import java.awt.BorderLayout;import java.awt.Canvas;import java.awt.Color;import java ...
- UI创意求助:手机贪吃蛇游戏方向控制键设计
继上一片博文<做梦想起来的C#简单实现贪吃蛇程序(LinQ + Entity)>之后,尝试做一个手机版本,大部分的功能都已经实现了.但在贪吃蛇的方向控制设计上一直不太满意.由于手机界面的大 ...
- 关于用Java写的贪吃蛇游戏的一些感想
学习Java有那么一个月了,兴趣还是挺高的.然而最近老师布置的一个迷宫问题,着实让我头疼了一两个礼拜,以至于身心疲惫,困扰不安.无奈,暂且先放下这个迷宫问题,写个简单点的贪吃蛇程序,以此来提高低落的情 ...
- 如何用Python写一个贪吃蛇AI
前言 这两天在网上看到一张让人涨姿势的图片,图片中展示的是贪吃蛇游戏, 估计大部分人都玩过.但如果仅仅是贪吃蛇游戏,那么它就没有什么让人涨姿势的地方了. 问题的关键在于,图片中的贪吃蛇真的很贪吃XD, ...
- Devc++贪吃蛇
使用Devc++写的一个简单版贪吃蛇程序,不过,在未配置之前,是不包含图形库的,所以需要自己配置新的环境 ----------------------------------------------- ...
- html5面向对象做一个贪吃蛇小游戏
canvas加面向对象方式的贪吃蛇 2016-08-25 这个小游戏可以增加对面向对象的理解,可以加强js逻辑能力,总之认真自己敲一两遍收获还是不少啊!!适合刚学canvas的同学练习!! 废话不多说 ...
随机推荐
- Java [leetcode 33]Search in Rotated Sorted Array
题目描述: Suppose a sorted array is rotated at some pivot unknown to you beforehand. (i.e., 0 1 2 4 5 6 ...
- jwplayer 网页在线播放插件
1.到官网 https://www.jwplayer.com/ 注册,取得key并下载免费版本(免费版只支持mp4格式): 2.编辑如下网页即可在线播放: <!DOCTYPE html> ...
- Android 自动换行流式布局的RadioGroup
效果图 用法 使用FlowRadioGroup代替RadioGroup 代码 import android.content.Context; import android.util.Attribute ...
- ClassLoader工作机制
阅读目录 一.ClassLoader概念 二.JVM平台提供三层classLoader 三.JVM加载class文件到内存有两种方式 四.ClassLoader加载类的过程 五.自定义类加载器 六.实 ...
- 文件上传利器JQuery上传插件Uploadify
在做日常项目中,经常在后台需要上传图片等资源文件,之前使用过几次这个组件,感觉非常好用 ,但是每次使用的时候都是需要经过一番查阅,所以还不如记住在这里,以后使用的时候就翻翻. 他的官方网站如下:htt ...
- CPU affinity 进程和线程的亲缘性
设置Processor Affinity 作用: 1.进程和线程的亲缘性(affinity),使进程或线程在指定的CPU(核)上运行.(比如程序A,在第4个核心上运行) 2.设置进程 或者 线程, 使 ...
- Webdriver API (二)
(转载) 1.3 打开测试页面 对页面对测试,首先要打开被测试页面的地址(如:http://www.google.com),web driver 提供的get方法可以打开一个页面: // And no ...
- Oracle函数:求两个数的最小公倍数
CREATE or replace function GetGbs(num1 NUMBER,num2 NUMBER) RETURN NUMBER is resultnum NUMBER; maxnum ...
- android 实现模拟按键
android 实现模拟按键方法一 通过Runtime实现,代码如下: try { String keyCommand = "input keyevent " + KeyEvent ...
- 【原】Storm 守护线程容错机制
Storm入门教程 1. Storm基础 Storm Storm主要特点 Storm基本概念 Storm调度器 Storm配置 Guaranteeing Message Processing(消息处理 ...