字符游戏贪吃蛇

小时候拿着诺基亚玩贪吃蛇,觉得好好玩(尽管是像素游戏,只有黑白)
这里写图片描述
如今贪吃蛇版本非常多,颜色也非常鲜艳,但万变不离其宗的是蛇要吃食物才能变长,碰到墙(或者自己)就game over!(有些版本碰到自己不会死)
这里写图片描述

贪吃蛇

如今长大了,觉得贪吃蛇游戏就是小case,不值一提,但最近我对它另眼相看了……因为一个简单的字符贪吃蛇也写得特难受!!!
作业发布下来后的几天,我一直上网看相关代码,但却超出了我的知识范围……最后不得不向一位师兄借了一下代码“借鉴”,但最后还是写出了有巨大BUG的贪吃蛇,BUG如下:
①开始画面一切很正常,丝毫没有BUG的感觉,但是……
这里写图片描述
②输入s往下走的那一下,整个人是崩溃的,蛇身居然短了,而且食物出现在蛇永远吃不到的地方(左上角)!!!
这里写图片描述
最后不得不直接让这条蛇撞墙死了算了……
这里写图片描述
虽然不算完美,但是在其中还是学到了一些东西

源代码(有BUG!!!)

snake1.c代码

#include<stdio.h>
#include<stdlib.h>
#include"snake1.h"     
void move();           //移动 
void outputmap();       //输出地图 
void gameover();       //游戏结束 
void score();          //吃食物得分 
void set();             //初始化地图 
void score();          //吃食物得分 
//主函数 
int main(){          
    set();
    outputmap();
    gameover();
    return 0;
}

snake1.h代码

#include<stdio.h>
#include<stdlib.h>
int headx,heady,max,dir,begin;    //蛇头的坐标,方向,长度  
char in;                        //读取字符 
int map[12][12] = {0};        //地图 
int i, j, foodx, foody;        //食物 
//对于地图,根据初始化来定义地图,如-1为边界,0为内部,max为蛇身,100为食物 
void outputmap(){
    for(i=0;i<=11;i++){
        for(j=0;j<=11;j++){
        if(map[i][j]==-1)
        printf("*"); 
        if(map[i][j]==0)
        printf(" ");
        if(map[i][j]!=0&&map[i][j]!=-1&&map[i][j]!=max&&map[i][j]!=100)
        printf("X");
        if(map[i][j]==max)
        printf("H");
        if(map[i][j]==100)
        printf("$");
    }
        printf("\n");
    }
    return;
}

//吃食物函数 当蛇头碰到食物,身长加一,游戏继续 
void score(){
    if(map[headx][heady]!=100){
        map[headx][heady]=max+1;
        for(i=1;i<11;i++){
            for(j=1;j<11;j++){
                if(!(map[i][j]==0||map[i][j]==-1)){
                    map[i][j]--;
                }
            }
        }
        map[foodx][foody]=100;
    }
    else{
        max++;
        map[headx][heady]=max;
    }
    system("cls");         //清屏输出 
    outputmap();
    return;
}
//移动函数,读取用户输入一个字符,S为向下一格,W为向上一格,A为向左一格,D为向右一格
//不断输入,用EOF来作为结束判断 
void move(){
    if(begin==0){
        dir='d';
        begin++;
    }
    if(scanf("%c",&in)!=EOF)
    dir=in;
    switch(dir){
        case 'd':
            heady++;
            break;
        case 'a':
            heady--;
            break;
        case 'w':
            headx--;
            break;
        case 's':
            headx++;
            break;
    }
    return;
}
//游戏结束,当蛇头碰到边界或自己身体,判断游戏结束,跳出循环输出GAME OVER 
void gameover(){
    while(1){
        move();
        if(map[headx][heady]!=0&&map[headx][heady]!=max&&map[headx][heady]!=100){
            printf("Game Over!!!\n");
            break;
        }
        else
        score();
    }
}

//初始化地图,将地图赋值化后输出,跟outputmap函数一起调用 
void set(){
    for (i=0;i<=11;i++) {          
        map[i][0]=-1;                
        map[i][11]=-1;               
        map[0][i]=-1;              
        map[11][i]=-1;             
    }                                   
    for (i=1;i<=5;i++) {         
        map[1][i]=i;                   
    }                                 
    max=5;                         
    headx=1;                      
    heady=5;                                       
    begin=0;                      
}

总结

通过这次的学习,教会了我,千万不要小看那些简单的小游戏,看似简单,但其背后可能是几百行甚至上千行的代码量!!!可能是程序员不知道爆了多少肝才写出来的,所以我们要尊重每一个小游戏,要带着敬畏的心去玩……
这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值