#include<iostream>
#include<time.h>
#include<conio.h>
#include<cstdio>
#include<stdlib.h>
using namespace std;
const int height = 30;
//游戏界面高度为30个|
const int width = 60;
//游戏界面宽度为60个—
const int duration = 1000;
//运行1千次用1秒钟 10^3 ==1s,表示游戏界面更新的时间间隔
class Map {
public:
void snailSet() {
for (l = 0; l <= 4; l++) {
snail[0][l] = 2; //贪吃蛇在第二行
snail[1][l] = l+1;//贪吃蛇在一到五列
}
head = 4;//蛇头在snail数组中的位置为snail[][4]
hail = 0;//蛇尾在snail数组中的位置为snail[][0]
}
//对贪吃蛇的位置信息进行初定义;
void foodSet() {
if (foodeat) {
//只有当界面没有食物时才设置食物
do {
srand(time(NULL));
//time函数记录运行的时间,使用#include<time.h>头文件,
//srand()产生随机数种子,使用#include<stdlib.h>头文件
foodx = rand() % (height - 1) + 1;
//产生0到height-2的数,再加1,即1到height-1,在边界之内
foody = rand() % (width - 1) + 1;
//产生0到width-2的数,再加1,即1到width-1,在边界之内
} while (map[foodx][foody] == '#' || map[foodx][foody] == '*');
//如果食物的设置不与蛇身重合,则确定这个食物的位置
foodeat = 0;
//食物被设置之后,无法再设置食物
}
}
//食物的设置(ok)
void dictionSet() {
timeover = 1;
start = clock();
while ( (timeover = (clock() - start <duration))
&& !(_kbhit())
);
//没按方向键按原来的方向,按了方向键取改变方向;
if (timeover) {
_getch();
diction = _getch();
cout << diction << endl;
}
if (diction == 27) { system("pause"); /*_exit(0);*/ }
//按了ESC键退出;
}
//处理贪吃蛇运动选择;
void headSet() {
{
if (diction == 77) { heady = snail[1][head]+1; }
//75代表向上; 蛇头的横坐标不变,纵坐标加一
if (diction == 75) { heady = snail[1][head]-1; }
//77代表向下; 蛇头的横坐标不变,纵坐标减一
if (diction == 72) { headx = snail[0][head]-1; }
//80代表向左; 蛇头的横坐标减一,纵坐标不变
if (diction == 80) { headx = snail[0][head]+1; }
//72代表向右; 蛇头的横坐标加一,纵坐标不变
}
//读取贪吃蛇蛇头下一步的坐标数据;
{
for (l = hail; l <= head - 1; l++) {
bodyx = snail[0][l];//取蛇身的横坐标
bodyy = snail[1][l];//取蛇身的纵坐标
if (headx == bodyx && heady == bodyy) { _exit(0); }
}
}
//如果蛇头碰到蛇身时,则死亡;
if (map[headx][heady] == '-' || map[headx][heady] == '|') {
_exit(0);
}
//如果蛇头碰到墙壁时,则死亡;
if (map[headx][heady] == '@') {
foodeat = 1;//可以设置食物了
//map[headx][heady] = '#';//显示吃掉了食物,其实蛇身长度还未增加;
head++;//蛇的长度加一
snail[0][head] = headx;//重新定义蛇头的横坐标
snail[1][head] = heady;//重新定义蛇头的纵坐标
#include<time.h>
#include<conio.h>
#include<cstdio>
#include<stdlib.h>
using namespace std;
const int height = 30;
//游戏界面高度为30个|
const int width = 60;
//游戏界面宽度为60个—
const int duration = 1000;
//运行1千次用1秒钟 10^3 ==1s,表示游戏界面更新的时间间隔
class Map {
public:
void snailSet() {
for (l = 0; l <= 4; l++) {
snail[0][l] = 2; //贪吃蛇在第二行
snail[1][l] = l+1;//贪吃蛇在一到五列
}
head = 4;//蛇头在snail数组中的位置为snail[][4]
hail = 0;//蛇尾在snail数组中的位置为snail[][0]
}
//对贪吃蛇的位置信息进行初定义;
void foodSet() {
if (foodeat) {
//只有当界面没有食物时才设置食物
do {
srand(time(NULL));
//time函数记录运行的时间,使用#include<time.h>头文件,
//srand()产生随机数种子,使用#include<stdlib.h>头文件
foodx = rand() % (height - 1) + 1;
//产生0到height-2的数,再加1,即1到height-1,在边界之内
foody = rand() % (width - 1) + 1;
//产生0到width-2的数,再加1,即1到width-1,在边界之内
} while (map[foodx][foody] == '#' || map[foodx][foody] == '*');
//如果食物的设置不与蛇身重合,则确定这个食物的位置
foodeat = 0;
//食物被设置之后,无法再设置食物
}
}
//食物的设置(ok)
void dictionSet() {
timeover = 1;
start = clock();
while ( (timeover = (clock() - start <duration))
&& !(_kbhit())
);
//没按方向键按原来的方向,按了方向键取改变方向;
if (timeover) {
_getch();
diction = _getch();
cout << diction << endl;
}
if (diction == 27) { system("pause"); /*_exit(0);*/ }
//按了ESC键退出;
}
//处理贪吃蛇运动选择;
void headSet() {
{
if (diction == 77) { heady = snail[1][head]+1; }
//75代表向上; 蛇头的横坐标不变,纵坐标加一
if (diction == 75) { heady = snail[1][head]-1; }
//77代表向下; 蛇头的横坐标不变,纵坐标减一
if (diction == 72) { headx = snail[0][head]-1; }
//80代表向左; 蛇头的横坐标减一,纵坐标不变
if (diction == 80) { headx = snail[0][head]+1; }
//72代表向右; 蛇头的横坐标加一,纵坐标不变
}
//读取贪吃蛇蛇头下一步的坐标数据;
{
for (l = hail; l <= head - 1; l++) {
bodyx = snail[0][l];//取蛇身的横坐标
bodyy = snail[1][l];//取蛇身的纵坐标
if (headx == bodyx && heady == bodyy) { _exit(0); }
}
}
//如果蛇头碰到蛇身时,则死亡;
if (map[headx][heady] == '-' || map[headx][heady] == '|') {
_exit(0);
}
//如果蛇头碰到墙壁时,则死亡;
if (map[headx][heady] == '@') {
foodeat = 1;//可以设置食物了
//map[headx][heady] = '#';//显示吃掉了食物,其实蛇身长度还未增加;
head++;//蛇的长度加一
snail[0][head] = headx;//重新定义蛇头的横坐标
snail[1][head] = heady;//重新定义蛇头的纵坐标
}
//如果蛇头吃到了食物时,身体长度加一,蛇身不变;
else {
for (i = hail; i <= head - 1; i++) {
snail[0][i] = snail[0][i + 1];
snail[1][i] = snail[1][i + 1];
}
//处理非头部的数据,整体向前移动一个位置;
{
snail[0][head] = headx;//重新定义蛇头的横坐标
snail[1][head] = heady;//重新定义蛇头的纵坐标
}
//处理头部数据;
}
//如果蛇头什么都没碰到时,处理蛇身的运动;
}
//处理蛇头碰到的的各种情况;
void patternSet() {
for (i = 0; i <= height; i++) {
for (l = 0; l <= width; l++) {
if (i == 0 || i == height) {
map[i][l] = '-';
}
else if (l == 0 || l == width) {
map[i][l] = '|';
}
else {
map[i][l] = ' ';
}
}
}
//对地图图案进行定义;
for (i = hail; i <= head - 1; i++) {
bodyx = snail[0][i];
bodyy = snail[1][i];
map[bodyx][bodyy] = '*';
}
//对贪吃蛇身体图案进行定义;
headx = snail[0][head];
heady = snail[1][head];
map[headx][heady] = '#';
//对贪吃蛇蛇头图案进行定义;
map[foodx][foody] = '@';
//对食物图案进行定义;
}
//处理游戏中各个位置的图案
void showSet() {
system("cls");//清屏
for (i = 0; i <= height; i++) {//输出游戏图案
for (l = 0; l <= width; l++) {
cout << map[i][l];
}
cout << endl;
}
}
//输出地图(ok);
void manageGame() {
snailSet();
foodSet();
patternSet();
showSet();
while (1) {
dictionSet();
headSet();
foodSet();
patternSet();
showSet();
}
}
//对贪吃蛇整个游戏进程进行掌控;
private:
int i, l;
int snail[2][100];//贪吃蛇的坐标信息
int head;//蛇头在snail数组中的位置;
int hail;//蛇尾在snail数组中的位置;
char map[161][161];//地图的图案信息
int headx, heady; //蛇头的横纵坐标
int bodyx, bodyy; //蛇身的横纵坐标
int foodx, foody; //食物的横纵坐标
static int diction; //贪吃蛇的运动方向
int diction_; //getch_()函数,先输出一个224,后输出输入值
int start, end; //初始时间点,和结束时间点
static int foodeat; //食物是否被吃
int timeover;//用于判断是时间原因,还是按键原因;
};
int Map::diction = 77;
int Map::foodeat = 1;
int main() {
Map map1;
map1.manageGame();
system("pause");
return 0;
}
//如果蛇头吃到了食物时,身体长度加一,蛇身不变;
else {
for (i = hail; i <= head - 1; i++) {
snail[0][i] = snail[0][i + 1];
snail[1][i] = snail[1][i + 1];
}
//处理非头部的数据,整体向前移动一个位置;
{
snail[0][head] = headx;//重新定义蛇头的横坐标
snail[1][head] = heady;//重新定义蛇头的纵坐标
}
//处理头部数据;
}
//如果蛇头什么都没碰到时,处理蛇身的运动;
}
//处理蛇头碰到的的各种情况;
void patternSet() {
for (i = 0; i <= height; i++) {
for (l = 0; l <= width; l++) {
if (i == 0 || i == height) {
map[i][l] = '-';
}
else if (l == 0 || l == width) {
map[i][l] = '|';
}
else {
map[i][l] = ' ';
}
}
}
//对地图图案进行定义;
for (i = hail; i <= head - 1; i++) {
bodyx = snail[0][i];
bodyy = snail[1][i];
map[bodyx][bodyy] = '*';
}
//对贪吃蛇身体图案进行定义;
headx = snail[0][head];
heady = snail[1][head];
map[headx][heady] = '#';
//对贪吃蛇蛇头图案进行定义;
map[foodx][foody] = '@';
//对食物图案进行定义;
}
//处理游戏中各个位置的图案
void showSet() {
system("cls");//清屏
for (i = 0; i <= height; i++) {//输出游戏图案
for (l = 0; l <= width; l++) {
cout << map[i][l];
}
cout << endl;
}
}
//输出地图(ok);
void manageGame() {
snailSet();
foodSet();
patternSet();
showSet();
while (1) {
dictionSet();
headSet();
foodSet();
patternSet();
showSet();
}
}
//对贪吃蛇整个游戏进程进行掌控;
private:
int i, l;
int snail[2][100];//贪吃蛇的坐标信息
int head;//蛇头在snail数组中的位置;
int hail;//蛇尾在snail数组中的位置;
char map[161][161];//地图的图案信息
int headx, heady; //蛇头的横纵坐标
int bodyx, bodyy; //蛇身的横纵坐标
int foodx, foody; //食物的横纵坐标
static int diction; //贪吃蛇的运动方向
int diction_; //getch_()函数,先输出一个224,后输出输入值
int start, end; //初始时间点,和结束时间点
static int foodeat; //食物是否被吃
int timeover;//用于判断是时间原因,还是按键原因;
};
int Map::diction = 77;
int Map::foodeat = 1;
int main() {
Map map1;
map1.manageGame();
system("pause");
return 0;
}