更新不易,麻烦多多点赞,欢迎你的提问,感谢你的转发,
最后的最后,关注我,关注我,关注我,你会看到更多有趣的博客哦!!!
喵喵喵,你对我真的很重要。
额,我有点晕了,今天先上框架版,晚上在进行优化,这个代码有点多,还跳来跳去,有F1和F2为实现,重新玩一次效果不佳,咬到自己那里的调用也有问题。
这是贪吃蛇的第一版,后期将会升级,希望可以弄懂每一步,而不是抄代码。
目录
首先的首先,这次我编译器是下面这个(需要安装包,请私信Q一下小喵),养成一个好习惯。
原码,仅供侦错
-
#include<stdio.h>
-
#include<stdlib.h>
-
#include<windows.h>//要使用windows的api ,lrq
-
//因为要用到随机数函数,所以要调用time.h文件
-
#include<time.h>
-
#include<conio.h>//用来接收键盘的输入输出
-
//
-
//预定义
-
#define U 1
-
#define D 2
-
#define L 3
-
#define R 4
-
//U上 D下 L左 R右
-
/
-
//定义全局变量
-
typedef
struct
snake
-
{
-
int x;
-
int y;
-
struct
snake* next;
-
}snake;
-
-
snake *head;
//指向蛇头的指针
-
snake *food;
//创建的食物
-
snake *q;
//用来遍历蛇的结点的
-
-
int status;
-
-
int add=
10;
//每个食物的得分
-
int sumScore=
0;
//总得分
-
int highScore=
0;
//最高分
-
-
//三种结束状态变量
-
//1,撞墙 2,自己咬到自己了 3,主动退出
-
int endGameStatus=
0;
-
-
//函数声明
-
void createMap();
-
//坐标转换
-
void gotoXY(int a,int b);
-
//颜色更换
-
int color(int x);
-
//创建蛇
-
void initSnake();
-
//创建食物
-
void createFood();
-
//侦听键盘事件
-
void keyboardControl();
-
//让蛇动起来
-
int snakeMove();
-
//撞墙停止
-
int cantCrossWall();
-
//自己咬到自己
-
int biteSelf();
-
//主页面上小提示
-
void screenTips();
-
//结束页面
-
void endGame();
-
//匹诺曹绘制
-
void LostDraw();
-
void File_In();
-
void File_Out();
-
void choose();
-
void printsnake();
-
void welcometoGame();
-
-
/*
-
字符拼成英文图案
-
*/
-
void printsnake()
-
{
-
color(
2);
-
printf(
" \n");
-
printf(
" __________ ___ \n");
-
printf(
" / \\ / \\ \\ |____ __\\__ \n");
-
printf(
" / ________ \\ / ___ \\ _/ __ | | / \n");
-
printf(
" | | |__| _/_ |_| / [|] |/ \n");
-
printf(
" | | | | | / _|_ \\__/ \n");
-
printf(
" \\ \\_______ / \\ |___/ ____ \n");
-
printf(
" \\ \\ ____ ____ ____ __ | | ___ ______ \n");
-
printf(
" \\_______ \\ | |/ \\ / \\_/ / | | / / / \\ \n");
-
printf(
" \\ \\ | ___ \\ / ____ / | |/ / / ____ \\ \n");
-
printf(
" __ | | | / \\ \\ | | | / | / | /____\\ | \n");
-
printf(
" \\ \\_______| | | | | | | |__| | | \\ | ________/ \n");
-
printf(
" \\ / | | | | \\ \\ | |\\ \\ \\ \\____ \n");
-
printf(
" \\__________/ |__| |__| \\___/\\__\\ |__| \\__\\ \\______/ \n");
-
-
}
-
void welcometoGame()
-
{
-
int n=
0;
-
int i=
0;
-
int j=
0;
-
gotoXY(
43,
18);
-
color(
11);
-
printf(
"贪 吃 蛇 游 戏");
-
color(
14);
-
for(i=
20;i<=
26;i++)
-
{
-
-
for(j=
27;j<=
74;j++)
-
{
-
gotoXY(j,i);
-
if(i==
20 ||i==
26)
-
{
-
printf(
"-");
-
}
else
if(j==
27||j==
74)
-
{
-
printf(
"|");
-
}
-
}
-
}
-
gotoXY(
36,
22);
-
color(
10);
-
printf(
"1.开始游戏");
-
gotoXY(
50,
22);
-
color(
10);
-
printf(
"2.游戏说明");
-
gotoXY(
36,
24);
-
color(
10);
-
printf(
"3.退出游戏");
-
gotoXY(
28,
27);
-
color(
3);
-
printf(
"请选择[1 2 3]:[ ]\b\b");
//\b是退格使光标处于两个中括号之间
-
color(
14);
-
scanf(
"%d",&n);
-
switch(n)
-
{
-
case
1:
-
system(
"cls");
-
File_Out();
-
sumScore=
0;
-
createMap();
-
screenTips();
-
initSnake();
-
createFood();
-
keyboardControl();
-
break;
-
case
2:
-
//游戏说明界面
-
break;
-
case
3:
-
exit(
0);
-
break;
-
default:
-
break;
-
-
}
-
-
}
-
-
-
-
void endGame()
-
{
-
//清屏操作
-
system(
"cls");
-
LostDraw();
-
if(endGameStatus==
1)
-
{
-
//TODO
-
gotoXY(
35,
9);
-
color(
7);
-
printf(
"对不起,你撞墙了!游戏结束");
-
}
else
if(endGameStatus==
2)
-
{
-
//TODO
-
gotoXY(
35,
9);
-
color(
7);
-
printf(
"对不起,你咬到自己了!游戏结束");
-
}
-
else
if(endGameStatus==
3)
-
{
-
//TODO
-
gotoXY(
35,
9);
-
color(
7);
-
printf(
"游戏结束!");
-
}
-
gotoXY(
43,
12);
-
printf(
"你的得分是:%d分",sumScore);
-
//判断得分是否需要存储
-
if(sumScore>=highScore)
-
{
-
color(
10);
-
gotoXY(
33,
16);
-
printf(
"创纪录了,最高分被你刷新了!");
-
//最高分存入文件当中
-
File_In();
-
}
else{
-
gotoXY(
33,
16);
-
printf(
"继续努力吧~你离最高分还差:%d",highScore-sumScore);
-
}
-
//调用选择选项
-
choose();
-
-
}
-
-
-
void choose()
-
{
-
int n=
0;
-
gotoXY(
30,
23);
-
color(
12);
-
printf(
"重玩一局[1]");
-
gotoXY(
50,
23);
-
printf(
"溜了溜了[2]");
-
gotoXY(
43,
25);
-
printf(
"选择:");
-
scanf(
"%d",&n);
-
switch(n)
-
{
-
case
1:
-
system(
"cls");
-
printsnake();
-
//开始界面
-
welcometoGame();
-
break;
-
case
2:
-
exit(
0);
-
break;
-
default:
-
gotoXY(
35,
27);
-
color(
12);
-
printf(
"你输入的有误,请重新输入");
-
break;
-
-
}
-
}
-
-
-
//文件读写
-
void File_In()
-
{
-
//定义文件指针
-
FILE *fp;
-
//指针关联文件
-
fp=
fopen(
"save.txt",
"w+");
-
//通过文件指针向文件写入内容
-
fprintf(fp,
"%d",sumScore);
-
//关闭文件
-
fclose(fp);
-
}
-
-
void File_Out()
-
{
-
FILE *pp;
-
pp=
fopen(
"save.txt",
"a+");
-
fscanf(pp,
"%d",&highScore);
-
fclose(pp);
-
-
}
-
-
-
void LostDraw() {
-
/*
-
失败界面
-
*/
-
system(
"cls");
-
int i;
-
gotoXY(
45,
1);
-
color(
6);
-
printf(
" |-----| ");
//匹诺曹的帽子
-
gotoXY(
45,
2);
-
color(
6);
-
printf(
" | | ");
-
gotoXY(
43,
3);
-
color(
6);
-
printf(
"-------------");
-
-
gotoXY(
44,
4);
-
color(
14);
-
printf(
"(");
-
-
gotoXY(
47,
4);
-
color(
15);
-
printf(
" > <");
//眼睛
-
-
gotoXY(
54,
4);
-
color(
14);
-
printf(
")");
-
-
gotoXY(
17,
5);
-
color(
11);
-
printf(
"+------------------------");
//上边框
-
-
gotoXY(
35,
5);
-
color(
14);
-
printf(
"oOOo");
-
-
gotoXY(
39,
5);
-
color(
11);
-
printf(
"----------");
//上边框
-
-
gotoXY(
48,
5);
-
color(
14);
-
printf(
"| |");
//鼻子
-
gotoXY(
48,
6);
-
color(
14);
-
printf(
"|_|");
-
-
gotoXY(
51,
5);
-
color(
11);
-
printf(
"----------");
//上边框
-
-
gotoXY(
61,
5);
-
color(
14);
-
printf(
"oOOo");
-
-
gotoXY(
65,
5);
-
color(
11);
-
printf(
"-----------------+");
//上边框
-
-
for (i =
6; i <=
19; i++) {
//竖边框
-
gotoXY(
17, i);
-
printf(
"|");
-
gotoXY(
82, i);
-
printf(
"|");
-
}
-
-
gotoXY(
17,
20);
-
printf(
"+------------------------------------------");
//下边框
-
-
gotoXY(
60,
20);
-
color(
11);
-
printf(
"----------------------+");
//下边框
-
-
-
-
}
-
-
-
void screenTips(){
-
color(
11);
-
gotoXY(
64,
4);
-
printf(
"☆最高记录是:%d☆",highScore);
-
color(
14);
-
gotoXY(
64,
6);
-
printf(
"当前得分:%d",sumScore);
-
gotoXY(
73,
11);
-
printf(
"小提示");
-
-
gotoXY(
60,
13);
-
color(
6);
-
printf(
"§--------------------§");
-
-
gotoXY(
60,
26);
-
color(
6);
-
printf(
"§--------------------§");
-
-
gotoXY(
64,
14);
-
color(
3);
-
printf(
"每个食物得分:%d分",add);
-
-
gotoXY(
64,
16);
-
printf(
"不能撞墙,不能咬到自己");
-
-
gotoXY(
64,
18);
-
printf(
"用上,下,左,右箭头分别控制方向");
-
-
gotoXY(
64,
20);
-
printf(
"F1键加速,F2键减速");
-
-
gotoXY(
64,
22);
-
printf(
"空格键暂停游戏");
-
-
gotoXY(
64,
24);
-
printf(
"Esc键退出游戏");
-
-
}
-
-
-
int biteSelf()
-
{
-
snake *self;
//这里不涉及内存分配,它只是涉及只向的内容的变化
-
self=head->next;
-
while(self!=
NULL)
-
{
-
//TODO
-
if(self->x==head->x&&self->y==head->y)
-
{
-
return
1;
-
}
-
self = self->next;
-
}
-
return
0;
-
}
-
-
-
int cantCrossWall(){
-
if(head->x==
0||head->x==
56||head->y==
0||head->y==
26)
-
{
-
system(
"cls");
-
gotoXY(
30,
6);
-
printf(
"撞墙了");
-
return
1;
-
}
-
return
0;
-
}
-
-
-
int snakeMove()
-
{
-
snake *newNode;
-
-
newNode = (snake*)
malloc(
sizeof(snake));
-
if(status==U)
-
{
-
newNode->x=head->x;
-
newNode->y=head->y
-1;
-
}
-
if (status == D) {
-
newNode->x = head->x;
-
newNode->y = head->y +
1;
-
}
-
if (status == L) {
-
newNode->x = head->x -
2;
-
newNode->y = head->y;
-
}
-
if (status == R) {
-
//TODO
-
newNode->x = head->x +
2;
-
newNode->y = head->y;
-
}
-
-
newNode->next=head;
-
//将新的结点赋值给head
-
head=newNode;
-
if(
cantCrossWall())
-
{
-
status =
0;
-
endGame();
-
return
3;
-
}
-
-
//判断新的结点是否有食物
-
q=head;
-
if(newNode->x==food->x&&newNode->y==food->y)
-
{
-
while(q!=
NULL)
-
{
-
//TODO
-
gotoXY(q->x,q->y);
-
color(
14);
-
printf(
"◆");
-
q=q->next;
-
}
-
//吃掉食物过后总分要加上单个食物的分值
-
sumScore+=add;
-
//调用一次
-
screenTips();
-
//食物被吃掉了,再创建一个
-
createFood();
-
-
}
else{
-
while(q->next->next!=
NULL)
-
{
-
//TODO
-
gotoXY(q->x,q->y);
-
color(
14);
-
printf(
"◆");
-
q=q->next;
-
}
-
//把倒数第一个变成原来的地图形状
-
gotoXY(q->next->x,q->next->y);
-
color(
3);
-
printf(
"■");
-
//释放内存和指针
-
free(q->next);
-
q->next=
NULL;
-
}
-
if(
biteSelf()==
1)
-
{
-
endGame();
-
return
2;
-
}
-
return
0;
-
}
-
-
-
void keyboardControl()
-
{
-
status =R;
//默认向右走 *
-
while(
1)
-
{
-
//TODO
-
//侦听所有键盘事件状态
-
if(
GetAsyncKeyState(VK_UP)&&status !=D)
-
{
-
//需要一个变量,来接收是哪个键按下去了
-
status =U;
-
}
else
if(
GetAsyncKeyState(VK_DOWN)&&status !=U)
-
{
-
status=D;
-
}
-
else
if(
GetAsyncKeyState(VK_LEFT)&&status !=R)
-
{
-
status=L;
-
}
-
else
if(
GetAsyncKeyState(VK_RIGHT)&&status !=L)
-
{
-
status=R;
-
}
-
//空格键游戏暂停,蛇停止运动
-
if(
GetAsyncKeyState(VK_SPACE))
-
{
-
//TODO
-
//第一次按空格键,进程挂起,
-
while(
1)
-
{
-
Sleep(
300);
-
//第二次空格键,进程退出
-
if(
GetAsyncKeyState(VK_SPACE))
-
{
-
break;
-
}
-
}
//按下ESC键,游戏结束
-
}
else
if(
GetAsyncKeyState(VK_ESCAPE)){
-
endGameStatus=
3;
-
endGame();
-
break;
-
}
-
Sleep(
300);
-
//让蛇动起来
-
if(
snakeMove()!=
0)
-
{
-
break;
-
}
-
}
-
}
-
-
-
void createFood()
-
{
-
snake* food1;
-
food1=(snake*)
malloc(
sizeof(snake));
-
//加上随机数种子,防止伪随机
-
srand((
unsigned)
time(
NULL));
-
food1->x=
rand()%
53+
2;
//2.54没听懂?问问
-
//【2~54】
-
while(food1->x%
2!=
0)
-
{
-
//TODO
-
food1->x=
rand()%
53+
2;
-
}
-
food1->y=
rand()%
23+
1;
//?2.58
-
//food1->next=NULL;?
-
q=head;
-
while(q->next!=
NULL)
-
{
-
if(q->x==food1->x&&q->y==food1->y)
-
{
-
free(food1);
-
createFood();
//如果和蛇身重合了,就再次创建食物
-
}
-
q=q->next;
-
}
-
//把食物打出来
-
gotoXY(food1->x,food1->y);
-
color(
10);
-
printf(
"●");
-
food=food1;
-
}
-
-
-
-
void initSnake()
-
{
-
int i=
1;
-
color(
15);
-
snake *ss;
//结点
-
//分配内存空间,使用头插法(单链表),以设定的x,y位置开始插入
-
ss =(snake*)
malloc(
sizeof(snake));
//?
-
ss->x=
24;
-
ss->y=
5;
-
ss->next=
NULL;
-
//利用头插法,插入剩下的四个结点
-
for(i=
1;i<=
4;i++)
-
{
-
head=(snake*)
malloc(
sizeof(snake));
-
head->next=ss;
-
head->x=
24+i*
2;
-
head->y=
5;
-
ss=head;
//将蛇头变成蛇尾,然后重复循环
-
}
-
//打印蛇身
-
while(ss!=
NULL)
-
{
-
//TODO
-
gotoXY(ss->x,ss->y);
-
printf(
"◆");
-
ss=ss->next;
-
}
-
}
-
-
int color(int x)
-
{
-
//更改待打印颜色属性
-
SetConsoleTextAttribute(
GetStdHandle(STD_OUTPUT_HANDLE),x);
-
return
0;
-
}
-
-
-
void gotoXY(int a,int b)
-
{
-
COORD c;
//生成c的实例
-
c.X=a;
-
c.Y=b;
-
SetConsoleCursorPosition(
GetStdHandle(STD_OUTPUT_HANDLE),c);
-
}
-
//函数定义/函数实现
-
void createMap()
-
{
-
int i,j;
-
color(
6);
//0~255
-
//两个for填边框的色
-
for(i=
0;i<
58;i+=
2)
-
{
-
gotoXY(i,
0);
-
printf(
"□");
-
gotoXY(i,
26);
-
printf(
"□");
-
}
-
for(i=
1;i<
26;i++)
-
{
-
gotoXY(
0,i);
-
printf(
"□");
-
gotoXY(
56,i);
-
printf(
"□");
-
}
-
//填中间的色
-
color(
3);
-
for(i=
2;i<
56;i+=
2)
-
{
-
for(j=
1;j<
26;j++)
-
{
-
gotoXY(i,j);
-
printf(
"■");
-
}
-
}
-
-
}
-
-
-
int main()
-
{
-
//设置控制台的宽高
-
system(
"mode con cols=110 lines=30");
-
printsnake();
-
welcometoGame();
-
while(
1)
-
{
-
-
}
-
return
0;
-
}
首先的首先,这次我编译器是下面这个(需要安装包,请私信Q一下小喵),养成一个好习惯。
好习惯:
一切以整体原代码为准,图片介绍仅供参考。没完成一步,建议编译一下,进行阶段性测试,这是一个非常实用的习惯,可以把bug缩小到子程序的范围,保证800来行代码的完成效率,谢谢。
小喵觉得图片能更加直观的展示代码(颜色有直观的区别),便于侦错,但csdn系统希望小喵有更完善的描述,所有小喵会附上局部代码,仅供侦错,难免重复,麻烦谅解,水一水字数了。
窗口设置
地图绘制
局部代码(仅供侦错)
-
void gotoXY(int a,int b)
-
{
-
COORD c;
//生成c的实例
-
c.X=a;
-
c.Y=b;
-
SetConsoleCursorPosition(
GetStdHandle(STD_OUTPUT_HANDLE),c);
-
}
-
//函数定义/函数实现
-
void createMap()
-
{
-
int i,j;
-
color(
6);
//0~255
-
//两个for填边框的色
-
for(i=
0;i<
58;i+=
2)
-
{
-
gotoXY(i,
0);
-
printf(
"□");
-
gotoXY(i,
26);
-
printf(
"□");
-
}
-
for(i=
1;i<
26;i++)
-
{
-
gotoXY(
0,i);
-
printf(
"□");
-
gotoXY(
56,i);
-
printf(
"□");
-
}
-
//填中间的色
-
color(
3);
-
for(i=
2;i<
56;i+=
2)
-
{
-
for(j=
1;j<
26;j++)
-
{
-
gotoXY(i,j);
-
printf(
"■");
-
}
-
}
-
-
}
写一个颜色变换的函数
进行阶段性测试
说明其中的函数
蛇结点创建
-
void
initSnake()
-
{
-
int i=
1;
-
color(
15);
-
snake *ss;
//结点
-
//分配内存空间,使用头插法(单链表),以设定的x,y位置开始插入
-
ss =(snake*)
malloc(
sizeof(snake));
//?
-
ss
->x=
24;
-
ss
->y=
5;
-
ss
->next=NULL;
-
//利用头插法,插入剩下的四个结点
-
for(i=
1;i<=
4;i++)
-
{
-
head=(snake*)
malloc(
sizeof(snake));
-
head
->next=ss;
-
head
->x=
24+i*
2;
-
head
->y=
5;
-
ss=head;
//将蛇头变成蛇尾,然后重复循环
-
}
-
//打印蛇身
-
while(ss!=NULL)
-
{
-
//TODO
-
gotoXY(ss
->x,ss
->y);
-
printf(
"◆");
-
ss=ss
->next;
-
}
-
}
食物创建
-
void createFood()
-
{
-
snake* food1;
-
food1=(snake*)malloc(sizeof(snake));
-
//加上随机数种子,防止伪随机
-
srand((unsigned)
time(NULL));
-
food1->
x=
rand()%53+
2;
//
2.54没听懂?问问
-
//【
2~
54】
-
while(food1->
x%2!=
0)
-
{
-
//TODO
-
food1->
x=
rand()%53+
2;
-
}
-
food1->
y=
rand()%23+
1;
//?
2.58
-
//food1->
next=NULL;?
-
q=head;
-
while(
q->
next!=NULL)
-
{
-
if(
q->
x==food1->
x&&
q->
y==food1->
y)
-
{
-
free(food1);
-
createFood();
//如果和蛇身重合了,就再次创建食物
-
}
-
q=
q->
next;
-
}
-
//把食物打出来
-
gotoXY(food1->
x,food1->
y);
-
color(
10);
-
printf(
"●");
-
food=food1;
-
}
键盘事件侦听
-
void
keyboardControl(
)
-
{
-
status =R;
//默认向右走
-
while(
1)
-
{
-
//TODO
-
//侦听所有键盘事件状态
-
if(
GetAsyncKeyState(
VK_UP)&&status !=D)
-
{
-
//需要一个变量,来接收是哪个键按下去了
-
status =U;
-
}
else
if(
GetAsyncKeyState(
VK_DOWN)&&status !=U)
-
{
-
status=D;
-
}
-
else
if(
GetAsyncKeyState(
VK_LEFT)&&status !=R)
-
{
-
status=L;
-
}
-
else
if(
GetAsyncKeyState(
VK_RIGHT)&&status !=L)
-
{
-
status=R;
-
}
-
Sleep(
500);
-
//让蛇动起来
-
snakeMove();
-
}
-
}
蛇的移动
-
//让蛇动起来
-
void
snakeMove();
-
-
void
snakeMove()
-
{
-
snake *newNode;
-
-
newNode = (snake*)
malloc(
sizeof(snake));
-
if(status==U)
-
{
-
newNode
->x=head
->x;
-
newNode
->y=head
->y-
1;
-
}
-
if (status == D) {
-
newNode
->x = head
->x;
-
newNode
->y = head
->y +
1;
-
}
-
if (status == L) {
-
newNode
->x = head
->x -
2;
-
newNode
->y = head
->y;
-
}
-
if (status == R) {
-
//TODO
-
newNode
->x = head
->x +
2;
-
newNode
->y = head
->y;
-
}
-
-
newNode
->next=head;
-
//将新的结点赋值给head
-
head=newNode;
-
//判断新的结点是否有食物
-
q=head;
-
if(newNode
->x==food
->x&&newNode
->y==food
->y)
-
{
-
while(q!=NULL)
-
{
-
//TODO
-
gotoXY(q
->x,q
->y);
-
color(
14);
-
printf(
"◆");
-
q=q
->next;
-
}
-
//食物被吃掉了,再创建一个
-
createFood();
-
}
else{
-
while(q
->next
->next!=NULL)
-
{
-
//TODO
-
gotoXY(q
->x,q
->y);
-
color(
14);
-
printf(
"◆");
-
q=q
->next;
-
}
-
//把倒数第一个变成原来的地图形状
-
gotoXY(q
->next
->x,q
->next
->y);
-
color(
3);
-
printf(
"■");
-
//释放内存和指针
-
free(q
->next);
-
q
->next=NULL;
-
}
-
-
}
蛇是可以动起来了,但蛇撞墙后出bug,要进行进一步修改
屏幕提示
全局变量:
子程序
-
//主页面上小提示
-
void
screenTips();
-
-
void
screenTips(){
-
color(
11);
-
gotoXY(
64,
4);
-
printf("☆最高记录是:
53☆");
-
color(
14);
-
gotoXY(
64,
6);
-
printf("当前得分:
20");
-
gotoXY(
73,
11);
-
printf("小提示");
-
-
gotoXY(
60,
13);
-
color(
6);
-
printf("§--------------------§");
-
-
gotoXY(
60,
26);
-
color(
6);
-
printf("§--------------------§");
-
-
gotoXY(
64,
14);
-
color(
3);
-
printf("每个食物得分:%d分",add);
-
-
gotoXY(
64,
16);
-
printf("不能撞墙,不能咬到自己");
-
-
gotoXY(
64,
18);
-
printf("用上,下,左,右箭头分别控制方向");
-
-
gotoXY(
64,
20);
-
printf("F1键加速,F2键减速");
-
-
gotoXY(
64,
22);
-
printf("空格键暂停游戏");
-
-
gotoXY(
64,
24);
-
printf("Esc键退出游戏");
-
-
}
结束页面
匹诺曹
-
void
LostDraw() {
-
/*
-
失败界面
-
*/
-
system("cls");
-
int
i;
-
gotoXY(
45,
1);
-
color(
6);
-
printf(" |-----| ");
//匹诺曹的帽子
-
gotoXY(
45,
2);
-
color(
6);
-
printf(" | | ");
-
gotoXY(
43,
3);
-
color(
6);
-
printf("-------------");
-
-
gotoXY(
44,
4);
-
color(
14);
-
printf("(");
-
-
gotoXY(
47,
4);
-
color(
15);
-
printf(" > <");
//眼睛
-
-
gotoXY(
54,
4);
-
color(
14);
-
printf(")");
-
-
gotoXY(
17,
5);
-
color(
11);
-
printf("+------------------------");
//上边框
-
-
gotoXY(
35,
5);
-
color(
14);
-
printf("oOOo");
-
-
gotoXY(
39,
5);
-
color(
11);
-
printf("----------");
//上边框
-
-
gotoXY(
48,
5);
-
color(
14);
-
printf("| |");
//鼻子
-
gotoXY(
48,
6);
-
color(
14);
-
printf("|_|");
-
-
gotoXY(
51,
5);
-
color(
11);
-
printf("----------");
//上边框
-
-
gotoXY(
61,
5);
-
color(
14);
-
printf("oOOo");
-
-
gotoXY(
65,
5);
-
color(
11);
-
printf("-----------------+");
//上边框
-
-
for (i =
6; i <=
19; i++) {
//竖边框
-
gotoXY(
17, i);
-
printf("|");
-
gotoXY(
82, i);
-
printf("|");
-
}
-
-
gotoXY(
17,
20);
-
printf("+------------------------------------------");
//下边框
-
-
gotoXY(
60,
20);
-
color(
11);
-
printf("----------------------+");
//下边框
-
-
-
-
}
结束页面实现及其子函数实现
-
void endGame()
-
{
-
//清屏操作
-
system(
"cls");
-
LostDraw();
-
if(endGameStatus==
1)
-
{
-
//TODO
-
gotoXY(
35,
9);
-
color(
7);
-
printf(
"对不起,你撞墙了!游戏结束");
-
}
else
if(endGameStatus==
2)
-
{
-
//TODO
-
gotoXY(
35,
9);
-
color(
7);
-
printf(
"对不起,你咬到自己了!游戏结束");
-
}
-
else
if(endGameStatus==
3)
-
{
-
//TODO
-
gotoXY(
35,
9);
-
color(
7);
-
printf(
"游戏结束!");
-
}
-
gotoXY(
43,
12);
-
printf(
"你的得分是:%d分",sumScore);
-
//判断得分是否需要存储
-
if(sumScore>=highScore)
-
{
-
color(
10);
-
gotoXY(
33,
16);
-
printf(
"创纪录了,最高分被你刷新了!");
-
//最高分存入文件当中
-
File_In();
-
}
else{
-
gotoXY(
33,
16);
-
printf(
"继续努力吧~你离最高分还差:%d",highScore-sumScore);
-
}
-
//调用选择选项
-
choose();
-
-
}
-
-
-
void choose()
-
{
-
int n=
0;
-
gotoXY(
30,
23);
-
color(
12);
-
printf(
"重玩一局[1]");
-
gotoXY(
50,
23);
-
printf(
"溜了溜了[2]");
-
gotoXY(
43,
25);
-
printf(
"选择:");
-
scanf(
"%d",&n);
-
switch(n)
-
{
-
case
1:
-
system(
"cls");
-
printsnake();
-
//开始界面
-
welcometoGame();
-
break;
-
case
2:
-
exit(
0);
-
break;
-
default:
-
gotoXY(
35,
27);
-
color(
12);
-
printf(
"你输入的有误,请重新输入");
-
break;
-
-
}
-
}
-
-
-
//文件读写
-
void File_In()
-
{
-
//定义文件指针
-
FILE *fp;
-
//指针关联文件
-
fp=
fopen(
"save.txt",
"w+");
-
//通过文件指针向文件写入内容
-
fprintf(fp,
"%d",sumScore);
-
//关闭文件
-
fclose(fp);
-
}
-
-
void File_Out()
-
{
-
FILE *pp;
-
pp=
fopen(
"save.txt",
"a+");
-
fscanf(pp,
"%d",&highScore);
-
fclose(pp);
-
-
}
开始页面
-
/*
-
字符拼成英文图案
-
*/
-
void printsnake()
-
{
-
color(
2);
-
printf(
" \n");
-
printf(
" __________ ___ \n");
-
printf(
" / \\ / \\ \\ |____ __\\__ \n");
-
printf(
" / ________ \\ / ___ \\ _/ __ | | / \n");
-
printf(
" | | |__| _/_ |_| / [|] |/ \n");
-
printf(
" | | | | | / _|_ \\__/ \n");
-
printf(
" \\ \\_______ / \\ |___/ ____ \n");
-
printf(
" \\ \\ ____ ____ ____ __ | | ___ ______ \n");
-
printf(
" \\_______ \\ | |/ \\ / \\_/ / | | / / / \\ \n");
-
printf(
" \\ \\ | ___ \\ / ____ / | |/ / / ____ \\ \n");
-
printf(
" __ | | | / \\ \\ | | | / | / | /____\\ | \n");
-
printf(
" \\ \\_______| | | | | | | |__| | | \\ | ________/ \n");
-
printf(
" \\ / | | | | \\ \\ | |\\ \\ \\ \\____ \n");
-
printf(
" \\__________/ |__| |__| \\___/\\__\\ |__| \\__\\ \\______/ \n");
-
-
}
-
void welcometoGame()
-
{
-
int n
=
0;
-
int i
=
0;
-
int j
=
0;
-
gotoXY(
43,
18);
-
color(
11);
-
printf(
"贪 吃 蛇 游 戏");
-
color(
14);
-
for(i
=
20;i
<=
26;i
++)
-
{
-
-
for(j
=
27;j
<=
74;j
++)
-
{
-
gotoXY(j,i);
-
if(i
==
20
||i
==
26)
-
{
-
printf(
"-");
-
}
else
if(j
==
27
||j
==
74)
-
{
-
printf(
"|");
-
}
-
}
-
}
-
gotoXY(
36,
22);
-
color(
10);
-
printf(
"1.开始游戏");
-
gotoXY(
50,
22);
-
color(
10);
-
printf(
"2.游戏说明");
-
gotoXY(
36,
24);
-
color(
10);
-
printf(
"3.退出游戏");
-
gotoXY(
28,
27);
-
color(
3);
-
printf(
"请选择[1 2 3]:[ ]\b\b");
//\b是退格使光标处于两个中括号之间
-
color(
14);
-
scanf(
"%d",
&n);
-
switch(n)
-
{
-
case
1:
-
system(
"cls");
-
File_Out();
-
sumScore
=
0;
-
createMap();
-
screenTips();
-
initSnake();
-
createFood();
-
keyboardControl();
-
break;
-
case
2:
-
//游戏说明界面
-
break;
-
case
3:
-
exit(
0);
-
break;
-
default:
-
break;
-
-
}
-
-
}
头文件
-
#include<stdio.h>
-
#include<stdlib.h>
-
#include<windows.h>//要使用windows的api ,lrq
-
//因为要用到随机数函数,所以要调用time.h文件
-
#include<time.h>
-
#include<conio.h>//用来接收键盘的输入输出
-
//
-
//预定义
-
#define U 1
-
#define D 2
-
#define L 3
-
#define R 4
-
//U上 D下 L左 R右
全局变量
-
//定义全局变量
-
typedef
struct snake
-
{
-
int x;
-
int y;
-
struct snake* next;
-
}snake;
-
-
snake *head;
//指向蛇头的指针
-
snake *food;
//创建的食物
-
snake *q;
//用来遍历蛇的结点的
-
-
int status;
-
-
int add=
10;
//每个食物的得分
-
int sumScore=
0;
//总得分
-
int highScore=
0;
//最高分
-
-
//三种结束状态变量
-
//1,撞墙 2,自己咬到自己了 3,主动退出
-
int endGameStatus=
0;
函数声明
-
//函数声明
-
void createMap();
-
//坐标转换
-
void gotoXY(int a,int b);
-
//颜色更换
-
int color(int x);
-
//创建蛇
-
void initSnake();
-
//创建食物
-
void createFood();
-
//侦听键盘事件
-
void keyboardControl();
-
//让蛇动起来
-
int snakeMove();
-
//撞墙停止
-
int cantCrossWall();
-
//自己咬到自己
-
int biteSelf();
-
//主页面上小提示
-
void screenTips();
-
//结束页面
-
void endGame();
-
//匹诺曹绘制
-
void LostDraw();
-
void File_In();
-
void File_Out();
-
void choose();
-
void printsnake();
-
void welcometoGame();
主函数
-
int
main()
-
{
-
//设置控制台的宽高
-
system("mode con cols=
110 lines=
30");
-
printsnake();
-
welcometoGame();
-
while(
1)
-
{
-
-
}
-
return
0;
-
}
(水字数)贪吃蛇的游戏介绍
背景设定
编辑 播报
1976年,Gremlin平台推出了一款经典街机游戏Blockade。游戏中,两名玩家分别控制一个角色在屏幕上移动,所经之处砌起围栏。角色只能向左、右方向90度转弯,游戏目标保证让对方先撞上屏幕或围栏。 听起来有点复杂,其实就是下面这个样子:
基本上就是两条每走一步都会长大的贪吃蛇比谁后完蛋,玩家要做的就是避免撞上障碍物和越来越长的身体。更多照片、视频可以看 GamesDBase 的介绍。
Blockade 很受欢迎,类似的游戏先后出现在 Atari 2600、TRS-80、苹果 2 等早期游戏机、计算机上。但真正让这种游戏形式红遍全球的还是21年后随诺基亚手机走向世界的贪吃蛇游戏——Snake。
操作指南
编辑 播报
玩家使用方向键操控一条长长的蛇不断吞下豆子,同时蛇身随着吞下的豆子不断变长,当蛇头撞到蛇身或障壁时游戏结束。贪吃蛇最初为人们所知的是诺基亚手机附带的一个小游戏,它伴随着诺基亚手机走向世界。现在的贪吃蛇出现了许多衍生版本,并被移植到各种平台上。
游戏特色
编辑 播报
贪吃蛇原型游戏图片
贪食蛇游戏操作简单,可玩性比较高。这个游戏难度最大的不是蛇长得很长的时候,而是开始。那个时候蛇身很短,看上去难度不大,却最容易死掉,因为把玩一条小短蛇让人容易走神,失去耐心。由于难度小,你会不知不觉加快调整方向的速度,在游走自如的时候蛇身逐渐加长了,而玩家却没有意识到危险,在最得意洋洋的一刻突然死亡。
贪食蛇的另一个危险期在于游戏开始几十秒之后。由于玩家的注意力高度集中,精神紧张,此时局面稍好,就会不由自主地想放松一下,结果手指一松劲,贪食蛇就死了。所以贪食蛇可以算作一个敏捷型的小游戏。
游戏评价
编辑 播报
贪吃蛇游戏画面
和别的游戏不同,贪食蛇是一个悲剧性的游戏。许多电子游戏都是以操作者的胜利而告终,而贪食蛇的结局却是死亡。不管玩得多么纯熟,技术多么高超,你最终听到的都是贪食蛇的一声惨叫。当手机上的小蛇越长越长,积分越来越高的时候,死亡也就越来越近。那时候忙的不是为了吃豆子长身体,而是为了避免撞墙。你会发现你穷于应付,四处奔忙。贪食蛇最要命的就在一个“贪”字上。
要死,要死,要死,我现在就剩一口气了,啊————。
本来想边敲边写的,可是代码跳来跳去,我的灵魂已经跑出来了,明天再梳理一遍,这一篇博客是16个40分钟的成果,我想一篇博客讲完,脑壳有点疼。希望明天梳理会好用些,今天我已经吐血了。
更新不易,麻烦多多点赞,欢迎你的提问,感谢你的转发,
最后的最后,关注我,关注我,关注我,你会看到更多有趣的博客哦!!!
喵喵喵,你对我真的很重要。
转载:https://blog.csdn.net/ormstq/article/details/128433220