C《贪吃蛇》简易字符版

哇咔咔,这是我步入游戏制作界的第一步。

忙活了一个国庆,虽说bug略多,但是成就感满满的。

#include<stdio.h>
#include<stdlib.h>
#include<Windows.h>
#define H 20
#define L 20
void map(int hard);
void maphard(void);
void play(void);
void food(void);
int live(void);
void direction(char button, struct snake*direction);
void flashmap(struct snake*showsnake, int fx, int fy);
char MAP[H][L];
char key;
int life = 0;
int h;
int roof[4];

struct snake
{
    int x;
    int y;
    struct snake *next;
}*head, *body, *tail, *direct, *test;

int main(void)
{
    char choice;
    int speed;
    printf("            《贪吃蛇》 作者:sp\n");
    printf("请选择您的贪吃蛇水平(输入数字,按回车确认):\n");
    printf("1.我是菜鸟        2.过关无压力\n");
    printf("3.大神你懂吗      4.丧心病狂模式\n");
    while (scanf("%c", &choice) == 1)
    {
        switch (choice)
        {
        case ‘1‘:
            map(0);
            play(800, 0);
            break;
        case ‘2‘:
            map(0);
            play(400, 0);
            break;
        case ‘3‘:
            map(0);
            play(100, 0);
            break;
        case ‘4‘:
            printf("丧心病狂模式介绍:\n");
            printf("该模式下场地上会出现一片屋顶(用“+”表示)\n贪吃蛇可以穿过屋顶,但是在屋顶下玩家无法看到蛇的行踪\n");
            printf("贪吃蛇的食物有几率出现在屋顶下,玩家需要通过其丧心病狂的直觉来吃到食物\n");
            system("pause");
            map(1);
            play(300, 1);
            break;
        default:printf("游戏结束!");
        }
    }
    system("pause");
    return 0;
}

void map(int hard)
{
    int i, j, x, y;
    memset(MAP, ‘ ‘, sizeof(MAP));
    system("cls");
    head = (struct snake*)malloc(sizeof(struct snake));
    srand(time(0));//随机种子
    x = rand() % (H - 2) + 1;//初始化蛇头
    y = rand() % (L - 2) + 1;
    MAP[x][y] = ‘*‘;
    head->x = x;
    head->y = y;
    head->next = NULL;
    direct = head;
    if (hard = 0)
    {

        for (i = 0; i < H; i++)//画地图
        {
            for (j = 0; j < L; j++)
            {
                if (i == 0 || i == H - 1 || j == 0 || j == L - 1)//造围墙
                    MAP[i][j] = ‘#‘;
                printf("%c", MAP[i][j]);
            }
            printf("\n");
        }
    }
    else
    {
        for (h = 0; h < 4; h++)
        {
            srand(time(0));
            roof[h] = rand() % (H - 2) + 1;
        }

        for (i = 0; i < H; i++)//画地图
        {
            for (j = 0; j < L; j++)
            {
                if (i == roof[0] || i == roof[1] || j == roof[2] || j == roof[3])//屋顶
                    MAP[i][j] = ‘+‘;
                if (i == 0 || i == H - 1 || j == 0 || j == L - 1)//造围墙
                    MAP[i][j] = ‘#‘;
                printf("%c", MAP[i][j]);
            }
            printf("\n");
        }
    }
}

void play(int speed, int hard)
{
    int fx, fy;
    int food = 1;
    while (1)
    {
        Sleep(speed);
        while (food)//生成食物
        {
            srand(time(0));
            fx = rand() % (H - 2) + 1;
            fy = rand() % (L - 2) + 1;
            food = 0;
        }
        if (_kbhit() != 0)//有键盘输入则变换key的值,否则保持原方向
            key = _getch();
        direction(key, direct);
        body = head;
        if ((direct->x != fx) || (direct->y != fy))
        {
            while (body->next != NULL)
            {
                body->x = (body->next)->x;
                body->y = (body->next)->y;
                body = body->next;
            }
        }
        else{
            tail = (struct snake*)malloc(sizeof(struct snake));//加长蛇身
            direct->next = tail;
            tail->next = NULL;
            tail->x = fx;
            tail->y = fy;
            direct = tail;
            food = 1;
        }
        flashmap(head, fx, fy, hard);
        life = live();
        if (life)
            break;

    }
}

int live(void)
{
    if (body->x == 0 || body->y == 0 || body->x == H - 1 || body->y == L - 1)
        return 1;
    else
        return 0;
}

void flashmap(struct snake*showsnake, int fx, int fy, int hard)//刷新屏幕
{
    system("cls");
    int i, j;
    memset(MAP, ‘ ‘, sizeof(MAP));
    while (showsnake != NULL)
    {
        MAP[showsnake->x][showsnake->y] = ‘*‘;
        showsnake = showsnake->next;
    }
    MAP[fx][fy] = ‘@‘;
    if (hard == 0)
    {

        for (i = 0; i < H; i++)//画地图
        {
            for (j = 0; j < L; j++)
            {
                if (i == 0 || i == H - 1 || j == 0 || j == L - 1)//造围墙
                    MAP[i][j] = ‘#‘;
                printf("%c", MAP[i][j]);
            }
            printf("\n");
        }
    }
    else
    {
        for (i = 0; i < H; i++)//画地图
        {
            for (j = 0; j < L; j++)
            {
                if (i == roof[0] || i == roof[1] || j == roof[2] || j == roof[3])//屋顶
                    MAP[i][j] = ‘+‘;
                if (i == 0 || i == H - 1 || j == 0 || j == L - 1)//造围墙
                    MAP[i][j] = ‘#‘;
                printf("%c", MAP[i][j]);
            }
            printf("\n");
        }
    }

}

void direction(char button, struct snake*direction)//改变方向
{
    switch (button)
    {
    case ‘a‘:direction->y--;
        break;
    case ‘d‘:direction->y++;
        break;
    case ‘w‘:direction->x--;
        break;
    case ‘s‘:direction->x++;
    default:break;
    }
}
时间: 2024-10-12 03:52:45

C《贪吃蛇》简易字符版的相关文章

贪吃蛇(修改Ⅰ版)

修改:1.添加了菜单栏,并进行了监听 2.添加了通关的条件 3.添加了背景音乐(音频文件连接:http://yunpan.cn/cQjY4PzpkfSdz (提取码:2726)) 4.美观了蛇身 class SnakeMain代码: import java.applet.Applet; import java.applet.AudioClip; import java.awt.Color; import java.awt.event.ActionEvent; import java.awt.ev

贪吃蛇游戏趣味版

我在程序中加入了分数显示,三种特殊食物,将贪吃蛇的游戏逻辑写到了SnakeGame的类中,而不是在Snake类中. 特殊食物: 1.绿色:普通,吃了增加体型 2.红色:吃了减少体型 3.金色:吃了回到最初体型 4.变色食物:吃了会根据食物颜色改变蛇的颜色 游戏开始,出现普通绿色食物: 特殊变色食物,蛇吃了会变成食物的颜色: 金色食物,蛇吃了可以变回初始状态: #coding=UTF-8from Tkinter import *from random import randintimport tk

Javascript基础示例:用JS写简易版贪吃蛇(面向对象)

废话不多说,代码如下: 1 <!DOCTYPE html> 2 <html> 3 <head> 4 <meta charset="UTF-8"> 5 <title>贪吃蛇</title> 6 <script> 7 var map; //地图类对象 8 var snake; //蛇类对象 9 var food; //食物类对象 10 var timer; //定时器对象 11 var sum=0; //分

Java版贪吃蛇(比较完善的版本)

很认真的写的一个java版的贪吃蛇游戏,图形界面,支持菜单操作,键盘监听,可加速,减速,统计得分,设定运动速度,设定游戏背景颜色等!应该没有Bug了,因为全被我修改没了.哈哈. 下面是项目各包及类的层次关系: 游戏的主要运行界面截图如下: 下面是部分代码,详细源码见此链接:http://pan.baidu.com/s/1bnubnzh //Snake类: package com.huowolf.entities; import java.awt.Color; import java.awt.Gr

Qt版贪吃蛇游戏

Qt版贪吃蛇游戏 转载请标明出处:牟尼的专栏 http://blog.csdn.net/u012027907 最近在学习Qt,用了一个多月的时间掌握了Qt中最基本的知识,也完成了<Qt版音乐播放器>.<Qt版贪吃蛇游戏>.<Qt版双人俄罗斯方块>以及<Qt版科学计算器>等,之前在VC下写过这些程序,所以在Qt下只是改变了显示等语句,我写过<C++版贪吃蛇游戏>.<VC版贪吃蛇游戏>,当时将与显示等无关的东西封装起来,在Qt下直接用,只

Java版贪吃蛇小游戏的实现

使用的IDE eclipse JDK版本 1.6 辅助类 Coordinate.java package com.nn.util; /** *坐标点 */ public class Coordinate { public int x; public int y; public Coordinate(int newX, int newY) { x = newX; y = newY; } public boolean equals(Coordinate other) { if (x == other

控制台小游戏-贪吃蛇,c++和c#版

说是c++版,其实只是用到了c++的cout和cin而已.这是我做的第二个控制台游戏,基本上每一行代码都加上了注释. 游戏嘛,我觉得重要的是了解他的思想,所以后期学了面向对象之后这个游戏的代码我也没有重新封装. 下面请看图 代码如下:我是用dev c++写的 1 //注释. ---星辰 2 3 #include <iostream> 4 #include<Windows.h> 5 #include<ctime> 6 #include<cstdlib> 7 #

OC版贪吃蛇

昨天写了一个js版贪吃蛇,今天突然想写一个OC版的,来对比一下两种语言的区别 oc版功能,适配所有尺寸iphone,可暂停,可设置地图和蛇的比例,可加速 对比一下会发现js版的相对OC版的会简单一些,有想看js版的可以看我上一篇随笔 程序中没用到任何素材,效果图如下: github源码地址:https://github.com/masterChunlinHan/snake_OC 下面开始,跟js版一样,为了方便学习,所有代码都写在一个controller中,所以头文件中什么也不用写 #impor

假期休闲,来发贪吃蛇!(Win32控制台版)

假期无事,整理电脑文件的时候发现了以前大二时做的坦克小游戏,心血来潮,决定再来一发贪吃蛇. 游戏玩法不必多说,主要是算法实现和绘制过程. 首先,利用一个二维数组 mp[][] 来存储地图信息,其中的值表示: 0:空 1:被蛇覆盖 2:食物 有了这个地图数组,生成随机食物的时候就可以避免生成到蛇身上. 那蛇的身体如何存储呢?也很简单,用队列(存储每一个小格的坐标信息). 队列的头尾方向与蛇的头尾方向正好相反. 蛇每走一步,在蛇头方向的下一位置画一个小方格,同时把该位置放置到队列尾端.取出队列第一个