贪吃蛇

来源:互联网 发布:易源数据 编辑:程序博客网 时间:2024/04/30 14:29
#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;//重新定义蛇头的纵坐标

  }
  //如果蛇头吃到了食物时,身体长度加一,蛇身不变;
  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;
}
0 2
原创粉丝点击