更新不易,麻烦多多点赞,欢迎你的提问,感谢你的转发,
最后的最后,关注我,关注我,关注我,你会看到更多有趣的博客哦!!!
喵喵喵,你对我真的很重要。
额,我有点晕了,今天先上框架版,晚上在进行优化,这个代码有点多,还跳来跳去,有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;
}
(水字数)贪吃蛇的游戏介绍
背景设定
编辑 播报
贪食蛇游戏图面(19张)
1976年,Gremlin平台推出了一款经典街机游戏Blockade。游戏中,两名玩家分别控制一个角色在屏幕上移动,所经之处砌起围栏。角色只能向左、右方向90度转弯,游戏目标保证让对方先撞上屏幕或围栏。 听起来有点复杂,其实就是下面这个样子:
基本上就是两条每走一步都会长大的贪吃蛇比谁后完蛋,玩家要做的就是避免撞上障碍物和越来越长的身体。更多照片、视频可以看 GamesDBase 的介绍。
Blockade 很受欢迎,类似的游戏先后出现在 Atari 2600、TRS-80、苹果 2 等早期游戏机、计算机上。但真正让这种游戏形式红遍全球的还是21年后随诺基亚手机走向世界的贪吃蛇游戏——Snake。
操作指南
编辑 播报
玩家使用方向键操控一条长长的蛇不断吞下豆子,同时蛇身随着吞下的豆子不断变长,当蛇头撞到蛇身或障壁时游戏结束。贪吃蛇最初为人们所知的是诺基亚手机附带的一个小游戏,它伴随着诺基亚手机走向世界。现在的贪吃蛇出现了许多衍生版本,并被移植到各种平台上。
游戏特色
编辑 播报
贪吃蛇原型游戏图片
贪食蛇游戏操作简单,可玩性比较高。这个游戏难度最大的不是蛇长得很长的时候,而是开始。那个时候蛇身很短,看上去难度不大,却最容易死掉,因为把玩一条小短蛇让人容易走神,失去耐心。由于难度小,你会不知不觉加快调整方向的速度,在游走自如的时候蛇身逐渐加长了,而玩家却没有意识到危险,在最得意洋洋的一刻突然死亡。
贪食蛇的另一个危险期在于游戏开始几十秒之后。由于玩家的注意力高度集中,精神紧张,此时局面稍好,就会不由自主地想放松一下,结果手指一松劲,贪食蛇就死了。所以贪食蛇可以算作一个敏捷型的小游戏。
游戏评价
编辑 播报
贪吃蛇游戏画面
和别的游戏不同,贪食蛇是一个悲剧性的游戏。许多电子游戏都是以操作者的胜利而告终,而贪食蛇的结局却是死亡。不管玩得多么纯熟,技术多么高超,你最终听到的都是贪食蛇的一声惨叫。当手机上的小蛇越长越长,积分越来越高的时候,死亡也就越来越近。那时候忙的不是为了吃豆子长身体,而是为了避免撞墙。你会发现你穷于应付,四处奔忙。贪食蛇最要命的就在一个“贪”字上。
要死,要死,要死,我现在就剩一口气了,啊————。
本来想边敲边写的,可是代码跳来跳去,我的灵魂已经跑出来了,明天再梳理一遍,这一篇博客是16个40分钟的成果,我想一篇博客讲完,脑壳有点疼。希望明天梳理会好用些,今天我已经吐血了。
更新不易,麻烦多多点赞,欢迎你的提问,感谢你的转发,
最后的最后,关注我,关注我,关注我,你会看到更多有趣的博客哦!!!
喵喵喵,你对我真的很重要。