控制台贪吃蛇

/*
    2023年4月26日 09:18:33
    编写一个控制台贪吃蛇游戏,不知道能实现不

    1、写界面   0 代表 空白处
               1 代表  食物                 食物 %符号表示
               2、代表蛇头                  蛇头 @符号表示
               3、蛇的节数 + 1 = 尾巴的位置  
               4、蛇节数 - 蛇头 = 身             #符号表示
    2023年4月26日 18:55:32  实现了
    利用二维数组里面的数值,来实现控制台贪吃蛇
*/
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include <ctype.h>
#include <conio.h>
#include <time.h>
#define  LENGTH  30                         //贪吃蛇 大小
#define  WIDTH   60                         //改变 这两个值可以设置大小
int arr[LENGTH][WIDTH];
/* 初始化界面  */
void  Init_jiemian(int arr[LENGTH][WIDTH] , int n);

/* 循环输出数组中的值 */
void show_arr(int arr[LENGTH][WIDTH]);

/* 蛇的移动 */
void  move_snak(int arr[LENGTH][WIDTH] ,char ch , int * length );

/*设置食物*/
void food_snak(int arr[LENGTH][WIDTH]);

/* 获取用户输入 */
char get_char(char ch);

int main(){
    int n = 5 ;                             //初始蛇的节数
    Init_jiemian(arr,n);                    //初始化二维数组数据
    char ch = 'd';                          //初始化的移动设置
    food_snak(arr);                         //随机生成食物的位置
    while(1){
    ch = get_char(ch);                      //获取用户的输入
    // Sleep(100)                           //控制台刷新速度太慢  注了
    show_arr(arr);                          //显示数组的内容
    move_snak(arr,ch,&n);                   //蛇的移动函数     传入参数节数 不是太完美
    system("cls");                          //清除屏幕
    }
    system("pause");
}

void food_snak(int arr[LENGTH][WIDTH]){
  
    srand(500);                             //食物随机位置
    int i = rand() % 20 ;                   //有循环不是太完美 应该一次生成随机数限定在某个范围
    int j = rand() % 40 ;
    while(arr[i][j] > 0 || arr[i][j] == -1){
        
        i = rand() % 20 ;
        j = rand() % 40 ;
    }
    arr[i][j] = 1 ;                         //将随机数的位置赋值为1 代表食物
}

void move_snak(int arr[LENGTH][WIDTH] , char ch , int *length){
    int new_head_i ,  new_end_i , new_head_j , new_end_j;           //记录蛇新位置的头和尾巴
    int old_head_i ,  old_end_i , old_head_j , old_end_j;           //记录蛇的旧位置头和尾巴
    int i , j ;
    
    for (i = 0 ; i < LENGTH ; i ++){
        for (int j = 0 ; j < WIDTH ; j ++){
            if(arr[i][j] == 2){                                     //循环找到蛇的头
                old_head_i = i;                             
                old_head_j = j;
            }
            if(arr[i][j] > 1 ){                                     //将蛇的身子全部 + 1 
                   arr[i][j] ++ ;                                   
               }
              if (arr[i][j] > *length + 1 ){                        
                /*上面将蛇整个身子加1,蛇头自增后等于3 这里找到蛇尾的必须是节数+1 ,因为整个蛇在循环中是自增的*/
                old_end_i = i ; 
                old_end_j = j ;
            }   
        }
    }
     new_head_i = old_head_i ;                      //将旧的蛇位置全部 赋值给新的蛇
     new_end_i  = old_end_i  ;                      //因为下面要移动并设置蛇的新位置
     new_head_j = old_head_j ; 
     new_end_j = old_end_j;
     if(ch == 'd'){                                 // 字符 a w s d控制蛇的移动     旧的位置改变赋值给新位置
        new_head_j = old_head_j + 1 ;               //右移动 = j + 1 二维数组的行
     }else if (ch == 'w'){                          //上移动 = i + 1 数组的列
         new_head_i = old_head_i - 1;
     }else if (ch == 's'){
         new_head_i = old_head_i + 1;               //下移动  数组的列
     }else if (ch == 'a'){  
         new_head_j = old_head_j - 1;               //左移动  j - 1
     }

        /*移动完以后判断新的位置边界是否是墙,并且不能大于蛇的身子*/
       if(arr[new_head_i][new_head_j] == -1  || arr[new_head_i][new_head_j] >= 2 ){
         system("cls");                         //如果失败清理屏幕
         printf("游戏失败!\n");                 //输出游戏失败
         system("pause");
         exit(-1);
      }else if(arr[new_head_i][new_head_j] == 1){
            food_snak(arr);                             //如果碰到了食物,重新生成食物
            arr[new_head_i][new_head_j] = 2 ;           //将食物的位置设置为蛇头值=2,前面蛇身自增过,这里蛇头不重复
            (*length) ++ ;                              //将蛇节数+1                              
            return ;                                   //直接返回
    }
        /*如果 没有碰到自己 或者 墙壁 */
         arr[old_end_i][old_end_j] = 0 ;                //将旧的尾巴 = 0     
         arr[new_head_i][new_head_j] = 2 ;              //新的 头等于 移动后的位置
        
}
char get_char(char ch1){
            //while (getch()!='\n');
    char ch ;
     if(kbhit()){            
            ch = getch();
            if(ch != 'w' && ch != 's' && ch != 'a' && ch != 'd'){
                return ch1 ;
            }
        return ch ;
    }
    if (!kbhit()){
        return ch1 ; 
    }
    return ch ;
}

void show_arr(int arr[LENGTH][WIDTH]){
    int i , j ; 
    for ( i = 0; i < LENGTH ; i++)
    {
        for (j = 0 ; j < WIDTH ; j ++){
            if(arr[i][j] < 0 ){
                printf("*");                        
            }else if (arr[i][j] == 0 ){
                printf(" ");
            }else if(arr[i][j] == 2 ) 
                printf("@");
            else if (arr[i][j] == 1){
                printf("%%");
            } else 
                printf("#");
        }
        printf("\n");
    }
    
}

void Init_jiemian(int arr[LENGTH][WIDTH] , int n ){
    int i , j ;

    for (i = 0 ; i < LENGTH ; i ++){
        for (j = 0 ; j < WIDTH ; j ++){
            if(j == 0 || i == 0  ){
                arr[i][j] = -1;
            }else if (j == WIDTH -1 || i ==LENGTH -1){
                arr[i][j] = -1;
            }else
                arr[i][j] = 0;
        }
    }
     i = 10 ;                           //蛇的初始化位置
     j = 10;                            //蛇的初始化位置
    for(int k = n + 1 ; k > 1 ; k --){
        arr[i][j++]  = k ; 
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值