zoukankan      html  css  js  c++  java
  • c语言 贪食蛇小游戏

    ---恢复内容开始---

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

    //描述蛇的节点信息
    typedef struct SnakeNode
    {
    int x;
    int y;
    } Snode;

    //箱子:放置蛇的所有节点
    Snode snakes[100];
    //保存用户选择的方向
    char dir='l'; // u d l r
    //保存食物
    Snode food;
    //蛇身有效长度
    int size=5;
    //速度
    int speed=300;

    /**
    自定义一个功能函数:给我一个坐标,我就能够把你定位
    */
    void setPosition(int x,int y)
    {
    COORD point;
    point.X=x;
    point.Y=y;
    //重置坐标
    SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),point);
    }

    /**
    显示友好的游戏界面
    */
    void wellcome()
    {
    setPosition(30,10);
    SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),9);
    printf("欢迎来到贪吃蛇的世界!");
    setPosition(30,15);
    //暂停
    system("pause");
    //清屏createFood
    system("cls");
    //输出操作提示
    setPosition(30,10);
    printf("使用向上、向下、向左、向右的方向键控制蛇的方向");
    setPosition(30,11);
    system("pause");
    system("cls");
    }

    /*
    功能模块:绘制围墙 1B=8bit A:1B 中文:2B
    */
    void paintWall()
    {
    int index=0;
    SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),11);
    //上边。下边
    for(index=0; index<58; index=index+2)
    {
    setPosition(index,0);
    printf("■");
    setPosition(index,26);
    printf("■");
    }
    //左边、右边akes[0].x=oldX+2;
    for(index=1; index<=26; index++)
    {
    setPosition(0,index);
    printf("■");
    setPosition(56,index);
    printf("■");
    }
    }

    /*检查新生成的食物的坐标是否和蛇身重合
    */
    int isTogether(int x,int y)
    {
    int index=0;
    for(index=0; index<size; index++)
    {
    if(snakes[index].x==x && snakes[index].y==y)
    {
    //重合
    return 1;
    }
    }
    //没有重合
    return 0;
    }

    /*
    创建食物
    */
    void createFood()
    {
    //随机数字
    //随机种子
    int randX=0;
    int randY=0;
    srand(time(0));
    //食物坐标随机
    randY=rand()%24+1;
    do
    {
    //只是能偶数
    randX=rand()%54+2;
    //检查是否和蛇身重合
    }
    while(!(randX%2==0 && isTogether(randX,randY)==0)) ;

    food.x=randX;
    food.y=randY;
    setPosition(food.x,food.y);
    printf("■");
    }

    /*
    显示蛇:节点 蛇头 5节点
    */
    void initSnake()
    {
    //蛇的节点起点位置
    int x=24;
    int y=5;
    int index=0;
    SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),8);
    //输出5个节点
    for(index=0; index<size; index++, x=x+2)
    {
    //设置节点的坐标
    snakes[index].x=x;
    snakes[index].y=y;
    setPosition(snakes[index].x,snakes[index].y);
    printf("■");
    }
    }

    /*
    清除蛇身图形
    */
    void clearSnake()
    {
    int index=0;
    for(index=0; index<size; index++)
    {
    setPosition(snakes[index].x,snakes[index].y);
    printf(" ");
    }
    }

    /*
    解析用户的按键,改变方向值
    */
    void selDir()
    {

    if(GetAsyncKeyState(VK_UP) && dir!='d' )
    {
    dir='u';
    }
    else if(GetAsyncKeyState(VK_DOWN) && dir!='u' )
    {
    dir='d';
    }
    else if(GetAsyncKeyState(VK_LEFT) && dir!='r')
    {
    dir='l';
    }
    else if(GetAsyncKeyState(VK_RIGHT) && dir!='l')
    {
    dir='r';
    }
    }

    /*
    移动蛇
    */
    void moveSnake()
    {

    //蛇头的原来坐标
    int oldX=snakes[0].x;
    int oldY=snakes[0].y;
    //两个临时变量
    int tempX=0;
    int tempY=0;
    int index=0;
    //重置一个新坐标
    switch(dir)
    {
    case 'u':
    snakes[0].x=oldX;
    snakes[0].y=oldY-1;
    break;
    case 'd':
    snakes[0].x=oldX;
    snakes[0].y=oldY+1;
    break;
    case 'l':
    snakes[0].x=oldX-2;
    snakes[0].y=oldY;
    break;
    case 'r':
    snakes[0].x=oldX+2;
    snakes[0].y=oldY;
    break;
    }

    //检查蛇头是否和食物重合
    if(snakes[0].x==food.x && snakes[0].y==food.y)
    {
    size++;
    createFood();
    speed-=50;
    if(speed<=0){
    speed=10;
    }
    }
    //检查蛇头是否碰到墙
    if( snakes[0].x<=2 || snakes[0].x>54 || snakes[0].y<1 || snakes[0].y>26 )
    {
    //碰到墙
    system("cls");
    printf("gameover");
    system("pause");
    exit(0);
    }
    //自己吃自己
    for(index=1; index<size; index++)
    {
    if(snakes[0].x==snakes[index].x && snakes[0].y==snakes[index].y)
    {
    //碰到墙
    system("cls");
    printf("gameover");
    system("pause");
    exit(0);
    }
    }

    setPosition(snakes[0].x,snakes[0].y);
    printf("■");
    //移动除了蛇头之外的节点
    for(index=1; index<size; index++)
    {
    //在移动节点之前保存节点的坐标
    tempX=snakes[index].x;
    tempY=snakes[index].y;
    //重新指定新坐标,前一个节点留下的空白
    snakes[index].x=oldX;
    snakes[index].y=oldY;
    //指定光标点
    setPosition(snakes[index].x,snakes[index].y);
    printf("■");
    //重置原坐标
    oldX=tempX;
    oldY=tempY;
    }
    }

    //主函数:语法结构(固定)运行时候,起点
    int main()
    {
    wellcome();
    //绘制围墙
    paintWall();
    initSnake();
    createFood();
    //清除蛇原来的图形
    while(1)
    {
    selDir();
    clearSnake();
    moveSnake();
    Sleep(speed);
    }
    return 0;
    }

    ---恢复内容结束---

  • 相关阅读:
    熟悉常用的HBase操作,编写MapReduce作业
    爬虫大作业
    熟悉常用的HDFS操作
    数据结构化与保存
    获取全部校园新闻
    爬取校园新闻首页的新闻
    网络爬虫基础练习
    leetcode
    归并排序
    选择排序法
  • 原文地址:https://www.cnblogs.com/ysg520/p/9301945.html
Copyright © 2011-2022 走看看