近期没事翻了一下曾经写的程序。真是不堪入目。曾经真是什么都不懂。只是有一个程序倒是挺有意思的,大二的时候写的一个贪吃蛇游戏。尽管程序非常难看,还有非常多漏洞。但也是这个程序让我真正開始喜欢上了编程。不多说啦。先看看代码。

#include<iostream>
#include<windows.h>
#include<ctime>
#include<cstdlib>
#include<conio.h>
using namespace std;
int n ; //墙的大小,写在这里为了好控制
int foods[2];//食物的横纵坐标
int m=1; //控制速度
void gotoxy(int x,int y)//位置函数,输入坐标后。光标会移动到那个位置以便进行输出
{
COORD pos ;
pos.X=2*x; //由于以下输出的图形都占两个位置
pos.Y=y;
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),pos);//光标控制的位置
}
void color(int a)//颜色函数
{ SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),a);//这样就仅仅有一个參数啦
}
void init(){ //初始化墙 for(int i=0;i<=n;i++)
for(int j=0;j<=n;j++){
gotoxy(i ,j);
if(i==0||i==n||j==0||j==n){
gotoxy(i ,j);
color(10);
cout<<"■";}//围墙
else {
gotoxy(i ,j);
color(3);
cout<<"□" ; }//能够玩的区域 }
} void guize(){
gotoxy(5,8);
color(2);
cout<<"欢迎你玩这款很好玩的贪吃蛇游戏";
gotoxy(5,9);
color(2);
cout<<"此游戏由吕仰铭制作。比較粗糙,请见谅";
gotoxy(n+1,1);
color(12);
cout<<"请按 w,s,a,d 来控制方向";
gotoxy(n+1,2);
color(12);
cout<<"请按空格键暂停";
gotoxy(n+1,3);
color(12);
cout<<"your score:";
Sleep(2000);
gotoxy(5,8);
color(2);
cout<<" ";
gotoxy(5,9);
color(2);
cout<<" "; } void food(){ //果实的生成。用时间做变量
srand((unsigned)time(NULL));
foods[0]=rand()%(n-1)+1;//果实横坐标
foods[1]=rand()%(n-1)+1;//果实的纵坐标 }
int main(){
char again='r'; while(again=='r'){
int err =0 ; //输入必须正确的推断
do{
err++;
if(err>1){
gotoxy(0,0);
cout<<"你输入的范围不正确,请又一次输入";
Sleep(500);
} gotoxy(0,0); cout<<"请设置围墙的宽度,范围是10—25,按enter键确定:";
cin>>n; gotoxy(0,1); cout<<"请设置难度,1-简单 2—中 3—难。按enter键确定:";
cin>>m;
gotoxy(0,0);
cout<<" ";
gotoxy(0,1);
Sleep(200);
cout<<" ";
}
while(n<=9||n>=26||m<=0||m>=4); int ** snake=NULL;//定义一条蛇,用来控制蛇的移动坐标
int score=0;
int tail[2]; //尾巴的横纵坐标
int len=3; //初始蛇的长度
char ch='p'; //用来控制方向的參数
char sh='p'; //用来抑制蛇的反方向移动
int yw=1; //用来推断是否咬到自己
int count=1; //控制关卡
guize(); init();//墙
snake=(int**)realloc(snake,4*len);//为snake申请len长度的4个字节的空间
for (int i=0;i<len;i++)
snake[i]=new int[2];
for(i=0;i<len;i++)
{
snake[i][0]=n/2;
snake[i][1]=n/2+i;
gotoxy(snake[i][0],snake[i][1]);
color(14);
cout<<"★"<<endl;//用★来构成蛇的组成部分
} //这样就形成了一条长度为3的蛇 s1: food(); //生成一个果实
for(i=len-1;i>=0;i--)
if(foods[0]==snake[i][0]&&foods[1]==snake[i][1]) //防止果实长在蛇身上
goto s1;
gotoxy(foods[0],foods[1]);
color(4);
cout<<"●"<<endl;
int zt=0; //用来暂停
while(1)//正式进入游戏阶段
{
tail[0]=snake[len-1][0];//尾巴的横坐标
tail[1]=snake[len-1][1];//尾巴的纵坐标
gotoxy(tail[0],tail[1]);
color(3);
cout<<"□" ;
gotoxy(0,4);
color(10);
cout<<"■";
if(ch!=' ' ){
for(i=len-1;i>0;i--)
{
snake[i][0]=snake[i-1][0];
snake[i][1]=snake[i-1][1];
gotoxy(snake[i][0],snake[i][1]);
color(14);
cout<<"★"<<endl; //前面的一节被后面的一节取代
}
} if(kbhit()) //推断是否有按键按下
{
gotoxy(0,n+2);
ch=getch();
}
if((sh=='a'&&ch=='d')||(sh=='d'&&ch=='a')||(sh=='w'&&ch=='s')||(sh=='s'&&ch=='w')||(ch!='a'&&ch!='w'&&ch!='d'&&ch!='s'&&ch!=' '))
ch=sh; //抑制蛇反向移动
switch(ch) //移动方向
{
case 'w':snake[0][1]--;break;
case 's':snake[0][1]++;break;
case 'a':snake[0][0]--;break;
case 'd':snake[0][0]++;break;
case ' ':break; //按下空格键暂停
}
sh=ch; gotoxy(snake[0][0],snake[0][1]);
color(14);
cout<<"★"<<endl;
Sleep(abs(300/m-0.1*score-5*count));//依据分数的添加会越来越快 if(snake[0][0]==foods[0]&&snake[0][1]==foods[1])//吃掉苹果后蛇分数加1。蛇长加1
{
score+=5; //吃掉果实后分数也对应的添加
len++;
snake=(int**)realloc(snake,4*len);//为snake新申请len长度的4个字节的空间。由于len已经变化
snake[len-1]=new int[2]; s2: food(); //生成新的果实
for(i=len-1;i>=0;i--)
if(foods[0]==snake[i][0]&&foods[1]==snake[i][1]) //防止果实长在蛇身上
goto s2; gotoxy(foods[0],foods[1]);
color(4);
cout<<"●"<<endl; gotoxy(n+7,3);
color(12);
cout<<score<<endl; if(score%50==0)
count++;
color(2*count);
gotoxy(n+2,4);
cout<<"第"<<count<<"关 ";
}
yw=1;
for(i=1;i<len;i++) if(score>=5&&snake[i][1]==snake[0][1]&&snake[i][0]==snake[0][0])//咬到自己
yw=0; if(ch==' ')
zt=score;
if((yw==0&&score>zt)||snake[0][1]==0||snake[0][1]==n||snake[0][0]==0||snake[0][0]==n)//咬到自己或撞到围墙后失败
{
gotoxy(1,n/2);
color(30);
if(score<100)
cout<<"这么快死,真失败。。要加油啊,菜鸟级别"<<endl;
else if(score<200)
cout<<"玩的还不错嘛。继续努力,高手级别"<<endl;
else
cout<<"玩的这么好,简直就是大神级别"<<endl; delete []snake;
Sleep(600);
goto s; } }
s: for(i=0;i<=n;i++)
for(int j=0;j<=n;j++){
gotoxy(i ,j);
cout<<" ";}
gotoxy(1,n/2+1);
color(12);
cout<<"按r键重来。其它键取消:";
gotoxy(13,n/2+1);
color(12);
cin>>again;
system("cls"); } return 0;
}

结果例如以下:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvYWxvcF9kYW95YW4=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">

能够看到。功能是实现了,并且我自己认为还挺好玩的。可是这个程序有几个明显的缺陷:

1.代码实在太丑,各种不正确齐,我自己如今看都认为有点吃力。

2.这个程序仅仅能在visual c++6.0下才干正确执行,其它环境下可能会出现重定义和没有定义等错误。细致看我写的for循环应该就知道怎么回事了

3,好多goto啊,c++本来是要避免goto的,但曾经就是认为好用,并且没认为有什么不妥!

唉,想想曾经的自己是多么的无知啊,只是有位名人不是说过嘛,生活就是不断发现曾经的自己是一个SB的过程,尽管不知道谁说的,只是我想学习也是如此!

贪吃蛇c++实现的更多相关文章

  1. Android快乐贪吃蛇游戏实战项目开发教程-01项目概述与目录

    一.项目简介 贪吃蛇是一个很经典的游戏,也很适合用来学习.本教程将和大家一起做一个Android版的贪吃蛇游戏. 我已经将做好的案例上传到了应用宝,无病毒.无广告,大家可以放心下载下来把玩一下.应用宝 ...

  2. 用C++实现的贪吃蛇游戏

    我是一个C++初学者,控制台实现了一个贪吃蛇游戏. 代码如下: //"贪吃蛇游戏"V1.0 //李国良于2016年12月29日编写完成 #include <iostream& ...

  3. [LeetCode] Design Snake Game 设计贪吃蛇游戏

    Design a Snake game that is played on a device with screen size = width x height. Play the game onli ...

  4. JavaScript-简单的贪吃蛇小游戏

    实现逻辑: //获取Html中的格子(行,列) //建立数组存储所有格子(x,y) //建立数组用于存储蛇身(x,y) //生成随机坐标(x,y)的函数 //随机创建蛇身并存储到蛇身数组 //创建食物 ...

  5. juery实现贪吃蛇的游戏

    今天用juery做了一个贪吃蛇的游戏,代码比较简陋,不过作为这些天学习juery的成果,非常有成就感.另外关于代码内容如有雷同不胜荣幸. 更改了下 让头和身子的颜色不一样 这样好区分些,虽然还是不怎么 ...

  6. HTML 5 背离贪吃蛇 写成了类似于屏幕校准

    中间写了改 改了写 还是没做出自己满意的效果 ,看来自己的确不是一个走前端的料子.当然h5还是学一点好一点 具体说来 就是 在canvas 的画布中 鼠标点击后画上一个圆形 然后就有随机的在画布上面出 ...

  7. 控制台游戏引擎CGE——贪吃蛇

    今天我也来发一个控制台游戏.先看图: 缘起 LZ是一个有严重拖延症的人,表现的形式就是隔一段时间就要刷一刷博客园. 这不前几天,看到了魏大师<使用Lua脚本语言开发出高扩展性的系统...> ...

  8. 原生JS制作贪吃蛇小游戏

    感情都在代码里,来,干了!... <!doctype html> <html> <head> <meta http-equiv="Content-T ...

  9. 基于AT89C51单片机的贪吃蛇电子游戏(仿真)

    有关贪吃蛇的历史发展可以看一下这个网址,贪吃蛇最初的设计和现在并不相同..http://www.techweb.com.cn/internet/2013-02-21/1278055.shtml 该项目 ...

  10. 小菜学习Winform(一)贪吃蛇2

    前言 上一篇<小菜学习Winform(一)贪吃蛇>中实现了简单版的贪吃蛇,在文章末也提到需要优化的地方,比如使用oo.得分模式.速度加快模式和减少界面重绘.因为是优化篇,实现方式上一篇有, ...

随机推荐

  1. 快速掌握C#7

    1. out 变量(out variables) 以前我们使用out变量必须在使用前进行声明,C# 7.0 给我们提供了一种更简洁的语法 “使用时进行内联声明” .如下所示: var input = ...

  2. Android插件化原理解析——Hook机制之动态代理

    转自 http://weishu.me/2016/01/28/understand-plugin-framework-proxy-hook/ 使用代理机制进行API Hook进而达到方法增强是框架的常 ...

  3. sql 系统函数

    --查看表备注SELECT a.column_id AS No, a.name AS 列名, isnull(g.[value],'-') AS 说明 FROM sys.columns a left j ...

  4. 浏览器缓存机制(HTTP缓存机制)

    其机制是根据HTTP报文的缓存标识进行的. 过程:浏览器发起HTTP请求 – 服务器响应该请求.那么浏览器第一次向服务器发起该请求后拿到请求结果,会根据响应报文中HTTP头的缓存标识,决定是否缓存结果 ...

  5. 用 Django2.0 做 简单的BBS(前端用 Bootstrap)

    实现目标: 开发首页显示BBS的标题和摘要,点击BBS的标题可跳转到BBS详细页面进行展示. 开发环境及开发工具: Python 3.6.3 Django 2.0 Pycharm 2017.3 实现过 ...

  6. 读书笔记「Python编程:从入门到实践」_5.if语句

    5.1 一个简单示例 cars = ['audi', 'bmw', 'subaru', 'toyota'] for car in cars: if car == 'bmw': print(car.up ...

  7. 【第二课】kaggle案例分析二

    Evernote Export 推荐系统比赛(常见比赛) 推荐系统分类 最能变现的机器学习应用 基于应用领域分类:电子商务推荐,社交好友推荐,搜索引擎推荐,信息内容推荐等 **基于设计思想:**基于协 ...

  8. PAT_A1115#Counting Nodes in a BST

    Source: PAT A1115 Counting Nodes in a BST (30 分) Description: A Binary Search Tree (BST) is recursiv ...

  9. 函数(day08)

    C语言里可以采用分组的方式管理语句 每个语句分组叫做一个函数 多函数程序执行的时候时间分配情况必须 遵守以下规则 .整个程序的执行时间被划分成几段,每段 时间都被分配给一个函数使用 .不同时间段不能互 ...

  10. 如何快速从数据库获取表属性编写JavaBean

    以前自己对子设计好的数据库将数据库中的表转换为JavaBean,自己还一个一个慢慢打效率真是低,还是老师比较聪明学习学习. 我用的数据库可视化工具是Navicat Premium.UltraEdit( ...