精华内容
下载资源
问答
  • c++贪吃蛇

    2018-03-27 09:41:45
    c++贪吃蛇c++贪吃蛇c++贪吃蛇c++贪吃蛇c++贪吃蛇c++贪吃蛇c++贪吃蛇
  • C++贪吃蛇

    千次阅读 2020-02-07 20:18:51
    C++贪吃蛇基本概念前言采用的平台贪吃蛇移动食物的产生判断游戏结束吃到食物代码实现效果后记 基本概念 前言 最近疫情比较严重没有带书回家,所以就突发奇想来实现之前一直想做的一个游戏,或许这个游戏比较粗糙但是...

    基本概念

    前言

    最近疫情比较严重没有带书回家,所以就突发奇想来实现之前一直想做的一个游戏,或许这个游戏比较粗糙但是也是自己进步的一小步。希望能够对大家有帮助。

    采用的平台

    windows+visual studio+C++

    贪吃蛇移动

    贪吃蛇使用链表实现,
    贪吃蛇显示
    每一次移动,蛇尾摘下来,接到蛇头方向。
    在这里插入图片描述
    rear向后移动,front向下一个移动。在这里插入图片描述
    分别以W,A,S,D四个字符标志移动方向,其中W向上移动,A向左移动,S向下移动,D向右移动。其中W:x-1;A:y-1;S:x+1;D:y+1在这里插入图片描述

    食物的产生

    生成一个新的类

    class Food
    {
    public:
    	int x;
    	int y;
    };
    

    食物的产生采用随机函数的方法,但是产生的时候要判断是不是在蛇的身体上。如果是在蛇的身体上就需要重新生成一个位置。
    判断是这个条件采用遍历循环的方法,如果遍历过程中出现food.x == p->x&&food.y == p->y则判断为false。

    判断游戏结束

    在这个游戏当中没有考虑蛇吃本身的情况,所以只需要判断是否触壁。如果触壁就返回game over。

    吃到食物

    如果food的x和y和当前蛇头的x和y相等,则认为吃到了食物。在这里插入图片描述
    这个时候就将当前食物的位置作为蛇头的位置,在这里插入图片描述

    代码

    map.h

    #pragma once
    #include<iostream>
    class Map
    {
    private:
    	char screen[25][25];
    public:
    	void init();
    	void print();
    	void setPoint(int x, int y, char ch);
    	char getPoint(int x, int y);
    	void clear();
    
    };
    

    map.cpp

    #include "Map.h"
    void Map::init() {//初始化map
    	for (int i = 0; i < 25; i++)
    	{
    		screen[0][i] = '*';
    		screen[i][0] = '*';
    		screen[24][i] = '*';
    		screen[i][24] = '*';
    	}
    	for (int i = 1; i < 24; i++)
    		for (int j = 1; j < 24; j++)
    			screen[i][j] = ' ';
    }
    
    void Map::print() {//打印数组,其中横向采用一个空格间距,
    //这样的效果会更加像一个正方形效果更好
    	for (int i = 0; i < 25; i++)
    	{
    		for (int j = 0; j < 25; j++)
    			std::cout << screen[i][j] << ' ';
    		std::cout << std::endl;
    	}
    }
    
    void Map::setPoint(int x, int y, char ch) {
    	screen[x][y] = ch;
    }
    
    char Map::getPoint(int x, int y) {
    	return screen[x][y];
    }
    
    void Map::clear() {//清空现有的所有位置
    	for (int i = 1; i < 24; i++)
    		for (int j = 1; j < 24; j++)
    			screen[i][j] = ' ';
    }
    

    Sanke.h

    #pragma once
    
    #include<vector>
    #include<iostream>
    #include<queue>
    #include"Map.h"
    #include"Point.h"
    #include"Food.h"
    using namespace std;
    class Sanke
    {
    public:
    	void move();
    	void init();
    	void print_1();
    	bool check();
    	void allFood();
    private:
    	int score = 0;
    	Map map;
    	Food food;
    	Point* point_sanke_front;
    	Point* point_sanke_rear;
    	char direction;
    	void getDirection();
    	void moveUp();
    	void moveDown();
    	void moveRight();
    	void moveLeft();
    	bool checkFood();
    	void eatFood();
    	void produceFood();
    };
    

    Sanke.cpp

    #include "Sanke.h"
    #define random(x) (rand()%x)
    
    void Sanke::move() {//进行移动
    	getDirection();
    	switch (direction)
    	{
    	case 'W':
    		moveUp();
    		break;
    	case 'S':
    		moveDown();
    		break;
    	case 'A':
    		moveLeft();
    		break;
    	case 'D':
    		moveRight();
    		break;
    	default:
    		break;
    	}
    }
    
    void Sanke::getDirection() {//获取方向按键,利用一个direction进行存储
    	cin >> direction;
    }
    
    void Sanke::moveUp() {//向上移动
    	if (point_sanke_rear->x == food.x && point_sanke_rear->y == food.y)
    	{//如果遇到了食物就调用吃食物的函数和产生食物的函数
    		score++;
    		eatFood();
    		produceFood();
    	}
    	else
    	{//否则,就采用前面所介绍的向上移动
    		Point* p = point_sanke_front;
    		point_sanke_front = point_sanke_front->next;
    		p->x = point_sanke_rear->x - 1;
    		p->y = point_sanke_rear->y;
    		p->next = nullptr;
    		point_sanke_rear->next = p;
    		point_sanke_rear = point_sanke_rear->next;
    	}
    }
    
    void Sanke::moveDown() {//向下移动
    	if (point_sanke_rear->x == food.x && point_sanke_rear->y == food.y)
    	{
    		score++;
    		eatFood();
    		produceFood();
    	}
    	else
    	{
    		Point* p = point_sanke_front;
    		point_sanke_front = point_sanke_front->next;
    		p->x = point_sanke_rear->x + 1;
    		p->y = point_sanke_rear->y;
    		p->next = nullptr;
    		point_sanke_rear->next = p;
    		point_sanke_rear = point_sanke_rear->next;
    	}
    }
    
    void Sanke::moveRight() {//向右移动
    	if (point_sanke_rear->x == food.x && point_sanke_rear->y == food.y)
    	{
    		score++;
    		eatFood();
    		produceFood();
    	}
    	else
    	{
    		Point* p = point_sanke_front;
    		point_sanke_front = point_sanke_front->next;
    		p->x = point_sanke_rear->x;
    		p->y = point_sanke_rear->y + 1;
    		p->next = nullptr;
    		point_sanke_rear->next = p;
    		point_sanke_rear = point_sanke_rear->next;
    	}
    }
    
    void Sanke::moveLeft() {//向左移动
    	if (point_sanke_rear->x == food.x && point_sanke_rear->y == food.y)
    	{
    		score++;
    		eatFood();
    		produceFood();
    	}
    	else
    	{
    		Point* p = point_sanke_front;
    		point_sanke_front = point_sanke_front->next;
    		p->x = point_sanke_rear->x;
    		p->y = point_sanke_rear->y - 1;
    		p->next = nullptr;
    		point_sanke_rear->next = p;
    		point_sanke_rear = point_sanke_rear->next;
    	}
    }
    
    void Sanke::init() {//初试化蛇对象
    	map.init();
    	Point* p1 = new Point(5, 5);
    	Point* p2 = new Point(5, 6);
    	Point* p3 = new Point(5, 7);
    	Point* p4 = new Point(5, 8);
    	Point* p5 = new Point(5, 9);
    	p1->next = nullptr;
    	p2->next = p1;
    	p3->next = p2;
    	p4->next = p3;
    	p5->next = p4;
    	point_sanke_rear = p1;
    	point_sanke_front = p5;
    	produceFood();
    }
    
    void Sanke::print_1() {//将所有蛇身体中的元素设置到二维数组中,调用setPoint()函数
    	system("cls");
    	map.clear();
    	map.setPoint(point_sanke_rear->x, point_sanke_rear->y, '@');
    	Point* p = point_sanke_front;
    	while (p != point_sanke_rear) {
    		map.setPoint(p->x, p->y, '#');
    		p = p->next;
    	}
    	map.setPoint(food.x, food.y, '$');
    	map.print();
    	cout << "得分:" << score << endl;
    }
    
    bool Sanke::check() {//检查是否碰壁
    	if (point_sanke_rear->x == 0 || point_sanke_rear->y == 0 ||
    		point_sanke_rear->x == 24 || point_sanke_rear->y == 24)
    	{
    		return false;
    	}
    	else
    	{
    		return true;
    	}
    }
    
    void Sanke::produceFood() {//产生食物
    	food.x = random(23) + 1;
    	food.y = random(23) + 1;
    	while (!checkFood())
    	{
    		food.x = random(23) + 1;
    		food.y = random(23) + 1;
    	}
    }
    
    void Sanke::eatFood() {//吃下食物的操作
    	Point* p = new Point(food.x, food.y);
    	p->next = nullptr;
    	point_sanke_rear->next = p;
    	point_sanke_rear = point_sanke_rear->next;
    }
    
    
    
    bool Sanke::checkFood() {//检查产生的食物是不是在蛇的身体上,如果在则返回true,反之返回false
    	Point* p = point_sanke_front;
    	while (p) {
    		if (p->x == food.x && food.y == p->y)
    		{
    			return false;
    		}
    		p = p->next;
    	}
    	return true;
    }
    
    void Sanke::allFood() {//所有的关于食物的操作集合
    	if (point_sanke_rear->x == food.x && point_sanke_rear ->y == food.y)
    	{
    		score++;
    		eatFood();
    		produceFood();
    	}
    }
    

    Food.h

    #pragma once
    class Food//存储食物的位置
    {
    public:
    	int x;
    	int y;
    };
    

    Point.h

    #pragma once
    struct Point//存储结点
    {
    	int x;
    	int y;
    	struct Point* next;
    	Point(int x_,int y_) : x(x_),y(y_){}
    };
    

    main.cpp

    #include"Sanke.h"
    
    int main() {
    	Sanke sanke;
    	sanke.init();
    	sanke.allFood();
    	sanke.print_1();
    	while (sanke.check())
    	{
    		sanke.move();
    		sanke.print_1();
    		sanke.allFood();
    	}
    	cout << "Game Over" << endl;
    }
    

    实现效果

    在这里插入图片描述在这里插入图片描述

    后记

    武汉加油!中国加油!早日战胜这次的疫情!希望你们看到这个文章也能够回忆起之前的记忆!

    展开全文
  • c++ 贪吃蛇

    2011-12-04 23:59:25
    复习数据结构的时候无聊写的,c++ 贪吃蛇
  • c++贪吃蛇贪吃蛇.zip

    2020-03-28 18:18:03
    c++贪吃蛇
  • C++ 贪吃蛇

    2013-01-14 13:44:08
    使用C++编写的贪吃蛇游戏,很经典的游戏,适合作为参考

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,064
精华内容 825
关键字:

c++贪吃蛇

c++ 订阅