本人学生党一个,也是一个热爱编程的小码农(嘻嘻!),经过3天的打造写好了自己的一个贪吃蛇小游戏(C语言版),之前也写过Javascript版的,如果你要是一个爱好编程的小伙伴,就一起学习吧!(祝大家愚人节快乐!)
/*数据设计*/
#include <stdio.h>
#include <string.h>
#include <windows.h>//光标设置的API
#include <time.h>//食物随机
#include <conio.h>//按钮监控
#define MAXHEIGHT 25//窗口最大宽
#define MAXWIDTH 60//窗口最大高
#define SNAKESIZE 50//蛇的最大节数
//蛇结构
struct{
int x;
int y;
}food;
//蛇的结构
struct{
//记录每一节蛇的坐标
int x[SNAKESIZE];
int y[SNAKESIZE];
int len;//蛇的长度
int sleep;//蛇的移动速度
}snake;
//全局变量
int i,k,foods=0,totals=0;
int key = 'A';//初始化蛇的移动方向
int changeFlag = 0;//蛇的变化标记
/*模块设计(功能设计)*/
//开始欢迎界面
void welcom();
//计分函数
void total();
//1.地图生成
void drawMap();
//2.蛇的产生
void createFood();
//3.按键操作
void keyDown();
//4.蛇的状态(判断游戏是否结束)
int snakeStatus();
//5.辅助函数(光标的移动)
void gotoxy(int x,int y);
//主函数
void main(){
system("mode con cols=100 lines=28");
welcom();
system("cls");
drawMap();
total();
while(1){
createFood();
Sleep(snake.sleep);
keyDown();
if(!snakeStatus()){
break;
}
}
gotoxy(MAXWIDTH/2-2,MAXHEIGHT/2);
printf("游戏结束\n");
gotoxy(MAXWIDTH/2-6,MAXHEIGHT/2+1);
system("pause");
}
//欢迎界面
void welcom(){
gotoxy(MAXWIDTH/2+5,MAXHEIGHT/2-4);
printf("************************");
gotoxy(MAXWIDTH/2+5,MAXHEIGHT/2-2);
printf("\t 美是初见");
gotoxy(MAXWIDTH/2,MAXHEIGHT/2);
printf(" 支持正版,拒绝盗版!\n");
gotoxy(MAXWIDTH/2,MAXHEIGHT/2+1);
printf(" 适当游戏,健康你我!\n");
gotoxy(MAXWIDTH/2+5,MAXHEIGHT/2+2);
printf("\t 微信Gen1273145688");
gotoxy(MAXWIDTH/2+5,MAXHEIGHT/2+4);
printf(" 开始");
gotoxy(MAXWIDTH/2+5,MAXHEIGHT/2+6);
printf("************************");
gotoxy(MAXWIDTH/2+5,MAXHEIGHT/2+3);
printf(" ");
system("pause");
}
//1.地图生成
void drawMap(){
//蛇身:■ 食物:★
srand((unsigned int)time(NULL));//随机函数
//1.画地
//左右地图边框
for(i=0;i<=MAXHEIGHT;i++){
gotoxy(0,i);
printf("■");
gotoxy(MAXWIDTH,i);
printf("■");
}
//上下地图边框
//■占用2个字符
for(i=0;i<=MAXWIDTH;i+=2){
gotoxy(i,0);
printf("■");
gotoxy(i,MAXHEIGHT);
printf("■");
}
//2.画蛇
snake.len = 3;//蛇的初始长度
snake.sleep = 250;//蛇的移动速度
//确定蛇的头部(在控制台中间)
snake.x[0] = MAXWIDTH/2;
snake.y[0] = MAXHEIGHT/2;
//画蛇头
gotoxy(snake.x[0],snake.y[0]);
printf("■");
//画蛇身
for(k=1;k<snake.len;k++){
snake.x[k] = snake.x[k-1]+2;
snake.y[k] = snake.y[k-1];
gotoxy(snake.x[k],snake.y[k]);
printf("■");//一节是x=2
}
//3.画食
food.x = rand()%(MAXWIDTH-4)+2;//窗口的左右边框占2像素
food.y = rand()%(MAXHEIGHT-2)+1;//窗口的上下边框占1像素
gotoxy(food.x,food.y);
printf("★");
}
//2.蛇的产生
void createFood(){
//蛇吧食物吃了
if(snake.x[0]==food.x&&snake.y[0]==food.y){
srand((unsigned int)time(NULL));
total();//计分
//产生的食物不能在蛇的身上,并且坐标是偶数(蛇身占两个字节)
while(1){
int flag = 1;
food.x = rand()%(MAXWIDTH-4)+2;
food.y =rand()%(MAXHEIGHT-2)+1;
//产生的食物不能在蛇的身上
for(k=0;k<snake.len;k++){
if(snake.x[k]==food.x&&snake.y[k]==food.y){
flag = 0;
break;
}
}
if(flag&&food.x%2==0){
break;
}
}
gotoxy(food.x,food.y);
printf("★");
snake.len++;
changeFlag = 1;//蛇的标记1
}
}
//计分函数
void total(){
gotoxy(MAXWIDTH/2+36,MAXHEIGHT/2-7);
printf("美是初见");
gotoxy(MAXWIDTH/2+36,MAXHEIGHT/2-6);
printf(" ");
gotoxy(MAXWIDTH/2+36,MAXHEIGHT/2-5);
printf("*********************");
gotoxy(MAXWIDTH/2+36,MAXHEIGHT/2-4);
printf("吃食物个数:%d个",foods++);
gotoxy(MAXWIDTH/2+36,MAXHEIGHT/2-3);
printf("总得分数为:%d分",totals+=10);
gotoxy(MAXWIDTH/2+36,MAXHEIGHT/2-2);
printf("*********************");
gotoxy(MAXWIDTH/2+36,MAXHEIGHT/2-1);
printf("如果你要是编程爱好者!");
gotoxy(MAXWIDTH/2+36,MAXHEIGHT/2);
printf("那就加入我们吧!");
gotoxy(MAXWIDTH/2+36,MAXHEIGHT/2+1);
printf("我们的承诺是:永久免费!");
gotoxy(MAXWIDTH/2+36,MAXHEIGHT/2+2);
printf("认证微信Gen1273145688");
gotoxy(MAXWIDTH/2+36,MAXHEIGHT/2+3);
printf("*********************");
}
//3.按键操作
void keyDown(){
//无按键的处理
if(_kbhit()){
fflush(stdin);//清除缓冲区
key = _getch();//接收键盘按键
}
//擦除蛇的最后一节
if(!changeFlag){
gotoxy(snake.x[snake.len-1],snake.y[snake.len-1]);
printf(" ");//两个空格
}
//后面的蛇身变化
for(i=snake.len-1;i>0;i--){
snake.x[i] = snake.x[i-1];
snake.y[i] = snake.y[i-1];
}
//移动方向的处理
switch(key){
case 'w':
case 'W':
snake.y[0]--;
break;
case 's':
case 'S':
snake.y[0]++;
break;
case 'a':
case 'A':
snake.x[0] -=2;
break;
case 'd':
case 'D':
snake.x[0] +=2;
break;
}
gotoxy(snake.x[0],snake.y[0]);
printf("■");
changeFlag = 0;
gotoxy(MAXHEIGHT+2,0);
}
//4.蛇的状态(判断游戏是否结束)
int snakeStatus(){
if(snake.x[0]==0||snake.x[0]==MAXHEIGHT-2||snake.y[0]==0||snake.y[0]==MAXWIDTH-2){
return 0;
}
for(k=1;k<snake.len;k++){
if(snake.x[0]==snake.x[k]&&snake.y[k]==snake.y[0]){
return 0;
}
}
return 1;
}
//5.辅助函数(光标的移动)
void gotoxy(int x,int y){
//调用win32 API 设置控制台的光标位置
HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
//光标的结构体
COORD coord={x,y};
//设置坐标
//coord.x = x;
//coord.y = y;
//同步到控制台Set Console Cursor Position
SetConsoleCursorPosition(handle,coord);
}
==觉得好就收藏吧,记得双击,谢谢!==
__2019/04/01 美是初见__