c语言循环链表贪吃蛇,C++控制台循环链表实现贪吃蛇

c90cadccf06ff6fb04b20ae3486314e8.png

本文实例为大家分享了C++控制台循环链表实现贪吃蛇的具体代码,供大家参考,具体内容如下

-stdafx.h 为了简化程序定义一些宏和全局变量

#ifndef __STDAFX_H__

#define __STDAFX_H__

// ============上下左右=============

const int UP = 72;

const int DOWN = 80;

const int LEFT = 75;

const int RIGHT = 77;

// ==============宽高===============

#define HEIGHT 20

#define WIDTH 39

// ==============输出===============

#define cout_food std::cout<

#define cout_snake std::cout<

#define cout_space std::cout << " "

#define cout_snake_xy(x,y) SnakeUI::gotoXY(x,y);cout_snake

#define cout_food_xy(x,y) SnakeUI::gotoXY(x,y);cout_food

#define cout_space_xy(x,y) SnakeUI::gotoXY(x,y);cout_space

// =============结束?==============

#define OVER false

#define RUN true

#endif

-SnakeUI.h

主要是初始化UI,初始化蛇,还有生产食物,判断食物和蛇有没有相撞,还有对界面的一些操作

#ifndef __SNAKE_UI_H__

#define __SNAKE_UI_H__

#include

#include

#include "Snake.h"

struct Food {

int x;

int y;

};

class SnakeUI {

public:

static void initUI();

static void initSnake();

static void gotoXY(int x, int y);

static void productFood(Snake& snake);

static bool meetWithFood(int x, int y);

private:

static Food food;

};

#endif

-SnakeUI.cpp

#include "stdafx.h"

#include "SnakeUI.h"

#include

using namespace std;

Food SnakeUI::food = { 0, 0 };

// init UI

void SnakeUI::initUI() {

cout << "┏";

for (int i = 1; i < WIDTH; ++i) cout << "━";

cout << "┓";

gotoXY(0, HEIGHT);

cout << "┗";

for (int i = 1; i < WIDTH; ++i) cout << "━";

cout << "┛";

for (int y = 1; y < HEIGHT; ++y) {

gotoXY(0, y); cout << "┃";

gotoXY(WIDTH, y); cout << "┃";

}

}

// init snake: three points

void SnakeUI::initSnake() {

gotoXY(2, 10); cout_snake;

gotoXY(3, 10); cout_snake;

gotoXY(4, 10); cout_snake;

}

// goto point(x, y) in console

void SnakeUI::gotoXY(int x, int y) {

COORD coord = { x * 2, y };

SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);

}

// random product food

void SnakeUI::productFood(Snake& snake) {

srand((unsigned)time(NULL));

int x, y; // x from 1 to 38, y from 1 to 19

bool productOK;

for (;;) {

productOK = true;

x = rand() % 38 + 1;

y = rand() % 19 + 1;

// 不和蛇身碰撞1->检查身体和尾部

for (SnakeNode* sn = snake.last; sn != snake.first; sn = sn->prev) {

if (sn->x == x && sn->y == y) {

productOK = false;

break;

}

}

// 不和蛇身碰撞2->检查头部

if (x == snake.first->x && y == snake.first->y)

productOK = false;

if (productOK)

break;

}

food.x = x;

food.y = y;

cout_food_xy(food.x, food.y);

}

// is snake"s head meet with food?

bool SnakeUI::meetWithFood(int x, int y) {

return (food.x == x && food.y == y);

}

-Snake.h

蛇类,蛇的移动和状态

#ifndef __SNAKE_H__

#define __SNAKE_H__

struct SnakeNode {

int x;

int y;

SnakeNode* prev;

SnakeNode(int x_t, int y_t){ x = x_t; y = y_t; }

SnakeNode(){}

};

class Snake {

friend class SnakeUI;

public:

Snake();

~Snake();

bool snakeMove(char& dir);

private:

void getKey(char& dir);

private:

SnakeNode* first;

SnakeNode* last;

char state;

};

#endif

-Snake.cpp

#include "stdafx.h"

#include "Snake.h"

#include "SnakeUI.h"

Snake::Snake() {

// 状态:向右

state = RIGHT;

// 创建循环链表

first = new SnakeNode(4, 10);

last = new SnakeNode(2, 10);

last->prev = new SnakeNode(3, 10);

last->prev->prev = first;

first->prev = last;

// UI

SnakeUI::initSnake();

SnakeUI::productFood(*this);

}

Snake::~Snake() {

SnakeNode* tmp = last;

while (last != last) {

last = last->prev;

delete tmp;

tmp = last;

}

delete last;

}

bool Snake::snakeMove(char& dir) {

int x = first->x;

int y = first->y;

getKey(dir);

// 撞墙->Game Over

switch (state)

{

case UP: --y; if (y == 0) return OVER; break;

case DOWN: ++y; if (y == HEIGHT) return OVER; break;

case LEFT: --x; if (x == 0) return OVER; break;

case RIGHT: ++x; if (x == WIDTH) return OVER; break;

}

// 撞到了自己

SnakeNode* tmp = last;

for (; tmp != first; tmp = tmp->prev) {

if (first->x == tmp->x && first->y == tmp->y)

return OVER;

}

// 吃食物

if (SnakeUI::meetWithFood(x, y)) {

SnakeNode* newHead = new SnakeNode(x, y);

first->prev = newHead;

newHead->prev = last;

first = newHead;

cout_snake_xy(x, y);

SnakeUI::productFood(*this);

}

else {

cout_space_xy(last->x, last->y);

last->x = x;

last->y = y;

first = last;

last = last->prev;

cout_snake_xy(x, y);

}

return RUN;

}

void Snake::getKey(char& dir) {

switch (dir)

{

case UP: if (state == LEFT || state == RIGHT) state = UP; return;

case DOWN: if (state == LEFT || state == RIGHT) state = DOWN; return;

case LEFT: if (state == UP || state == DOWN) state = LEFT; return;

case RIGHT: if (state == UP || state == DOWN) state = RIGHT; return;

}

}

-main.cpp

#include "stdafx.h"

#include "SnakeUI.h"

#include "Snake.h"

#include

#include

using namespace std;

DWORD WINAPI ThreadProc1(LPVOID lpParameter);

char dir = RIGHT;

int main()

{

SnakeUI::initUI();

Snake snake;

CreateThread(NULL, 0, ThreadProc1, NULL, 0, NULL);

while (snake.snakeMove(dir)) Sleep(100);

system("pause");

return 0;

}

DWORD WINAPI ThreadProc1(LPVOID lpParameter)

{

for (;;) {

dir = _getch();

}

return 1;

}

关于C++小游戏的更多精彩内容请点击专题: 《C++经典小游戏》 学习了解

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持云海天教程。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值