Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
林继杨
3120004886
提交
94957e63
3
3120004886
项目概览
林继杨
/
3120004886
通知
1
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
3
3120004886
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
94957e63
编写于
9月 06, 2022
作者:
林继杨
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
之前的文件
上级
811b8fcd
变更
1
显示空白变更内容
内联
并排
Showing
1 changed file
with
179 addition
and
0 deletion
+179
-0
课设__贪吃蛇.cpp
课设__贪吃蛇.cpp
+179
-0
未找到文件。
课设__贪吃蛇.cpp
0 → 100644
浏览文件 @
94957e63
#include <stdio.h>
#include <windows.h>
#include <time.h>
#include <conio.h>
#include <stdlib.h>
//方向键的ASCLL值:上72,左75,右77,下80
//背景颜色的代码: 0=黑色 1蓝色 2 绿色 3湖蓝色 4红色 5紫色 6黄色 7白色 8灰色 9淡蓝色
//**改变当前光标方块的背景颜色和字体颜色**//
void
BackGround
(
unsigned
int
ForeColor
=
7
,
unsigned
int
BackGroundColor
=
0
)
{
HANDLE
handle
=
GetStdHandle
(
STD_OUTPUT_HANDLE
);
//获取控制台的句柄
SetConsoleTextAttribute
(
handle
,
ForeColor
+
BackGroundColor
*
0x10
);
//改变当前光标的背景和字体颜色
}
//**改变光标的位置**//
void
gotoxy
(
int
x
,
int
y
)
{
HANDLE
handle
;
COORD
coord
;
//获取坐标轴结构体
coord
.
X
=
x
;
coord
.
Y
=
y
;
handle
=
GetStdHandle
(
STD_OUTPUT_HANDLE
);
//获取控制台句柄,值为-11
SetConsoleCursorPosition
(
handle
,
coord
);
//移动光标到x,y处
}
//**初始化地图数据**//
void
restart
(
int
bk
[
20
][
20
],
int
look
[
4
],
int
move
[
20
][
20
])
{
//bk为总的地图数据记录整个地图,为1时表示墙体,为2时表示果实,为3时表示蛇
//look记录数据,为0时表示朝向,为1时表示长度,为3时表示胜负情况,为4表示分数
//move记录蛇走过的路程,用来打印蛇时判断用
int
pp
,
qq
;
//用来记录获取的随机坐标
//接下来要初始化整个地图//
for
(
int
i
=
0
;
i
<=
16
;
i
++
)
for
(
int
j
=
0
;
j
<=
16
;
j
++
)
{
if
(
i
==
0
||
i
==
16
||
j
==
0
||
j
==
16
)
bk
[
i
][
j
]
=
1
;
//1表示墙体
else
bk
[
i
][
j
]
=
0
;
//0表示什么都没有
move
[
i
][
j
]
=
0
;
//该数组用来记录蛇移动的轨迹
}
//将蛇初始化在8,8坐标上
bk
[
8
][
8
]
=
3
;
move
[
8
][
8
]
=
1
;
//则此时8,8,上的轨迹就应该记录为1
move
[
0
][
0
]
=
1
;
//用此来记录步数
pp
=
rand
()
%
15
+
1
;
//范围是1-15
qq
=
rand
()
%
15
+
1
;
bk
[
pp
][
qq
]
=
2
;
//表示这个位置有果实了
look
[
0
]
=
1
;
//表示朝向,向上
look
[
1
]
=
1
;
//表示长度
look
[
2
]
=
0
;
//当为1是表示失败
look
[
3
]
=
0
;
//记录得分
//接下来要绘制地图//
for
(
int
i
=
0
;
i
<=
16
;
i
++
)
for
(
int
j
=
0
;
j
<=
16
;
j
++
)
{
gotoxy
(
i
*
2
,
j
);
//光标移动,每个光标都是矩形
switch
(
bk
[
i
][
j
])
{
case
0
:
BackGround
(
0
,
0
);
break
;
//如果没有东西打印黑色
case
1
:
BackGround
(
0
,
1
);
break
;
//墙打印蓝色
case
2
:
BackGround
(
0
,
2
);
break
;
//果实打印绿色
case
3
:
BackGround
(
0
,
3
);
break
;
//蛇打印湖蓝色
default:
break
;
}
printf
(
" "
);
//地图中直接就是涂空格符
}
//接下来要显示积分//
gotoxy
(
35
,
0
);
BackGround
(
7
,
0
);
//用白字黑底打印
printf
(
"现在得分是:%d,请再接再厉!^_^"
,
look
[
2
]);
}
//**运动主体**//
void
map
(
int
bk
[
20
][
20
],
int
look
[
4
],
int
xy
[
2
],
int
move
[
20
][
20
])
{
//bk是地图信息,look作数据记录,xy记录坐标,move记录蛇的运动轨迹
int
b
[
10
],
qq
=
0
,
pp
=
0
;
//b用来吸收输入,qq和pp用来随机初始化果实坐标
if
(
kbhit
())
{
//记录按下的是哪个方向键
b
[
0
]
=
getch
();
//用b来记录
if
(
b
[
0
]
==
224
)
b
[
0
]
=
getch
();
//如果为224表示为方向键,但是要再一次获取才行
if
(
b
[
0
]
==
72
&&
look
[
0
]
!=
2
)
//如果输入的为上并且朝向不为下
look
[
0
]
=
1
;
if
(
b
[
0
]
==
80
&&
look
[
0
]
!=
1
)
look
[
0
]
=
2
;
if
(
b
[
0
]
==
75
&&
look
[
0
]
!=
4
)
look
[
0
]
=
3
;
if
(
b
[
0
]
==
77
&&
look
[
0
]
!=
3
)
look
[
0
]
=
4
;
}
switch
(
look
[
0
])
{
case
1
:
//往上走
xy
[
1
]
--
;
break
;
case
2
:
//往下走
xy
[
1
]
++
;
break
;
case
3
:
//往左走
xy
[
0
]
--
;
break
;
case
4
:
//往右走
xy
[
0
]
++
;
break
;
}
//接下来蛇就开始走动了//
move
[
0
][
0
]
++
;
//蛇的步数加一
move
[
xy
[
0
]][
xy
[
1
]]
=
move
[
0
][
0
];
//记录当前格子中蛇的轨迹
gotoxy
(
35
,
2
);
BackGround
(
7
,
0
);
printf
(
"横坐标:%d,纵坐标:%d"
,
xy
[
0
],
xy
[
1
]);
gotoxy
(
xy
[
0
]
*
2
,
xy
[
1
]);
//这里蛇头就往前移动了
BackGround
(
0
,
3
);
//与蛇体一个颜色
printf
(
" "
);
//如果吃了果实//
if
(
bk
[
xy
[
0
]][
xy
[
1
]]
==
2
)
{
look
[
2
]
++
;
//分数加一
look
[
1
]
++
;
//长度加一
//更新分数
gotoxy
(
35
,
0
);
BackGround
(
7
,
0
);
printf
(
"现在得分是:%d,请再接再厉!^_^"
,
look
[
2
]);
while
(
bk
[
pp
][
qq
]
!=
0
)
{
pp
=
rand
()
%
15
+
1
;
qq
=
rand
()
%
15
+
1
;
}
bk
[
pp
][
qq
]
=
2
;
//将这个地方变为果实
gotoxy
(
pp
*
2
,
qq
);
BackGround
(
0
,
2
);
printf
(
" "
);
}
//如果撞了墙或者自己//
if
(
bk
[
xy
[
0
]][
xy
[
1
]]
==
1
||
bk
[
xy
[
0
]][
xy
[
1
]]
==
3
)
{
look
[
3
]
=
1
;
//表示已经输了
gotoxy
(
6
,
6
);
BackGround
(
7
,
0
);
printf
(
"你输了,最后得分:%d"
,
look
[
2
]);
}
bk
[
xy
[
0
]][
xy
[
1
]]
=
3
;
//使这个位置变成蛇
//接下来要检测蛇然后刷新蛇的位置//
for
(
int
i
=
0
;
i
<=
16
;
i
++
)
for
(
int
j
=
0
;
j
<=
16
;
j
++
)
{
if
(
move
[
i
][
j
]
==
move
[
xy
[
0
]][
xy
[
1
]]
-
look
[
1
]){
//如果符合这个条件,则表示蛇已经移动出这个位置了
//要删除这个位置的蛇尾巴
//一次只有一个方块会符合要求吧?
bk
[
i
][
j
]
=
0
;
gotoxy
(
i
*
2
,
j
);
BackGround
(
0
,
0
);
printf
(
" "
);
break
;
//一次只找一个
}
}
end:
;
}
int
main
()
{
int
bk
[
20
][
20
],
xy
[
2
],
move
[
20
][
20
],
look
[
4
];
xy
[
1
]
=
xy
[
0
]
=
8
;
srand
((
unsigned
)
time
(
NULL
));
//初始化随机种子
system
(
"pause"
);
restart
(
bk
,
look
,
move
);
while
(
look
[
3
]
==
0
)
{
Sleep
(
200
);
//休眠400ms一次
map
(
bk
,
look
,
xy
,
move
);
}
system
(
"pause"
);
printf
(
"游戏结束,谢谢游玩!^_^"
);
return
0
;
}
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录