C语言写的贪吃蛇(国庆任务项目)

分享写贪吃蛇的缘起

博主大一新生,因为有任务C语言写贪吃蛇,去网上找别人的源代码试一试效果,可是没有一个可以通过编译运行,现在博主好不容易写完了贪吃蛇,却深感单初不易,现在分享一下源代码,应该不会像网上大多数的C语言贪吃蛇代码无法编译正确,通过运行。(我用的Dev-C++5.11)

介绍

我这个是数组+清屏打印system(“cls”)类的,没用光标,毕竟很多初学者如果不是特殊情况不会去了解光标。
我的游戏名称为贪钱蛇因为吃的是钱¥

一、游戏基本功能与设定

初始化蛇与¥(吃了长度加一)!!(吃了长度减一)
死:
1、撞墙而死
2、吃自己尾巴而死
胜利:长度为10时胜利退出游戏(因为我玩游戏水平太低,为了让自己体验胜利的快感,所以…)
3、按空格键可以快捷死亡

二、 特殊设定

1、!!吃感叹号就短一节
2、音效(虽然很简单,但胜过无 :靠的是 \a)
3、变色:2~7节,不同长短不同颜色。
4、特殊的提示语,…留作彩蛋

源代码:

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<windows.h> 
#include<string.h>
#include<conio.h>
#include<math.h>
//定义全局变量
int map[20][40]; 
int length=3, score=0;//length的作用就跟《城池》这个游戏中的count一样,所以注意length要减一 
char oldDir='d', newDir;//防止默认取值使新旧方向相同 
int snake[10][2];  //如郭学姐所言:【2】中0表示y坐标1表示x坐标  
int food[2]={10,20};
int poison[2]={5,30};

void printGame(void);//打印游戏 
void startSnake(void);//初始化蛇 
void direction(void);//控制方向的函数
void movement(void);//蛇运动的函数
void creatfood(void);//生成食物的函数
void poisonfood(void);//吃毒草,少一个 
void gameover(void);//结束游戏的函数 ,也就是蛇死掉***用0和1判断死或生 
void colorchange(void);//颜色改变 
void printGame()
{//Y坐标在前,横坐标在后,此处要小心 ,而且是倒
	int i, j;  //打印边界          
	for(i=0;i<20;i++){    
	    map[i][0]=4;        
	    map[i][39]=4;       
	}                     
	for(j=0;j<40;j++){     
		map[0][j]=4;      
	    map[19][j]=4;       
	}
	map[food[0]][food[1]]=2;//让新区域为食物
	map[poison[0]][poison[1]]=3;//让新区域为du
	for(i=0;i<length;i++){//打印蛇 
		map[snake[i][0]][snake[i][1]]=1;
	}
	for(i=0;i<20;i++){//正式打印 
	    
		for(j=0;j<40;j++){
			
			if(map[i][j]==0)//0表示打印空白 
		    printf("  ");
		    else if(map[i][j]==1)//1表示此处为蛇 
			printf("■");
			else if(map[i][j]==2)//2表示此处为食物
			printf("¥");
			else if(map[i][j]==3)//3表示此处为毒草
			printf("!!");
			else if(map[i][j]==4)//4表示此处为边界 
			printf("##"); 
		}
		if(i==5)
		printf("您的小蛇长度:   %d", length);
		else if(i==15){
		printf("您的得分:     %d", score);
        }
		putchar('\n'); 
	}
}
/************************************direction************************************************/
void direction()//获取关于方向指令的函数 
{
	char ch1;
	if(_kbhit()){
	    oldDir=newDir;
		if(newDir!='a' && newDir!='d' && newDir!='w' && newDir!='s' && newDir!=' ')
			newDir=oldDir;
		}
		if(abs(newDir-oldDir)==3 || abs(newDir-oldDir)==4){
			newDir=oldDir;
		}
		newDir=_getch();
	}
 } 
/***********************************startnake*******************************************/ 
 void startSnake()
 {
 	int i;
 	for(i=0;i<3;i++){
 		snake[i][0]=10;
 		snake[i][1]=4-i;
	 }
  } 
/******************************************************************/ 
 void movement()
 {
 	int i;
 	
 	map[snake[length-1][0]][snake[length-1][1]]=0;
 	for(i=0;i<length-1;i++){//循环把下一节身体移到上一节
	          
	 	snake[length-1-i][0]=snake[length-i-2][0];
	 	snake[length-1-i][1]=snake[length-i-2][1];
	 }
 	switch(oldDir){//head[1]表示y坐标,小心还有边界占了一个坐标 
 		case 'a':
 			snake[0][1]--;//头部向左移动,x减少 
 			break;
 		case 'd':
 			snake[0][1]++;
 			break;
 		case 'w':
 			snake[0][0]--;
 			break;
 		case 's':
 			snake[0][0]++;
 			break;
 		default:
 			printf("按空格键,游戏将要结束\n"); 
 			system("pause");
	 }
}
/********************************************************************************/
void creatfood()
{
	srand(time(NULL));
	if(map[food[0]][food[1]]==1){//如果被吃 
	    do{
		    food[0]=rand()%20;
	        food[1]=rand()%40;
	    }while(map[food[0]][food[1]]==1 || map[food[0]][food[1]]==4 || map[food[0]][food[1]]==3);//生成一个在范围外的 
	
	length++;
	score+=10;
	printf("\a");//吃食物的提示音 
    }
}

void poisonfood()
{
	srand(time(NULL));
	if(map[poison[0]][poison[1]]==1){//如果被吃 
	    do{
		    poison[0]=rand()%20;
	        poison[1]=rand()%40;
	    }while(map[poison[0]][poison[1]]==1 || map[poison[0]][poison[1]]==4 || map[poison[0]][poison[1]]==2);//生成一个在范围外的 
	
	length--;
	map[snake[length][0]][snake[length][1]]=0;
	score-=10;
	printf("\a");//吃du的提示音 
    }
} 
 
void gameover(void)
{
	int i;
	if(snake[0][0]==0 || snake[0][0]==19 || snake[0][1]==0 || snake[0][1]==39){
		system("color 74");
		printf("小蛇撞破南墙也不回头,果然是壮士,在下佩服\a\n再次点击退出游戏\n");
		system("pause");
		exit(0);
	}
	if(length<=1){
		system("color 74");
		printf("你的小蛇已廋成了一道闪电,从此消失不见,已然成仙\a\n再次点击退出游戏你也该好好修炼,同它修仙\n");
		system("pause");
		exit(0);
	}
	for(i=1;i<length;i++){//小心i从1开始而非0,因为开始就为0 
		if(snake[0][0]==snake[i][0] && snake[0][1]==snake[i][1]){
			system("color 74");
			printf("虎毒不食子,蛇贪不咬尾\n\a你还是再次点击任意键,带这孽畜退出这游戏,走吧!");
			system("pause");
			exit(0);
		}
	}
 } 
 
 void colorchange()
 {
 	switch(length){
 		case 1:
 			system("color 78");
 			break;
 		case 2:
 			system("color 78");
 			break;
 		case 3:
 			system("color 70");
 			break;
 		case 4:
 			system("color 71");
 			break;
 		case 5:
 			system("color 72");
 			break;
 		case 6:
 			system("color 76");
 			break;
 		default:
 			system("color 75");
 		
	 }
  } 
 
 
 
 
int main(void)
{
	system("color 70") ;
    printf("点击任意键开始《贪钱蛇》游戏,按错键小蛇会死\n");
    printf("wsad分别表示上下左右,按错键则小蛇不改变方向**************¥钱吃了变长,!!吃了变短,最长为10节\n");
	system("pause");
	startSnake();//初始化蛇 和 食物毒草 
	do{
		direction();
		movement();
		poisonfood();
		creatfood();
		colorchange();
		printGame();
		Sleep(200);
		gameover();
		system("cls");
	}while(length<10);
	system("color 70");
	printf("\a您的小蛇已经太大,这个小世界已容不下它,带它去海角天涯,赏尽繁花\n");
	
	return 0;
}

写在最后:

因为学了C语言一周后就开始写贪吃蛇,花了3~4天。
难免会有错误与bug。
如果有谁发现调皮的bug欢迎斧正。
lalalalalalalalalala。终于写完啦!

  • 8
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值