当前位置: 首页 > news >正文

用c++写控制台贪吃蛇游戏完整步骤

要使用的东西。

1.链表,2.结构体,3.系统操作。

创建界面

了解界面的生成和输入

先本地化环境用于在控制台输出中文setlocale(LC_ALL, "");要包含#include <locale.h>

要使用 system函数,要包括头文件windows.h。

1

2

3

4

5

voidcj() {

setlocale(LC_ALL,"");// 设置本地化环境

system("mode con cols=100 lines=40");// 调整控制台窗口尺寸

system("pause");// 防止窗口自动关闭

}

查看光标发现光标的长宽不匹配,调整cols和lines,来判断那个是长的。

发现调整cols后长变了所以cols是窗口的长。

调整后发现2个长等于一个宽,所以我们设置时要设置2的倍数长

设置我们的游戏界面为25*25,加上边框长乘2,54*27,再加上提示,36长。凑个整

100*30.

发现输出都从左上角开始,所以需要定位光标位置来输出,后续的内容也要运用光标的定位,所以我们要定义一个函数来表示光标定位。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

HANDLEhoutput = GetStdHandle(STD_OUTPUT_HANDLE);

// 获取控制台输出句柄

// 使用GetStdHandle(STD_OUTPUT_HANDLE)获取标准输出设备句柄

COORD pos = {x, y};// 定义光标位置坐标(左上角为原点(0,0))

SetConsoleCursorPosition(houtput, pos);// 将光标定位到指定坐标

voiddw(intx,inty) {

HANDLEhoutput = GetStdHandle(STD_OUTPUT_HANDLE);

COORD pos = {x, y};

SetConsoleCursorPosition(houtput, pos);

}

构建欢迎界面,(简介版)

1

2

3

4

dw(40, 15);

wprintf(L"欢迎来到贪吃蛇游戏");//用wprintf来输出宽字符,L表示后面的是宽字符,如中文等。

dw(40, 16);

system("pause");

到下一个界面我们要清空当前界面。

system("cls");来清空界面

1

2

3

system("cls");// 清屏操作

dw(40, 16);// 调用dw函数,参数为40和16

system("pause");// 暂停程序执行

下一步设置我们的提示

按W.S.A.D移动,F4加速,F5减速,space暂停,Esc退出。

定位要的位置输出数据,调整位置让它 看起居中。

1

2

3

4

5

6

dw(24, 15);

wprintf(L"按W.S.A.D移动,F4加速,F5减速,space暂停,Esc退出。");

dw(40, 16);

printf("加速能得到更高的分数");

dw(40, 17);

system("pause");

构建游戏界面

构建蛇的活动范围墙

发现高度不够扩高一点到40;下移墙,在顶上标识提示词表明游戏界面。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

system("cls");

inti = 0, j = 0;

for(i = 3; i < 30; i++)

{

dw(0, i);

for(j = 0; j < 27; j++) {

if(i == 3 || i == 29 || j == 0 || j == 26)

wprintf(L"墙");

else

wprintf(L" ");

}

printf("\n");

}

dw(14, 1);

wprintf(L"游戏界面");

dw(0, 32);

system("pause");

右边加入提示词

1

2

3

4

5

6

7

8

9

10

11

12

dw(60, 6);

wprintf(L"时间:%.2f", sj);

dw(60, 10);

wprintf(L"不能撞墙,不能碰到自己");

dw(60, 11);

wprintf(L"按W.S.A.D移动\n");

dw(60, 12);

wprintf(L"F4加速,F5减速\n");

dw(60, 13);

wprintf(L"space暂停,Esc退出");

dw(60, 14);

wprintf(L"fish_xk制作");

发现函数太长了,分别封装成函数。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

floatsj = 0;

voiddw(intx,inty) {

HANDLEhoutput = GetStdHandle(STD_OUTPUT_HANDLE);

COORD pos = { x,y };

SetConsoleCursorPosition(houtput, pos);

}

voidhelp() {

dw(60, 6);

wprintf(L"时间:%.2f", sj);

dw(60, 10);

wprintf(L"不能撞墙,不能碰到自己");

dw(60, 11);

wprintf(L"按W.S.A.D移动\n");

dw(60, 12);

wprintf(L"F4加速,F5减速\n");

dw(60, 13);

wprintf(L"space暂停,Esc退出");

dw(60, 14);

wprintf(L"fish_xk制作");

system("pause");

}

voidks() {

setlocale(LC_ALL,"");

system("mode con cols=100 lines=40");

dw(40, 15);

wprintf(L"欢迎来到贪吃蛇游戏");

dw(40, 16);

system("pause");

system("cls");

}

voidzj() {

dw(24, 15);

wprintf(L"按W.S.A.D移动,F4加速,F5减速,space暂停,Esc退出。");

dw(40, 16);

printf("加速能得到更高的分数");

dw(40, 17);

system("pause");

system("cls");

}

voidyxjm() {

inti = 0, j = 0;

for(i = 3; i < 30; i++)

{

dw(0, i);

for(j = 0; j < 27; j++) {

if(i == 3 || i == 29 || j == 0 || j == 26)

wprintf(L"墙");

else

wprintf(L" ");

}

printf("\n");

}

dw(22, 1);

wprintf(L"游戏界面");

dw(0, 32);

}

voidcj() {

ks();

zj();

yxjm();

help();

}

这样就完成了所有的界面的制作。

游戏本体

创建蛇

蛇由一个个节点组成,用链表来创建。重命名一下方便使用

1

2

3

4

5

typedefstructsnakebody {

structtcs* next;

intx;

inty;

}snake,st;

有蛇,有果子,有速度。用一个结构体来表示。

蛇可以用头节点来表示。

果可以看作一个在外的蛇身。

1

2

3

4

5

typedefstructtcs{

snake* head;

intv;

snake* guo;

}tcs;

还要有状态,方向,总分数,单个果子的权重。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

typedefstructsnakebody{

structtcs* next;

intx;

inty;

}snake;

enumgamezt {

OK=1,

FAIL,

DIE_BYWALL,

DIE_BYSELF

};

enumsnakefx {

UP = 1,

DOWN,

LEFT,

RIGHT

};

typedefstructtcs{

snake* head;//蛇

snake* guo;//果

intv;//速度

enumgamezt zt;//状态

enumsnakefx fx;//方向

intfood_weight;//单个分数

intscore;//总分数

}tcs;

初始化一下蛇的身体。

尾插链表来初始蛇身

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

voidpush(snake**ps,intx,inty) {//插入蛇的节点

snake* news = (snake*)malloc(sizeof(snake));//开辟节点

news->next = NULL;

news->x = x;

news->y = y;

if(*ps == NULL) {

*ps = news;

}

else

{

snake* pos = *ps;

while(pos->next) {//链接到末尾

pos = pos->next;

}

pos->next = news;

}

}

snake* body = (snake*)malloc(sizeof(snake));

body = NULL;

inti;

for(i = 22; i < 27; i = i + 1) {

push(&body,22+(i-22)*2, 16);

}

ps->head = body;

print(ps);

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

voidprint(snake*ps) {//打印蛇

assert(ps);

snake* cur = ps;

while(cur) {//遍历链表

dw(cur->x, cur->y);

wprintf(L"蛇");

cur = cur->next;

}

}

tcs* cjsnake() {//返回蛇的头位置

tcs*ps = (tcs*)malloc(sizeof(tcs));

snake* body = (snake*)malloc(sizeof(snake));

body = NULL;

inti;

for(i = 22; i < 27; i = i + 1) {//循环添加5个节点

push(&body,22+(i-22)*2, 16);

}

ps->head = body;

print(ps->head);//打印开始的蛇身

cjguo(ps);

ps->v = 200;

ps->zt = OK;

ps->fx = LEFE;

ps->score = 0;

ps->food_weight = 10;

returnps;

}

下一步生成果子,要有随机数要包含#include<time.h>

设置随机数

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

srand(time(NULL))

voidcjguo(tcs* ps) {

snake* news = (snake*)malloc(sizeof(snake));

news->next = NULL;

snake* cur = ps->head;

ag:

news->x = (rand()%25+1+1)*2;//第一个+1是保证1到25,后一个+1,是不能是墙

news->y = (rand() % 25 + 1+4 );

cur = ps->head;

while(cur){

if(cur->x == news->x && cur->y == news->y)//如果和蛇重叠重新生成。

gotoag;

cur = cur->next;

}

ps->guo = news;

dw(news->x, news->y);

wprintf(L"果");//打印果的位置

}

设置其他数据

1

2

3

4

5

ps->v = 200;//速度

ps->zt = OK;//状态

ps->fx = LEFT;//方向

ps->score = 0;//成绩

ps->food_weight = 10;//每个果子的分数

创建完毕


http://www.jsqmd.com/news/892839/

相关文章:

  • StPageFlip:开源JavaScript翻页动画库的深度技术解析与最佳实践
  • IPS中的结构漏光
  • FPGA边缘AI设计空间探索:MathWorks HDL工具箱实测与避坑指南
  • Mac 连接 Windows 云服务器保姆级教程|新手零失败远程桌面指南
  • pypto:用Python直接写NPU算子,门槛有多低?
  • 2026年游戏电竞椅推荐:拓际TGIF舒适出众 - 17322238651
  • Linux命令:pidstat
  • java实现ofd文件转pdf文件
  • 手把手教你定制一个“会自己干活”的智能PE:集成Wget和自动安装脚本
  • 外卖微信小程序京东拼多多外卖cps|外卖红包优惠券源码美团饿了么红包的技术要点
  • SAP物料账差异分摊翻车实录:CKMLCP跑完后余额不为0,我踩了这5个坑
  • 5分钟解锁游戏新体验:BepInEx插件框架让你轻松打造专属游戏模组
  • 2026年电竞椅哪家靠谱:拓际TGIF安全可靠 - 17329971652
  • 2026年5月最新重庆注销代办公司实力排行一览 - 奔跑123
  • Corrosion2靶机实战:从HTTP指纹到systemd timer提权全链路解析
  • Godot PCK文件解析原理与手写解包器实战指南
  • 避坑指南:用Unity 2D Tilemap和预制体做《吸血鬼幸存者》Demo时,我踩过的5个坑
  • 5分钟解锁VdhCoApp:浏览器视频下载的本地增强神器
  • 龙虾最新(V2026.5.20版)本地部署指南,全网第一个分享新手可学的教程
  • Python小程序二手房源界面抓取方案
  • 知识图谱嵌入与BLOCS分区算法解析
  • 机器学习赋能微服务拆分:从特征工程到图聚类的实战指南
  • Linux 负载均衡的 max_newidle_lb_cost:Newidle 均衡的成本控制
  • 魔兽争霸3终极优化指南:如何用WarcraftHelper开源工具轻松提升游戏性能
  • 2026年人体工学电竞椅品牌哪个好:拓际TGIF技术精湛 - 13724980961
  • 2026国产一体式电磁流量计TOP10品牌深度测评:谁在领跑国产替代新赛道? - 仪表品牌排行榜
  • 3步搞定:微信聊天记录永久保存的实用方案
  • Godot PCK文件解析原理与安全解包实战指南
  • 迁移学习与通用势函数驱动的高通量材料筛选工作流实践
  • 影像技术实战27:图片压缩到指定大小不失真?质量二分搜索 + 尺寸兜底方案