寒假闲的发慌,就顺手找点代码写写。至少写点啥打发打发时间(┑( ̄Д  ̄)┍)。
于是乎,就寻思写个贪吃蛇玩玩。
1.1 具体思路
具体还是参考了《C语言课程设计与游戏开发实践教程》这本书的大体思路。核心思想是通过二维数组来实现地图,小蛇的存储,小蛇的转向,食物的出现等等。其中小蛇的转向通过用数字的变换来实现—用1,2,3,4,5等依次排列的数字表示蛇身,数组存储1的位置代表蛇头,这样就在数组中实现小蛇的存储。
那么,小蛇的转向如何实现呢?
如图,(选自《C语言课程设计与游戏开发实践教程》)
当初看到这里,不得不感慨思路的独特。
1.2具体代码
#ifndef ASNAKE_H_INCLUDED
#define ASNAKE_H_INCLUDED
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include <conio.h>
#include <time.h>
#include <mmsystem.h>//导入声音头文件
#pragma comment(lib,"Winmm.lib")
//解压之后放F盘好了
#define length 28
#define wide 60
#define snake_long 100
//游戏界面
int Play_show[length][wide]={0}; //0表示未使用
char a=69;
using namespace std;
//欢迎界面
class Welcome
{
public:
void Hello()
{
F_hello();
system("pause");//按任意键进行
}
private:
void F_hello(){cout<<"欢迎来到贪吃蛇"<<endl;}
};
//游戏主函数
class Play_snake
{
public:
//1.游戏初始化
void Play_startshow();
//2.游戏行进画面
void Play_menu();
private:
//1.清屏函数
//system("cls");
//2.光标控制函数
void gotoxy(int x,int y);
//3.蛇的构造
//int snake[snake_long]={1,2,3,4,5};//1 2 3 4 5
//4.食物的随机出现
void Play_food();
//5.音乐播放函数
void Play_music();
//6.小蛇的移动函数
void snake_more();
//7.小蛇的死亡函数
//8.游戏结束函数
//9.游戏开关控制变量
int Play_switch=1;//开关控制变量
//10.食物的控制变量
int Play_food_switch=0;//0表示没食物生成,1为有食物生成
//11.长度控制变量
int snake_maxlength=5;
//12.转弯控制变量
//char a=69;
};
//1.游戏初始化
void Play_snake::Play_startshow()
{
//清屏函数
Play_music();
cout<<"游戏开始"<<endl;
system("pause");
//int Play_switch=1;//开关控制变量
system("cls");
gotoxy(0,0);//将光标初始化在0.0
for(int i=0;i<length;i++)
{
Play_show[i][0]=-1;
for(int j=0;j<wide;j++)
{
if(i==0||i==length-1)
Play_show[i][j]=-1;
}
Play_show[i][wide-1]=-1;
cout<<endl;
}
for(int i=0;i<5;i++)
{
Play_show[length/2][wide/2+i]=i+1;//小蛇构建
}
gotoxy(0,0);
//小蛇数组出现在中间//G
system("pause");
//开始游戏
while(Play_switch)
{
Play_menu();
}
system("cls");
system("pause");
cout<<"小蛇死亡"<<endl<<"游戏结束"<<endl;
//游戏退出
}
//2.游戏行进画面
void Play_snake::Play_menu()
{
system("cls");
gotoxy(0,0);
//游戏界面打印G
Play_food();//出现食物
for(int i=0;i<length;i++)
{
for(int j=0;j<wide;j++)
{
if(Play_show[i][j]==-1)//墙
cout<<'#';
else if(Play_show[i][j]==0)//地板
cout<<" ";
else if(Play_show[i][j]==-2)//食物
cout<<'$';
else if(Play_show[i][j]==1)//蛇头
cout<<"@";
else if(Play_show[i][j]>1)//蛇身
cout<<'*';
}
if(i==10)
cout<<"\t"<<"\t"<<"w(小写)向上走";
else if(i==11)
cout<<"\t"<<"\t"<<"a(小写)向左走";
else if(i==12)
cout<<"\t"<<"\t"<<"s(小写)向右走";
else if(i==13)
cout<<"\t"<<"\t"<<"d(小写)向下走";
else if(i==16)
cout<<"\t"<<"\t"<<"得分:"<<snake_maxlength-5;
cout<<endl;
}
Sleep(100);
//小蛇打印G
if(kbhit())
{
a=getch();
}
//这样就不用输入回车了
//cin>>a;
snake_more();
//玩家输入控制小蛇G
//system("pause");
//依次循环G
//如果小蛇死亡,开关语句Play_switch为0;
}
//2.光标控制函数
void Play_snake::gotoxy(int x,int y)
{
HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
COORD pos;
pos.X=x;
pos.Y=y;
SetConsoleCursorPosition(handle,pos);
}
//4.食物的随机出现//M
void Play_snake::Play_food()
{
srand((unsigned)time(NULL));
//随机设置食物
//随机生成的部分不能是小蛇身体部分//G
if(Play_food_switch)
return ;
Play_show[rand()%(length-4)+1][rand()%(length-4)+1]=-2;//食物不能生成在边界
Play_food_switch=1;
}
//5.音乐播放函数
void Play_snake::Play_music()
{
//D:C++工作区\\bin\\sounds\\音乐.wav
//C:\\Users\\夜归人\\Desktop\\C++工作区\\bin\\sounds\\音乐.wav
mciSendString("open D:\\C++工作区\\bin\\sounds\\音乐.wav",NULL,0,NULL);
mciSendString("play D:\\C++工作区\\bin\\sounds\\音乐.wav",NULL,0,NULL);//最后路径改D盘
}
//6.小蛇的移动函数
void Play_snake::snake_more()
{
char ch=a;
if(ch=='w'||ch=='a'||ch=='s'||ch=='d'||ch=='W'||ch=='A'||ch=='S'||ch=='D')
{
for(int i=0;i<length;i++)
{
for(int j=0;j<wide;j++)
{
if(Play_show[i][j]>=1)
Play_show[i][j]=Play_show[i][j]+1;
}
}
}
switch(ch)
{
case 'w':
for(int i=0;i<length;i++)
{
for(int j=0;j<wide;j++)
{
if(Play_show[i][j]==2)
{
if(Play_show[i-1][j]==-1||Play_show[i-1][j]>2)//撞墙
Play_switch=0;
else if(Play_show[i-1][j]==-2)//吃食
{
snake_maxlength++;
Play_food_switch=0;
}
Play_show[i-1][j]=1;
}
else if(Play_show[i][j]==snake_maxlength+1)//去尾
Play_show[i][j]=0;
}
}
break;
case 'a':
for(int i=0;i<length;i++)
{
for(int j=0;j<wide;j++)
{
if(Play_show[i][j]==2)
{
if(Play_show[i][j-1]==-1||Play_show[i][j-1]>2)//撞墙
Play_switch=0;
else if(Play_show[i][j-1]==-2)//吃食
{
snake_maxlength++;
Play_food_switch=0;
}
Play_show[i][j-1]=1;
}
else if(Play_show[i][j]==snake_maxlength+1)//去尾
Play_show[i][j]=0;
}
}
break;
case 's':
for(int i=0;i<length;i++)
{
for(int j=0;j<wide;j++)
{
if(Play_show[i][j]==2)
{
if(Play_show[i+1][j]==-1||Play_show[i+1][j]>2)//撞墙
Play_switch=0;
else if(Play_show[i+1][j]==-2)//吃食
{
snake_maxlength++;
Play_food_switch=0;
}
Play_show[i+1][j]=1;
}
else if(Play_show[i][j]==snake_maxlength+1)//去尾
Play_show[i][j]=0;
}
}
break;
case 'd':
for(int i=0;i<length;i++)
{
for(int j=0;j<wide;j++)
{
if(Play_show[i][j]==2)
{
if(Play_show[i][j+1]==-1||Play_show[i][j+1]>2)//撞墙
Play_switch=0;
else if(Play_show[i][j+1]==-2)//吃食
{
snake_maxlength++;
Play_food_switch=0;
}
Play_show[i][j+1]=1;
}
else if(Play_show[i][j]==snake_maxlength+1)//去尾
Play_show[i][j]=0;
}
}
break;
case 'W':
for(int i=0;i<length;i++)
{
for(int j=0;j<wide;j++)
{
if(Play_show[i][j]==2)
{
if(Play_show[i-1][j]==-1||Play_show[i-1][j]>2)//撞墙
Play_switch=0;
else if(Play_show[i-1][j]==-2)//吃食
{
snake_maxlength++;
Play_food_switch=0;
}
Play_show[i-1][j]=1;
}
else if(Play_show[i][j]==snake_maxlength+1)//去尾
Play_show[i][j]=0;
}
}
break;
case 'A':
for(int i=0;i<length;i++)
{
for(int j=0;j<wide;j++)
{
if(Play_show[i][j]==2)
{
if(Play_show[i][j-1]==-1||Play_show[i][j-1]>2)//撞墙
Play_switch=0;
else if(Play_show[i][j-1]==-2)//吃食
{
snake_maxlength++;
Play_food_switch=0;
}
Play_show[i][j-1]=1;
}
else if(Play_show[i][j]==snake_maxlength+1)//去尾
Play_show[i][j]=0;
}
}
break;
case 'S':
for(int i=0;i<length;i++)
{
for(int j=0;j<wide;j++)
{
if(Play_show[i][j]==2)
{
if(Play_show[i+1][j]==-1||Play_show[i+1][j]>2)//撞墙
Play_switch=0;
else if(Play_show[i+1][j]==-2)//吃食
{
snake_maxlength++;
Play_food_switch=0;
}
Play_show[i+1][j]=1;
}
else if(Play_show[i][j]==snake_maxlength+1)//去尾
Play_show[i][j]=0;
}
}
break;
case 'D':
for(int i=0;i<length;i++)
{
for(int j=0;j<wide;j++)
{
if(Play_show[i][j]==2)
{
if(Play_show[i][j+1]==-1||Play_show[i][j+1]>2)//撞墙
Play_switch=0;
else if(Play_show[i][j+1]==-2)//吃食
{
snake_maxlength++;
Play_food_switch=0;
}
Play_show[i][j+1]=1;
}
else if(Play_show[i][j]==snake_maxlength+1)//去尾
Play_show[i][j]=0;
}
}
break;
default:
break;
}
}
#endif // ASNAKE_H_INCLUDED
#include "asnake.h"
int main()
{
Welcome T;
T.Hello(); //欢迎界面
Play_snake user1;
user1.Play_startshow();
//1.使用循环进行游戏//M
return 0;
}