A Gluttonous Snake

贪吃蛇,绝对是每个人童年记忆里的游戏了吧。记得我小时候玩的贪吃蛇,还是诺基亚手机里自带的小游戏。而且当时对此特别着迷,经常与小伙伴们比赛刷新分数
这里写图片描述
而如今,诺基亚已经停产,也再也没有哪一款手机会自带贪吃蛇游戏了。但这款游戏早已经成为经典,成为记忆。今天让我们看下如何编写一个简单的贪吃蛇游戏。
由简入难,我们想象一下这个游戏的基本原理和操作
输出字符矩阵
WHILE not 游戏结束
DO
ch=等待输入
CASE ch DO
‘A’:左前进一步,break
‘D’:右前进一步,break
‘W’:上前进一步,break
‘S’:下前进一步,break
END CASE
输出字符矩阵
END WHILE
输出 Game Over!
以上就是这个游戏的伪代码

然后呢,就该用代码将其补充完整

// main.c
// snake

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<conio.h>

#define SNAKE_MAX_LENGTH 20
#define SNAKE_HEAD 'H'
#define SNAKE_BODY 'X'
#define BLANK_CELL ' '
#define SNAKE_FOOD '$'
#define WALL_CELL '*'

//move by providing the x_index and y_index
void snake_move(int x_index,int y_index);

//randomly put money
void put_money();

//print the frame
void output();

//check for over
int gameover();

char map[12][13]=
    {
     "************",
     "*XXXXH     *",
     "*          *",
     "*          *",
     "*          *",
     "*          *",
     "*          *",
     "*          *",
     "*          *",
     "*          *",
     "*          *",
     "************"
    };

    struct Point
    {
        int x;
        int y;
    };
    /*Point x1;
    Point x2;
    Point x3;
    Point x4;
    Point x5;*/
    struct Point snake_arr[20];
    //={x1,x2,x3,x4,x5};
    int snake_length=5;
    struct Point * head=&snake_arr[4];
    struct Point * tail=&snake_arr[0];
    int fruit_x=5,fruit_y=5;

    void random_generator_fruit()
    {
        fruit_x=rand()%10+1;
        fruit_y=rand()%10+1;
        map[fruit_y][fruit_x]='$';
        for(int i=0;i<snake_length;i++)
        {
            if(snake_arr[i].x==fruit_x&&snake_arr[i].y==fruit_y)
             random_generator_fruit();
        }

    }

    int process=1;
    int main()
    {
        srand((unsigned)time(NULL));

        /*for(i=0;i<12;i++)
        {
            for(j=0;j<12;j++)
            {
                if(map[i][j]=='H')
                {
                    break;  
                }
            }
        }*/


        for(int k=4;k>=0;k--)
        {
            snake_arr[k].x=k+1;
            snake_arr[k].y=1;
            /*  for(int i=0;i<snake_length-1;i++)
            {
                snake_arr[i].x=snake_arr[i+1].x;
                snake_arr[i].y=snake_arr[i+1].y;
            }*/
        }
        random_generator_fruit();
        for(;gameover()!=-1&&process!=0;)
        {


            system("cls");
            output();
            char ch=getch();

            switch(ch)
            {
                case 'w':
                case 'W':
                    snake_move(0,-1);
                    break;
                case 's':
                case 'S':
                    snake_move(0,1);
                    break;
                case 'a':
                case 'A':
                    snake_move(-1,0);
                    break;
                case 'd':
                case 'D':
                    snake_move(1,0);
                    break;
            }
        }
        printf("game over");
        return 0;
    }

    void output()
    {
        for(int i=0;i<12;i++)
        {
            printf("%s\n",map[i]);
        }
    }

    void snake_move(int x_index,int y_index)
    {


        int temp_x=head->x+x_index,temp_y=head->y+y_index;

        for(int i=0;i<snake_length;i++)
        {
            if(snake_arr[i].x==temp_x&&snake_arr[i].y==temp_y)
            {
                process=0;
                return ;
            }
        }
        if(temp_x!=fruit_x||temp_y!=fruit_y)
        {

            map[tail->y][tail->x]=' ';
            map[head->y][head->x]='X';
            map[head->y+y_index][head->x+x_index]='H';

            for(int i=0;i<snake_length-1;i++)
            {
                snake_arr[i].x=snake_arr[i+1].x;
                snake_arr[i].y=snake_arr[i+1].y;
            }

            snake_arr[snake_length-1].x=temp_x;
            snake_arr[snake_length-1].y=temp_y;
        }
        else
        {
            map[head->y][head->x]='X';
            map[head->y+y_index][head->x+x_index]='H';
            snake_arr[snake_length].x=temp_x;
            snake_arr[snake_length].y=temp_y;
            head=&snake_arr[snake_length];
            snake_length++;
            random_generator_fruit();

        }

    }

    int gameover()
    {
        int flag=1;
        for(int i=0;i<snake_length;i++)
        {
            if(snake_arr[i].x<=0||snake_arr[i].x>=11||snake_arr[i].y<=0||snake_arr[i].y>=11)
            {
                flag=0;
                break;
            }
        }
        if(flag==0)
        {
            return -1;
        }
        return 1;
    }

然后最后结果就是这样的
这里写图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值