借鉴了很多网上大神们的代码,给了我思路和制作方法。
这个版本是最为简单的贪吃蛇,单纯在运行框中运行。最为基础的。
这个版本还有一个问题,由于每次都要刷新屏幕,结果屏幕一闪一闪的,特别不舒服。现在正在努力改进中
#include<iostream>
#include<windows.h>
#include<time.h>
#include<conio.h>
using namespace std;
int i,j,dengji,speed,grade,fenshu,head,weiba;
void shuaxin(char ditu[22][22])
{
system("cls");
for(i=0;i<22;i++)
{
cout<<" ";
for(j=0;j<22;j++)
cout<<ditu[i][j]<<" ";
if(i==0)
cout<<"你现在的等级为:"<<dengji;
if(i==3)
cout<<"自动前进时间间隔为"<<speed;
if(i==6)
cout<<"你的得分为"<<fenshu;
cout<<endl;
}
}
int main()
{
//地图绘制
//这一部分是地图的构建
char ditu[22][22]; // 贪吃蛇棋盘是一个二维数组(如22*22,包括墙壁)
int i,j;
for(i=1;i<=20;i++)
for(j=1;j<=20;j++)
ditu[i][j]=' '; // 初始化贪吃蛇棋盘中间空白部分
for(i=0;i<=20;i++)
ditu[0][i] = ditu[21][i] = '-'; //初始化贪吃蛇棋盘上下墙壁
for(i=1;i<=28;i++)
ditu[i][0] = ditu[i][21] = '|'; //初始化贪吃蛇棋盘左右墙壁
//蛇的绘制
int x_she[100],y_she[100];//分别代表x和y的坐标
for(i=0;i<4;i++) //初始长度为4
{
x_she[i]=1;//都在第一行
y_she[i]=i+1; //横着排
}
head=3;
weiba=0;//头和尾巴的位置,方便以后进行移动!!!!
for(i=1;i<=3;i++)
ditu[1][i]='*'; //以下两行则是在地图上实现蛇的初始位置
ditu[1][4]='#';
//食物的自动生成
int x1,y1;
srand(time(0));//产生随机数
do
{
x1=rand()%22+1; //随机产生的数对地图取余再加1;
y1=rand()%22+1;
}while(ditu[x1][y1]!=' '); //直到合理位置
ditu[x1][y1]='*'; //在地图上表现;
//开始
int speed;
cout<<"请选择难度\n1:简单\n2:中等\n3:困难\n4:炼狱\n";
cin>>speed;
if(speed==1)
speed=100;
else if(speed==2)
speed=400;
else if(speed==3)
speed=200;
else if(speed==4)
speed=1;
cout<<"\n\n\t\t贪吃蛇游戏即将开始 !"<<endl;
long start;
int dengji=1;//初始等级
int length=4;//初始长度
//开始倒计时
for(i=3;i>=0;i--)//i就是倒计时
{
start=clock();
while(clock()-start<=1000); //刷新页面的倒计时
system("cls");
if(i>0)
cout<<"\n\n\t\t进入倒计时:"<<i<<endl;
else
shuaxin(ditu); //刷新页面,打印地图
}
/正式开始操作
int timeover;
char direction=77;//默认向右出发
int x,y;
while(1)
{
timeover=1;
start=clock(); //随机产生
while((timeover=(clock()-start<=speed))&&!kbhit());//时间超过了游戏速度,则自动前进
if(timeover)
{
getch(); //不需要回车键的输入,用来操作游戏
direction=getch();//!!一定要赋值
}
switch(direction)
{
case 72: x= x_she[head]-1; y= y_she[head];break; // 向上
case 80: x= x_she[head]+1; y= y_she[head];break; // 向下
case 75: x= x_she[head]; y= y_she[head]-1;break; // 向左
case 77: x= x_she[head]; y= y_she[head]+1; //默认向右
}
if(!(direction==72||direction==80||direction==75 ||direction==77))
{ // 按键非方向键
cout << "\tGame over!" << endl;return 0;
}
if(x==0 || x==21 ||y==0 || y==21)
{ // 碰到墙壁
cout << "\tGame over!" << endl;return 0;
}
if(ditu[x][y]!=' '&&!(x==x1&&y==y1))
{ // 蛇头碰到蛇身
cout << "\tGame over!" << endl;return 0;
}
if(x==x1&&y==y1) //吃到了食物
{
fenshu++;
length++;
if(length>=8)
{
length=length-8;
if(speed>=200)
speed=550-grade*50;
}
ditu[x][y]='#';//食物那个位置变成了头!
ditu[x_she[head]][y_she[head]]='*';//原来头的位置变成了身子
head=(head+1)%100; //头的位置刷新一下
x_she[head]=x;
y_she[head]=y;
do //在产生一个食物,方便刷新地图时一起出现
{
x1=rand()%20+1;
y1=rand()%20+1;
}while(ditu[x1][y1]!=' ');
ditu[x1][y1]='*';
shuaxin(ditu);
}
else//没有吃到米,这个时很重要很重要的一部分.解答一个疑惑,很多人不明白为什么
//转了弯,身子会沿着头的方向走,下面就是答案。因为头就是下一个的身子,一个连着一个
//顺序不会变
{
ditu[x_she[weiba]][y_she[weiba]]=' '; //前进了一步
weiba=(weiba+1)%100; //刷新尾巴
ditu[x_she[head]][y_she[head]]='*'; //头变成了身子
head=(head+1)%100; //刷新尾巴
x_she[head]=x;//更新头
y_she[head]=y;
ditu[x_she[head]][y_she[head]]='#';
shuaxin(ditu);
}
}
}