【C】用c写贪吃蛇

1.输入正确的账号密码及其用户名,登录成功进入贪吃蛇游戏界面,

2.随机生成蛇头★、食物▲的位置(x,y),并使用□打印地图

3.使用w s a d按键,完成蛇头的上下左右移动

4.蛇头碰撞到食物后,吃下食物变成蛇身的一部分●,重新生成食物位置,显示在地图上

5.蛇撞墙后或蛇咬到自己的身体,程序结束,统计吃到的食物数量

cpp 复制代码
#include<stdio.h>
#include <windows.h>//gotoxy()函数头文件
#include<conio.h>//getch()函数头文件
#include<time.h>


#define COL 40
#define ROW 20


void gotoxy(int x, int y)//形参
{
    HANDLE hOut;
    COORD pos = {x, y};
	// 光标的起始位(第1列,第3行) 0是第1列 2是第3行
    hOut = GetStdHandle(STD_OUTPUT_HANDLE);
    SetConsoleCursorPosition(hOut, pos);
	//printf("定位光标位置搜索(%d,%d)\n",pos.X,pos.Y);
}
void paintWindow(int startX,int startY,int width,int height)
{

	int i=0;
	int j=0;

	//起始位置
	gotoxy(startX,startY);
	printf("╔");
	for(i=0;i<width-2;i++)
	{
		printf("═");
	}
	printf("╗");
	for(j=0;j<height-2;j++)
	{
		gotoxy(startX,startY+1+j);
		printf("║");
		for(i=0;i<width-2;i++)
		{
			printf(" ");
		}
		printf("║");
	}

	gotoxy(startX,startY + height-1);
    printf("╚");

    for(i=0;i<width-2;i++)
    {
        printf("═");
    }
    printf("╝");
    gotoxy(20,7);
    printf("贪吃蛇游戏登录界面");
}


int login()//登录界面
{
	int flag=0;
	int i=0;
	char ch;
	int count=0;
	char userName[20]={0};
	char passwd[20]={0};

	paintWindow(5,5,50,20);
	gotoxy(15,10);
	printf("用户名:");
	gotoxy(15,12);
	printf("密码:");
	gotoxy(22,10);
	while(1)
	{
		while(1)
		{
			ch=getch();
			if(count>=8)//只能输入8位
			{
				break;
			}
			if((ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z'))
			{
				userName[i]=ch;
				putch(ch);
				i++;
				count++;
			}
			else if(ch==13) break;//13为回车的ascll码值
			else if(ch=='\b')//删除的转义字符
			{
				if(count>0)
				{
					printf("\b \b");
					count--;
					userName[i]='\0';
				}
				
			}
			
		}

		gotoxy(22,12);
		count=0;
		i=0;
		while(1)
		{
			ch=getch();
			if(count>=12)//只能输入12位
			{
				break;
			}
			if(ch>='0'&&ch<='9')
			{
				passwd[i]=ch;
				putch('*');
				i++;
				count++;
			}
			else if(ch==13) break;
			else if(ch=='\b')//删除的转义字符
			{
				if(count>0)
				{
					printf("\b \b");
					count--;
					passwd[i]='\0';
				}
			}
		}

		gotoxy(22,18);
		if(strcmp(userName,"chen")==0&&strcmp(passwd,"1234")==0)
		{
			printf("登录成功!\n");
			flag=1;
			break;
		}
		else
		{
			printf("用户名或密码错误!请重新输入!");
			i=0;
			count=0;
			memset(userName,0,sizeof(userName));//将数组里的值初始化
			memset(passwd,0,sizeof(passwd));
			system("cls");//刷新屏幕
			paintWindow(5,5,50,20);
			gotoxy(15,10);
			printf("用户名:");
			gotoxy(15,12);
			printf("密码:");
			gotoxy(24,10);
		}
	}

	return flag;
}
int snake[100][2];//蛇身
int main()
{

	int i,j;
	int flag=0;//用来判断贪吃蛇界面是绘制蛇头蛇身还是屏幕
	int foodx,foody;
	int s=0;//保存蛇身长度
	int snakeLen=1;//开始一个蛇头
	int score=0;//得分
	int tt;

	char ch;
	char ch2;

	srand(time(NULL));
	foodx=rand()%COL;//列x
	foody=rand()%ROW;//行y
	snake[0][0]=rand()%COL;//x
	snake[0][1]=rand()%ROW;//y


	tt=login();//密码正确进入游戏
	if(tt==1)
	{
		system("cls");
		while(1)
		{
			for(i=0;i<ROW;i++)//行
			{
				for(j=0;j<COL;j++)//列
				{
					if(foodx==j&&foody==i)
					{
						printf("▲");
						flag=1;
					}
					for(s=0;s<snakeLen;s++)
					{
						if(snake[s][0]==j&&snake[s][1]==i&&s==0)
						{
							printf("★");
							flag=1;
						}
						else if(snake[s][0]==j&&snake[s][1]==i)
						{
							printf("●");
							flag=1;
						}
					}
					if(flag==0)
					{
						printf("□");
					}
					flag=0;
				}
				//printf("\n");
			}

			//跟进蛇身长度
			for(i=snakeLen;i>0;i--)
			{
				snake[i][0]=snake[i-1][0];
				snake[i][1]=snake[i-1][1];
			}

			//上下左右
			ch=getch();
			switch(ch)
			{
				case 'w':
					system("cls");
					snake[0][1]-=1;
					break;
				case 's':
					system("cls");
					snake[0][1]+=1;
					break;
				case 'a':
					system("cls");
					snake[0][0]-=1;
					break;
				case 'd':
					system("cls");
					snake[0][0]+=1;
					break;
				default:
					break;
			}

			//判断游戏结束,碰墙
			if(snake[0][0]<0||snake[0][0]>=COL||snake[0][1]<0||snake[0][1]>=ROW)
			{
				system("cls");

				//按'y'继续,按esc结束
				printf("是否继续游戏!按'a'可复活继续!\n按'y'重新开始游戏!\n按'esc'结束游戏!");
				ch2=getch();

				if(ch2=='a')
				{
					system("cls");
					continue;
				}
				else if(ch2=='y')
				{
					system("cls");
					
					snake[0][0]=rand()%COL;//x
					snake[0][1]=rand()%ROW;//y
					snakeLen=1;
					printf("你的总得分:%d分!\n",score);
					score=0;
					continue;
				}
				else if(ch2==27)
				{
					printf("\n\n*************************游戏结束!*******************\n");
					printf("你的总分为:%d分!\n",score);
					return 0;
				}
			}
			//蛇头碰到蛇身游戏结束
			for(s=1;s<snakeLen;s++)
			{
				if(snake[0][0]==snake[s][0]&&snake[0][1]==snake[s][1])
				{
					system("cls");

					//按'y'继续,按esc结束
					printf("是否继续游戏!\n按'a'可复活继续!\n按'y'重新开始游戏!\n按'esc'结束游戏!");
					ch2=getch();

					if(ch2=='a')
					{
						system("cls");
						continue;
					}
					else if(ch2=='y')
					{
						system("cls");
						
						snake[0][0]=rand()%COL;//x
						snake[0][1]=rand()%ROW;//y
						snakeLen=1;
						printf("你的总得分:%d分!\n",score);
						score=0;
						continue;
					}
					else if(ch2==27)
					{
						printf("\n\n***************************游戏结束!**********************\n");
						printf("你的总分为:%d分!\n",score);
						return 0;
					}
				}

			}
			//吃到食物
			if(snake[0][0]==foodx&&snake[0][1]==foody)
			{
				system("cls");
				foodx=rand()%COL;
				foody=rand()%ROW;

				snakeLen++;
				score++;//每次吃到食物分数累加
			}
		}

	}
	return 0;

}
相关推荐
爱编程— 的小李6 分钟前
有序序列合并(c语言)
c语言·算法
梦想科研社7 分钟前
【无人机设计与控制】红嘴蓝鹊优化器RBMO求解无人机路径规划MATLAB
开发语言·matlab·无人机
混迹网络的权某10 分钟前
每天一道C语言精选编程题之求数字的每⼀位之和
c语言·开发语言·考研·算法·改行学it·1024程序员节
一只特立独行的猪6111 小时前
Java面试题——微服务篇
java·开发语言·微服务
IronmanJay3 小时前
【LeetCode每日一题】——862.和至少为 K 的最短子数组
数据结构·算法·leetcode·前缀和·双端队列·1024程序员节·和至少为 k 的最短子数组
喵手3 小时前
Java 与 Oracle 数据泵实操:数据导入导出的全方位指南
java·开发语言·oracle
硬汉嵌入式4 小时前
H7-TOOL的LUA小程序教程第16期:脉冲测量,4路PWM,多路GPIO和波形打印(2024-10-25, 更新完毕)
开发语言·junit·小程序·lua
加载中loading...4 小时前
Linux线程安全(二)条件变量实现线程同步
linux·运维·服务器·c语言·1024程序员节
安科瑞刘鸿鹏4 小时前
校园建筑用电安全监测装置 电气火灾监测预防设备功能介绍
运维·服务器·网络·嵌入式硬件·安全·能源
Wx120不知道取啥名4 小时前
C语言之长整型有符号数与短整型有符号数转换
c语言·开发语言·单片机·mcu·算法·1024程序员节