欢迎你开启了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