0
点赞
收藏
分享

微信扫一扫

c++游戏编程零基础(一)之贪吃蛇(控制台版)

快乐小码农 2022-03-30 阅读 34

欢迎你开启了c++的游戏编程世界之旅

如果你还未学过c++基本语法,请先学习基本语法再来学习游戏编程噢~。

在这里插入图片描述

//控制台贪吃蛇
#include <iostream>
#include <Windows.h>

using std::cout;

void GotoPos(int x, int y) {
	HANDLE hout; //定义句柄
	COORD cor; //定义坐标
	hout = GetStdHandle(STD_OUTPUT_HANDLE); //获取标准输出句柄
	cor.X = x; 
	cor.Y = y;
	SetConsoleCursorPosition(hout, cor); //设置光标位置
}

int main() {
	GotoPos(2, 2);
	cout << "hello world";
    return 0;
}

在这里插入图片描述

struct SnakeNode {
	int posx;
	int posy;
	SnakeNode* pNextNode;
	SnakeNode* pLastNode;
} *pSnakeHead, *pSnakeTail;
void Init() {
	speedx = 1; //游戏开始时蛇默认向右移动
	speedy = 0;
	pSnakeHead = new SnakeNode{ 10, 10, nullptr, nullptr }; //为蛇头申请一个空间,初始坐标为(10, 10)
	pSnakeTail = pSnakeHead; //刚开始只有一节身体,蛇头即蛇尾
}
void PrintSnake() {
	SnakeNode* pTemp = pSnakeHead;
	while (pTemp != nullptr) {
		GotoPos(pTemp->posx, pTemp->posy);
		cout << 'O';
		pTemp = pTemp->pNextNode;
	}
}
//控制台贪吃蛇
#include <iostream>
#include <Windows.h>
#include <conio.h>

using std::cout;

struct SnakeNode {
	int posx;
	int posy;
	SnakeNode* pNextNode;
	SnakeNode* pLastNode;
} *pSnakeHead, * pSnakeTail;

void GotoPos(int x, int y);
void Init();
void PrintSnake();

int main() {
	Init();

	while (1) {
		PrintSnake();
		Sleep(100); //程序休眠100ms
		system("cls"); //清空控制台
	}
	return 0;
}

void GotoPos(int x, int y) {
	HANDLE hout; //定义句柄
	COORD cor; //定义坐标
	hout = GetStdHandle(STD_OUTPUT_HANDLE); //获取标准输出句柄
	cor.X = x;
	cor.Y = y;
	SetConsoleCursorPosition(hout, cor); //设置光标位置
}

void Init() {
	pSnakeHead = new SnakeNode{ 10, 10, nullptr, nullptr }; //为蛇头申请一个空间
	pSnakeTail = pSnakeHead; //刚开始只有一节身体,蛇头即蛇尾
}

void PrintSnake() {
	SnakeNode* pTemp = pSnakeHead;
	while (pTemp != nullptr) {
		GotoPos(pTemp->posx, pTemp->posy);
		cout << 'O';
		pTemp = pTemp->pNextNode;
	}
}

在这里插入图片描述

int speedx; //x轴速度
int speedy; //y轴速度
void Init() {
	speedx = 1; //游戏开始时蛇默认向右移动
	speedy = 0;
	pSnakeHead = new SnakeNode{ 10, 10, nullptr, nullptr }; //为蛇头申请一个空间
	pSnakeTail = pSnakeHead; //刚开始只有一节身体,蛇头即蛇尾
}
void RefreshSnakeHead(int posx, int posy) {
	SnakeNode* pNewNode = new SnakeNode{ posx, posy, pSnakeHead, nullptr }; //在新位置形成新蛇头, 新蛇头next指针指向旧蛇头
	pSnakeHead->pLastNode = pNewNode; //旧蛇头last指针指向新蛇头
	pSnakeHead = pNewNode; //更新蛇头指针
}
void RefreshSnakeTail() {

	SnakeNode* pTemp = pSnakeTail; //定义临时指针
	pSnakeTail = pSnakeTail->pLastNode; //上一节身体变成新蛇尾
	pSnakeTail->pNextNode = nullptr;
	
	delete pTemp; //释放老蛇尾
	pTemp = nullptr; //为释放后的指针置空
}
void Move() {

	char cinput;

	if (_kbhit()) {

		cinput = _getch(); //使用_getch()需要 #include <conio.h>

		switch (cinput) {
		case 87: case 119: {
			speedx = 0;
			speedy = -1;
			break;
		}
		case 53: case 115: {
			speedx = 0;
			speedy = 1;
			break;
		}
		case 65: case 97: {
			speedx = -1;
			speedy = 0;
			break;
		}
		case 68: case 100: {
			speedx = 1;
			speedy = 0;
			break;
		}
		default: {
			break;
		}
		}
	}

	RefreshSnakeHead(pSnakeHead->posx + speedx, pSnakeHead->posy + speedy);
	RefreshSnakeTail();
}
int main() {
	Init();

	while (1) {
		Move();
		PrintSnake();
		Sleep(100);
		system("cls");
	}
    return 0;
}
//控制台贪吃蛇
#include <iostream>
#include <Windows.h>
#include <conio.h>

using std::cout;

struct SnakeNode {
	int posx;
	int posy;
	SnakeNode* pNextNode;
	SnakeNode* pLastNode;
} *pSnakeHead, * pSnakeTail;

int speedx; //x轴速度
int speedy; //y轴速度

//设置光标位置
void GotoPos(int x, int y);
//初始化游戏
void Init();
//打印蛇体
void PrintSnake();
//刷新蛇头节点
void RefreshSnakeHead(int posx, int posy);
//刷新蛇尾节点
void RefreshSnakeTail();
//移动控制
void Move();

int main() {
	Init();

	while (1) {
		Move();
		PrintSnake();

		Sleep(100);
		system("cls");
	}

	return 0;
}

void GotoPos(int x, int y) {
	HANDLE hout; //定义句柄
	COORD cor; //定义坐标
	hout = GetStdHandle(STD_OUTPUT_HANDLE); //获取标准输出句柄
	cor.X = x;
	cor.Y = y;
	SetConsoleCursorPosition(hout, cor); //设置光标位置
}

void Init() {
	speedx = 1; //游戏开始时蛇默认向右移动
	speedy = 0;
	pSnakeHead = new SnakeNode{ 10, 10, nullptr, nullptr }; //为蛇头申请一个空间
	pSnakeTail = pSnakeHead; //刚开始只有一节身体,蛇头即蛇尾
}

void PrintSnake() {
	SnakeNode* pTemp = pSnakeHead;
	while (pTemp != nullptr) {
		GotoPos(pTemp->posx, pTemp->posy);
		cout << 'O';
		pTemp = pTemp->pNextNode;
	}
}

void RefreshSnakeHead(int posx, int posy) {
	SnakeNode* pNewNode = new SnakeNode{ posx, posy, pSnakeHead, nullptr }; //在新位置形成新蛇头, 新蛇头next指针指向旧蛇头
	pSnakeHead->pLastNode = pNewNode; //旧蛇头last指针指向新蛇头
	pSnakeHead = pNewNode; //更新蛇头指针
}

void RefreshSnakeTail() {

	SnakeNode* pTemp = pSnakeTail;
	pSnakeTail = pSnakeTail->pLastNode;
	pSnakeTail->pNextNode = nullptr;

	delete pTemp; //释放节点空间
	pTemp = nullptr; //为释放后的指针置空
}

void Move() {

	char cinput;

	if (_kbhit()) {

		cinput = _getch(); //使用getch()需要 #include <conio.h>

		switch (cinput) {
		case 87: case 119: {
			speedx = 0;
			speedy = -1;
			break;
		}
		case 53: case 115: {
			speedx = 0;
			speedy = 1;
			break;
		}
		case 65: case 97: {
			speedx = -1;
			speedy = 0;
			break;
		}
		case 68: case 100: {
			speedx = 1;
			speedy = 0;
			break;
		}
		default: {
			break;
		}
		}
	}

	RefreshSnakeHead(pSnakeHead->posx + speedx, pSnakeHead->posy + speedy);
	RefreshSnakeTail();
}

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

文章持续更新中
作者水平有限,如果有误,请多指正!
代码运行环境:Visual Studio 2019

举报

相关推荐

0 条评论