版权声明:若想转载,请在下面评论留言 https://blog.csdn.net/qq_40935723/article/details/86553671
若想进一步了解请看这份博客
用c语言编写贪吃蛇讲解 https://mp.csdn.net/postedit/86553391
编译环境: Dev c++
(不同的编译环境可能导致有些东西无法运行,但编写贪吃蛇的思想是一样的)
源码如下:
创建 SnakeMap.h 的头文件
#include<stdlib.h>
#ifndef SNAKEMAP_H
#define SNAKEMAP_H
#define LengthWall 50 //墙的长度
#define WidthWall 25 //墙的宽度
int Map[LengthWall+1][WidthWall+1]; //创建初始地图
typedef struct snake{
int x,y;
struct snake *SnakeNext;
}SNAKE,*Snake;
//用于移动光标
void gotoxy(int x,int y){
COORD pos;
pos.X = x-1;
pos.Y = y-1;
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),pos);
}
void FirstMap(Snake &snake){
for(int i=1;i<=LengthWall;i++){
for(int j=1;j<=WidthWall;j++){
if(j==1||j==WidthWall)
Map[i][j]=1;
else if((j>=2&&j<=WidthWall-1)&&(i==1||i==LengthWall))
Map[i][j]=1;
}
}
for(int i=1;i<=LengthWall;i++){
for(int j=1;j<=WidthWall;j++){
if((j==1||j==WidthWall)&&Map[i][j]==1)
{
gotoxy(i,j);
printf("=");
}
else if((j>=2&&j<=WidthWall-1)&&(i==1||i==LengthWall)&&Map[i][j]==1)
{
gotoxy(i,j);
printf("|");
}
}
}
snake =(Snake)malloc(sizeof(Snake));
Snake p=snake,s;
for(int i=LengthWall-4;i<=LengthWall-2;i++)
{
s=(Snake)malloc(sizeof(SNAKE));
s->x=i;s->y=12;
p->SnakeNext=s;
p=s;
}
p->SnakeNext=NULL;
p=snake->SnakeNext;
gotoxy(p->x,p->y);
printf("O");
p=snake;
while(p->SnakeNext)
{
gotoxy(p->SnakeNext->x,p->SnakeNext->y);
printf("+");
p=p->SnakeNext;
}
}
void SecondMap(Snake &snake){
for(int i=1;i<=LengthWall;i++){
for(int j=1;j<=WidthWall;j++){
if(j==1||j==WidthWall)
Map[i][j]=1;
else if((j>=2&&j<=WidthWall-1)&&(i==1||i==LengthWall))
Map[i][j]=1;
}
}
for(int i=6;i<=18;i++)
Map[25][i]=1;
for(int i=1;i<=LengthWall;i++){
for(int j=1;j<=WidthWall;j++){
if((j==1||j==WidthWall)&&Map[i][j]==1)
{
gotoxy(i,j);
printf("=");
}
else if((j>=2&&j<=WidthWall-1)&&(i==1||i==LengthWall)&&Map[i][j]==1)
{
gotoxy(i,j);
printf("|");
}
else if(Map[i][j]==1)
{
gotoxy(i,j);
printf("#");
}
}
}
snake =(Snake)malloc(sizeof(Snake));
Snake p=snake,s;
for(int i=LengthWall-4;i<=LengthWall-2;i++)
{
s=(Snake)malloc(sizeof(SNAKE));
s->x=i;s->y=12;
p->SnakeNext=s;
p=s;
}
p->SnakeNext=NULL;
p=snake->SnakeNext;
gotoxy(p->x,p->y);
printf("O");
p=snake;
while(p->SnakeNext)
{
gotoxy(p->SnakeNext->x,p->SnakeNext->y);
printf("+");
p=p->SnakeNext;
}
}
void ThirdMap(Snake &snake){
for(int i=1;i<=LengthWall;i++){
for(int j=1;j<=WidthWall;j++){
if(j==1||j==WidthWall)
Map[i][j]=1;
else if((j>=2&&j<=WidthWall-1)&&(i==1||i==LengthWall))
Map[i][j]=1;
}
}
for(int i=12;i<=35;i++)
Map[i][12]=1;
for(int i=6;i<=18;i++)
Map[25][i]=1;
for(int i=1;i<=LengthWall;i++){
for(int j=1;j<=WidthWall;j++){
if((j==1||j==WidthWall)&&Map[i][j]==1)
{
gotoxy(i,j);
printf("=");
}
else if((j>=2&&j<=WidthWall-1)&&(i==1||i==LengthWall)&&Map[i][j]==1)
{
gotoxy(i,j);
printf("|");
}
else if(Map[i][j]==1)
{
gotoxy(i,j);
printf("#");
}
}
}
snake =(Snake)malloc(sizeof(Snake));
Snake p=snake,s;
for(int i=LengthWall-4;i<=LengthWall-2;i++)
{
s=(Snake)malloc(sizeof(SNAKE));
s->x=i;s->y=12;
p->SnakeNext=s;
p=s;
}
p->SnakeNext=NULL;
p=snake->SnakeNext;
gotoxy(p->x,p->y);
printf("O");
p=snake;
while(p->SnakeNext)
{
gotoxy(p->SnakeNext->x,p->SnakeNext->y);
printf("+");
p=p->SnakeNext;
}
}
#endif
创建 SnakeOperate.h 的头文件
#include<windows.h>
#include"SnakeMap.h"
#ifndef SNAKEOPERATE_H
#define SNAKEOPERATE_H
int GameScore=0; //用于统计游戏得分
int DifficultyLevel; //难度等级
struct Food{
int foodX,foodY;
};
Food food; //全局变量
//打印蛇的身体
void SnakeBody(Snake &snake){
Snake p=snake->SnakeNext;
gotoxy(p->x,p->y);
printf("O");
while(p->SnakeNext)
{
gotoxy(p->SnakeNext->x,p->SnakeNext->y);
printf("+");
p=p->SnakeNext;
}
}
//食物产生
void SnakeFood(Snake &snake,Food &food){
Snake p=snake;
int x,y;
bool result=true;
while(result)
{
food.foodX=rand()%(LengthWall-2)+2;
food.foodY=rand()%(WidthWall-2)+2;
if(Map[food.foodX][food.foodY]==1)
continue;
while(p->SnakeNext)
{
if(food.foodX==p->SnakeNext->x&&food.foodY==p->SnakeNext->y)break;
p=p->SnakeNext;
}
if(p->SnakeNext==NULL)result=false;
}
gotoxy(food.foodX,food.foodY);
printf("*");
}
//判断蛇是否吃到东西
bool SnakeEat(Snake &snake){
Snake p=snake->SnakeNext;
if(p->x==food.foodX&&p->y==food.foodY)
{
GameScore++;
SnakeFood(snake,food);
return true;
}
else
return false;
}
//游戏结果
void GameResult(){
system("cls");
gotoxy(40,5);
printf("Game Over\n");
gotoxy(40,7);
printf("游戏分数:%d\n",GameScore);
gotoxy(40,9);
printf("不要灰心,再接再厉\n");
system("PAUSE");
exit(0);
}
//判断蛇是否死亡
void SnakeDead(Snake &snake)
{
Snake p=snake->SnakeNext;
if(Map[p->x][p->y]==1)
GameResult();
p=snake->SnakeNext->SnakeNext;
while(p->SnakeNext)
{
if(snake->SnakeNext->x==p->x&&snake->SnakeNext->y==p->y)
GameResult();
p=p->SnakeNext;
}
}
//蛇的向上向下向左向右移动
void SnakeUp(Snake &snake)
{
Snake p=snake;
int x1,y1,x2,y2;
if(!SnakeEat(snake))
{
while(p->SnakeNext)p=p->SnakeNext;
gotoxy(p->x,p->y);
printf(" ");
p=snake;
x1=snake->SnakeNext->x;
y1=snake->SnakeNext->y;
y1--;
while(p->SnakeNext)
{
x2=p->SnakeNext->x;y2=p->SnakeNext->y;
p->SnakeNext->x=x1;p->SnakeNext->y=y1;
x1=x2;y1=y2;
p=p->SnakeNext;
}
}
else{
Snake val,temp;
val=(Snake)malloc(sizeof(SNAKE));
val->x=snake->SnakeNext->x;
val->y=snake->SnakeNext->y-1;
temp=snake->SnakeNext;
snake->SnakeNext=val;
val->SnakeNext=temp;
}
SnakeDead(snake);
SnakeBody(snake);
}
void SnakeDown(Snake &snake)
{
int x1,y1,x2,y2;
Snake p=snake;
if(!SnakeEat(snake))
{
while(p->SnakeNext)p=p->SnakeNext;
gotoxy(p->x,p->y);
printf(" ");
p=snake;
x1=snake->SnakeNext->x;
y1=snake->SnakeNext->y;
y1++;
while(p->SnakeNext)
{
x2=p->SnakeNext->x;y2=p->SnakeNext->y;
p->SnakeNext->x=x1;p->SnakeNext->y=y1;
x1=x2;y1=y2;
p=p->SnakeNext;
}
}
else{
Snake val,temp;
val=(Snake)malloc(sizeof(SNAKE));
val->x=snake->SnakeNext->x;
val->y=snake->SnakeNext->y+1;
temp=snake->SnakeNext;
snake->SnakeNext=val;
val->SnakeNext=temp;
}
SnakeDead(snake);
SnakeBody(snake);
}
void SnakeLeft(Snake &snake)
{
Snake p=snake;
int x1,y1,x2,y2;
if(!SnakeEat(snake))
{
while(p->SnakeNext)p=p->SnakeNext;
gotoxy(p->x,p->y);
printf(" ");
p=snake;
x1=snake->SnakeNext->x;
y1=snake->SnakeNext->y;
x1--;
while(p->SnakeNext)
{
x2=p->SnakeNext->x;y2=p->SnakeNext->y;
p->SnakeNext->x=x1;p->SnakeNext->y=y1;
x1=x2;y1=y2;
p=p->SnakeNext;
}
}
else{
Snake val,temp;
val=(Snake)malloc(sizeof(SNAKE));
val->x=snake->SnakeNext->x-1;
val->y=snake->SnakeNext->y;
temp=snake->SnakeNext;
snake->SnakeNext=val;
val->SnakeNext=temp;
}
SnakeDead(snake);
SnakeBody(snake);
}
void SnakeRight(Snake &snake)
{
Snake p=snake;
int x1,y1,x2,y2;
if(!SnakeEat(snake))
{
while(p->SnakeNext)p=p->SnakeNext;
gotoxy(p->x,p->y);
printf(" ");
p=snake;
x1=snake->SnakeNext->x;
y1=snake->SnakeNext->y;
x1++;
while(p->SnakeNext)
{
x2=p->SnakeNext->x;y2=p->SnakeNext->y;
p->SnakeNext->x=x1;p->SnakeNext->y=y1;
x1=x2;y1=y2;
p=p->SnakeNext;
}
}
else{
Snake val,temp;
val=(Snake)malloc(sizeof(SNAKE));
val->x=snake->SnakeNext->x+1;
val->y=snake->SnakeNext->y;
temp=snake->SnakeNext;
snake->SnakeNext=val;
val->SnakeNext=temp;
}
SnakeDead(snake);
SnakeBody(snake);
}
//控制方向wasd
void SnakeMove1(Snake &snake,bool model){
char direction1='A';
char direction2='D';//表示与蛇前进的反方向
bool a,b;
while(1){
if(model){
gotoxy(70,8);
if(GameScore>=0&&GameScore<=15)
{
a=true;
printf("第一关\n");
}
else if(GameScore>15&&GameScore<=30)
{
b=true;
printf("第二关\n");
}
else
printf("第三关\n");
gotoxy(70,10);
printf("GameScore:%d",GameScore);
if(GameScore>15&&GameScore<=30&&a){
a=false;
system("cls");
gotoxy(40,5);
printf("恭喜你第一关闯关成功\n");
gotoxy(40,6);
printf("即将进入第二关\n");
Sleep(1000);
break;
}
else if(GameScore>30&&b){
b=false;
system("cls");
gotoxy(40,5);
printf("恭喜你第二关闯关成功\n");
gotoxy(40,6);
printf("即将进入第三关\n");
Sleep(1000);
break;
}
}
else{
gotoxy(70,10);
printf("GameScore:%d",GameScore);
}
Sleep(DifficultyLevel);
if(kbhit())
direction1=getch();
if(direction1!=direction2)
{
switch(direction1){
case 'W':direction2='S';SnakeUp(snake);break;
case 'A':direction2='D';SnakeLeft(snake);break;
case 'S':direction2='W';SnakeDown(snake);break;
case 'D':direction2='A';SnakeRight(snake);break;
}
}
else
{
switch(direction1){
case 'S':SnakeUp(snake);break;
case 'D':SnakeLeft(snake);break;
case 'W':SnakeDown(snake);break;
case 'A':SnakeRight(snake);break;
}
}
}
}
//控制方向的另一种方式
void SnakeMove2(Snake &snake,bool model){ //上: 72 下:80 左:75 右:77
char direction1=75;
char direction2=77;//表示与蛇前进的反方向
bool a,b;
while(1){
if(model){
gotoxy(70,8);
if(GameScore>=0&&GameScore<=15)
{
a=true;
printf("第一关\n");
}
else if(GameScore>15&&GameScore<=30)
{
b=true;
printf("第二关\n");
}
else
printf("第三关\n");
gotoxy(70,10);
printf("GameScore:%d",GameScore);
if(GameScore>15&&GameScore<=30&&a){
a=false;
system("cls");
gotoxy(40,5);
printf("恭喜你第一关闯关成功\n");
gotoxy(40,6);
printf("即将进入第二关\n");
Sleep(1000);
break;
}
else if(GameScore>30&&b){
b=false;
system("cls");
gotoxy(40,5);
printf("恭喜你第二关闯关成功\n");
gotoxy(40,6);
printf("即将进入第三关\n");
Sleep(1000);
break;
}
}
else{
gotoxy(70,10);
printf("GameScore:%d",GameScore);
}
Sleep(DifficultyLevel);
if(kbhit())
direction1=getch();
if(direction1!=direction2)
{
switch(direction1){
case 72:direction2=80;SnakeUp(snake);break;
case 75:direction2=77;SnakeLeft(snake);break;
case 80:direction2=72;SnakeDown(snake);break;
case 77:direction2=75;SnakeRight(snake);break;
}
}
else
{
switch(direction1){
case 80:SnakeUp(snake);break;
case 77:SnakeLeft(snake);break;
case 72:SnakeDown(snake);break;
case 75:SnakeRight(snake);break;
}
}
}
}
#endif
最后:
#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
#include<time.h>
#include<windows.h>
#include"SnakeMap.h"
#include"SnakeOperate.h"
#define LengthWall 50 //墙的长度
#define WidthWall 25 //墙的宽度
//隐藏控制台的光标
void HiddenConsoleCursor(){
HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
CONSOLE_CURSOR_INFO CursorInfo;
GetConsoleCursorInfo(handle, &CursorInfo); //获取控制台光标信息
CursorInfo.bVisible = false; //隐藏控制台光标
SetConsoleCursorInfo(handle, &CursorInfo); //设置控制台光标状态
}
int main(){
int n=0,nn=0,m=0,mm=0,t=0,tt=0;
HiddenConsoleCursor();
system("color F0");
Snake snake=NULL;
gotoxy(40,5);
printf("贪吃蛇\n");
gotoxy(40,7);
printf("1:W A S D控制方向(此控制需要在大写形式下使用)\n");
gotoxy(40,9);
printf("2:←↑→↓控制方向\n");
gotoxy(40,11);
printf("请选择:\n");
gotoxy(40,12);
scanf("%d",&n);
switch(n){
case 1:nn=1;break;
case 2:nn=2;break;
}
srand((unsigned)time(NULL));
system("cls");
gotoxy(40,5);
printf("贪吃蛇\n");
gotoxy(40,7);
printf("1:闯关模式\n");
gotoxy(40,9);
printf("2:休闲模式\n");
gotoxy(40,11);
printf("请选择:\n");
gotoxy(40,12);
scanf("%d",&m);
switch(m){
case 1:mm=1;DifficultyLevel=100;break;
case 2:mm=2;break;
}
if(mm==1)
{
system("cls");
FirstMap(snake);
SnakeFood(snake,food);
if(nn==1)
SnakeMove1(snake,true);
else if(nn==2)
SnakeMove2(snake,true);
system("cls");
SecondMap(snake);
SnakeFood(snake,food);
if(nn==1)
SnakeMove1(snake,true);
else if(nn==2)
SnakeMove2(snake,true);
system("cls");
ThirdMap(snake);
SnakeFood(snake,food);
if(nn==1)
SnakeMove1(snake,true);
else if(nn==2)
SnakeMove2(snake,true);
}
if(mm==2)
{
system("cls");
gotoxy(40,5);
printf("贪吃蛇\n");
gotoxy(40,6);
printf("请选择地图:\n");
gotoxy(40,8);
printf("1:图一\n");
gotoxy(40,10);
printf("2:图二\n");
gotoxy(40,12);
printf("3:图三\n");
gotoxy(40,14);
printf("请选择:\n");
gotoxy(40,15);
scanf("%d",&t);
switch(t){
case 1:tt=1;break;
case 2:tt=2;break;
case 3:tt=3;break;
}
system("cls");
gotoxy(40,5);
printf("贪吃蛇\n");
gotoxy(40,6);
printf("请选择难度:\n");
gotoxy(40,7);
printf("1:手残党\n");
gotoxy(40,8);
printf("2:普通人类\n");
gotoxy(40,9);
printf("3:手指灵活\n");
gotoxy(40,10);
printf("4:非人类\n");
gotoxy(40,11);
printf("请选择:\n");
gotoxy(40,12);
scanf("%d",&n);
switch(n){
case 1:DifficultyLevel=200;break;
case 2:DifficultyLevel=100;break;
case 3:DifficultyLevel=50;break;
case 4:DifficultyLevel=20;break;
}
system("cls");
if(tt==1)
FirstMap(snake);
else if(tt==2)
SecondMap(snake);
else if(tt==3)
ThirdMap(snake);
SnakeFood(snake,food);
if(nn==1)
SnakeMove1(snake,false);
else if(nn==2)
SnakeMove2(snake,false);
}
return 0;
}
以下是我游戏的运行图:
闯关模式
休闲模式
选着地图
选着难度
图一
图二
图三