c++ 贪吃蛇小游戏

(地图大小为25*25,蛇初始位置为数组的map[3][3]~map[3][6],蛇头为map[3][6],方向向右)

#include <iostream>
#include <Windows.h>
#include <cstdlib>
#include <time.h> 
#include <conio.h>
using namespace std;

#define MAX_WIDE 25
#define MAX_HIGH 25

char map[MAX_HIGH][MAX_WIDE];    //地图大小

struct node
{
int x, y;
};
node snack[(MAX_WIDE - 2)*(MAX_HIGH - 2)], food;    //定义蛇身和食物坐标

int lenth, direct, live = 1;                  //蛇的长度,方向和存活
int speech = 200;

void initMap(node *n, int len) {              //初始化地图
  for (int i = 0; i < MAX_HIGH; i++)
    for (int j = 0; j < MAX_WIDE; j++)
      map[i][j] = ‘ ‘;
  for (int i = 0; i < MAX_HIGH; i++)          //设置左右的墙
    map[i][0] = map[i][MAX_WIDE - 1] = ‘|‘;
  for (int j = 0; j < MAX_WIDE; j++)
    map[0][j] = map[MAX_HIGH - 1][j] = ‘-‘;     //设置上下的墙
  for (int j = 1; j < len; j++)
    map[n[j].x][n[j].y] = ‘*‘;             //设置蛇身
  map[n[0].x][n[0].y] = ‘#‘;              //设置蛇头
}  

void showMap() {                     //输出数组map
  system("cls");                    //清屏
  for (int i = 0; i < MAX_HIGH; i++) {         
    for (int j = 0; j < MAX_WIDE; j++) {
      cout << map[i][j];
    }
    cout << endl;
  }
}

void showFood() {                    //产生食物,坐标在map中且不为蛇上
  srand((unsigned)time(NULL));            //食物的产生点随机
  do {
    food.x = rand() % MAX_WIDE;
    food.y = rand() % MAX_HIGH;
  } while (map[food.x][food.y] != ‘ ‘);
  map[food.x][food.y] = ‘o‘;
}

int updataGame() {                   //更新数组
  long start = clock();
  int a, b;                       //暂存 移动后蛇头的位置
  while (!_kbhit() && (clock() - start <= speech));   //直到有按键或者时间过了speech则跳出循环
  if (_kbhit()) {
    _getch();                    //上、下、左、右键是二个字节的,取第二个字节分别为(72,80,75,77)  
    direct = _getch();
  }
  switch (direct)
  {
  case 72:                       //up
    a = snack[0].x - 1;
    b = snack[0].y;
    break;
  case 80:                       //down
    a = snack[0].x + 1;
    b = snack[0].y;
    break;
  case 75:                       //left
    a = snack[0].x;
    b = snack[0].y - 1;
    break;
  case 77:                       //right
    a = snack[0].x;
    b = snack[0].y + 1;
    break;
  default:
    break;
  }
  if (a == 0 || a == MAX_HIGH - 1 || b == 0 || b == MAX_WIDE - 1)    //撞墙
    live = 0;
  if (map[a][b] == ‘*‘)                            //撞自身
    live = 0;
  map[snack[0].x][snack[0].y] = ‘*‘;                     //将蛇头置为蛇身
  map[snack[lenth - 1].x][snack[lenth - 1].y] = ‘ ‘;              //蛇尾置为空
  map[a][b] = ‘#‘;                              //更新蛇头
  for (int i = lenth - 1; i > 0; i--)                       //更新蛇数组
    snack[i] = snack[i - 1];
  snack[0].x = a;
  snack[0].y = b;
  if (a == food.x && b == food.y) {                      //蛇吃了食物
    map[snack[lenth - 1].x][snack[lenth - 1].y] = ‘*‘;            //取消蛇尾置空
    lenth++;
    showFood();                               //产生新食物
    speech -= lenth;                             //加速
  }
  showMap();
  return live;
}

int main() {
  snack[0].x = 3;
  snack[0].y = 6;
  lenth = 4;
  for (int i = 1; i < lenth; i++) {
    snack[i].x = 3;
    snack[i].y = snack[i - 1].y - 1;
  }
  direct = 77;
  initMap(snack, lenth);
  showFood();
  showMap();
  do {
    updataGame();
  } while (live);
  cout << "得分为:" << lenth-4 << endl;
  system("pause");
  return 0;
}

时间: 2024-10-23 06:28:22

c++ 贪吃蛇小游戏的相关文章

贪吃蛇小游戏 (一)

贪吃蛇是一款儿时爱不释手的游戏.近日修行,想玩玩游戏开发.便简单写了个控制台版的贪吃蛇. 程序的简单框架: 建立一张固定大小的MAP,保存输出信息. 当信息有变动时,用system("cls")进行清屏操作,再重新输出实现伪动态. 重点算法在蛇身的移动,转向与增长.三者均基于链表实现. 移动与转向:通过判定移动方向,确定下一步移动的位置后,新建表头结点.将新表头结点置为表头.删除末尾结点. 增长:通过判断尾部移动方向,确定位置后在尾部添加节点. 熟练运用链表的同学,相信也是小菜一碟了.

一个简单的“贪吃蛇”小游戏

一个简单的“贪吃蛇”小游戏 页面结构 简单的21x21的方块,页面结构 id为container的div包含所21个class名为row的div,每个row代表贪吃蛇的一整行,每个row中又包含21个div,代表这一行的每一个div方格,如果这个方格是空的话,div的类名为blank,如果这一个方格表示“贪吃蛇”的“食物”,div的类名为food,如果这一个方格表示“蛇”,div的类名为snake. CSS JS 然后我们思考下一个贪吃蛇游戏需要那些参数, 首先,界面中可见的元素无非就是空方格,

贪吃蛇小游戏的初步尝试制作

这里利用二维数组做为地图,利用集合来存放蛇头和蛇尾的位置坐标,初步实现一个需要键盘控制的贪吃蛇小游戏. 首先,Main函数下面需要一个大循环来让游戏失败的时候能够重新开始,这里我们用了定义了一个bool型的sc,判断sc的true和flase来确定游戏是否开始: static void Main(string[] args)        { bool sc = true; while (sc) //大循环,用于游戏失败重新开始            { 下面是定义一个集合snake_x来存放蛇

使用Html5+JS做的贪吃蛇小游戏

学习了Html5的Canvas的使用,和JS创建对象,做了一个贪吃蛇小游戏,来巩固JS面向对象编程和Canvas的用法. Node.js 1 /** 2 * 格子类,组成贪吃蛇和舞台 3 */ 4 function Node(x,y){ 5 this.x=x; 6 this.y=y; 7 /** 8 * 比较两个格子是否重合 9 */ 10 this.equals=function(x,y){ 11 return this.x==x&&this.y==y; 12 } 13 } Snake.

Java版贪吃蛇小游戏的实现

使用的IDE eclipse JDK版本 1.6 辅助类 Coordinate.java package com.nn.util; /** *坐标点 */ public class Coordinate { public int x; public int y; public Coordinate(int newX, int newY) { x = newX; y = newY; } public boolean equals(Coordinate other) { if (x == other

贪吃蛇小游戏java实现代码分析

贪吃蛇小游戏java实现代码分析 贪吃蛇的小游戏,网上的代码比较多,今天周五,在教研室没啥事做,在电脑中发现了一个贪吃蛇的小游戏,于是就看了下实现的源码,发现别人写的代码确实挺好的,自己也是边加注释边进行理解的去看别人实现的游戏源码,发现还是挺有意思的.自己花了一个下午的时间看了源码,也加了一点小小的功能,于是,不写篇博客觉得对不起自己也,哈哈哈. 此游戏代码的思路非常的清晰,也相当好理解,没有太多难的地方,不过有很多值得学习的地方,因为,这份源码中,对java.awt包中的很多类的很多方法都进

用C写一个功能较为完善的贪吃蛇小游戏

主要功能: 方向控制-食物与增长-变速 1 #include<stdio.h> 2 #include<time.h>//种子-随机数 3 #include<windows.h>//system函数,控制台句柄 4 #include<conio.h>//按键 5 //界面(欢迎界面-游戏界面-结束得分界面)-驱动-方向控制-食物 6 //位置锁定-打印-删除 7 int snake_x[520]={0}; 8 int snake_y[520]={0}; 9 i

js+jQuery实现贪吃蛇小游戏

这是我第一次这么认真的去写一个程序.今天老师布置的编程任务是实现一个贪吃蛇的小游戏,一开始感觉很茫然的,因为以前都没有这么系统的去做过一个编程任务.后来理清思路去做,感觉问题也并不是那么的难. 首先,第一步肯定是要编写出我们的的静态页面. 第二步,让我们的贪吃蛇先从一个开始动起来. 第三步,让我们通过键盘去控制他的运动方向. 第四步,让我们去判断我们的贪吃蛇有没有撞墙,有没有吃到自己,因为这已经犯规了. 第五步,给我们的贪吃蛇随机生成一个‘食物’. 第六步,实现每当我们的贪吃蛇吃了一个食物,他都

html5面向对象做一个贪吃蛇小游戏

canvas加面向对象方式的贪吃蛇 2016-08-25 这个小游戏可以增加对面向对象的理解,可以加强js逻辑能力,总之认真自己敲一两遍收获还是不少啊!!适合刚学canvas的同学练习!! 废话不多说,直接来讲思路和代码. ----------------------------------------------------------------------------------------------------------------- 开发思路:首先要有蛇吃的食物,就是一个个canv

使用前端原生 js,贪吃蛇小游戏

好久好久,真的是好久好久没来写过了,因为最近有点小忙.不过即使是忙,也也还是写了两个小游戏,其中一个就是这个,贪吃蛇啦. 算是一个小练手了,这个是在有点太简单了,只是第一次写这种小游戏,还是零零星星花了三五天时间,下面就是这个小游戏的gif小动画,比较简单,对比过网上其他用来写出来练手的贪吃蛇作品,这个在颜值还是功能上,都还是不错的,霍霍. 这里讲解一下功能: 空格控制开始和暂停. 方向键控制移动方向. Q 键加速,再按一次恢复常规速度(在加速状态时,按下或者方向键,或者吃到了白色小食物,速度自