VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

有编程疑问吗?还请到提问专区发帖提问!
搜索
查看: 296|回复: 1

[求助] c语言小程序

[复制链接]
59_avatar_middle
online_member chenhaiyuan 发表于 2018-5-12 09:16:38 | 显示全部楼层 |阅读模式
20驿站币
贪吃蛇小程序可以运行,但是第一个食物吃完蛇的长度不增长?后面吃食物蛇长度正常增长,不明白。
还想问一下在正常未安装vs和图形库的电脑,如何操作使其也可以运行?
#include<graphics.h>
#include<mmsystem.h>
#pragma comment(lib,"winmm.lib")
#include<conio.h>
#include<time.h>
#include<stdlib.h>
#define SNAKELENTH 500
        enum Ch                         //枚举了解下
        {
                up = 72,
                down = 80,
                left = 75,
                right=77
        };
        struct coor
        {
                int x;
                int y;
        }coor;
        struct snake
        {
                int n;    //当前蛇长度
                struct coor szb[SNAKELENTH];        //结构体数组需要同事储存x,y坐标
                Ch ch;                                    //??????????????? 蛇的方向
        }snake;
        struct food
        {
                struct coor fzb;
                int flag;
        }food;
void initsnake()           //初始化
        {
                srand((unsigned int)time(NULL));         //随机种子
                initgraph(640, 480);                    //????????屏幕初始化
                setbkcolor(BLACK);                     //屏幕背景颜色
                cleardevice();                          //清屏???默认黑色
                        mciSendString(L"open 奥尔夫音乐游戏.mp3 alias BGM", 0, 0, 0);      //音乐配置注意大写
                mciSendString(L"play BGM", 0, 0, 0);
                snake.n = 1;
                snake.ch = right;                             //蛇初始化方向
                        snake.szb[0].x = 0;
                snake.szb[0].y = 0;
        }
        void drawsnake()        //绘制蛇
        {
                setlinecolor(BLACK);
                setfillcolor(RED);
                fillrectangle(snake.szb[0].x, snake.szb[0].y, snake.szb[0].x +20, snake.szb[0].y + 20);
                for (int i = 0; i<snake.n; i++)
                {
                         setlinecolor(BLACK);
                        setfillcolor(RED);
                        fillrectangle(snake.szb[i].x, snake.szb[i].y, snake.szb[i].x + 20, snake.szb[i].y + 20);
                }
        }
        void movesnake()      //移动蛇
        {
                switch (snake.ch)
                {
                case up:
                        snake.szb[0].y -= 20;
                        break;
                case down:
                        snake.szb[0].y += 20;
                        break;
                case left:
                        snake.szb[0].x -= 20;
                        break;
                case right:
                        snake.szb[0].x += 20;
                        break;
                }
                for (int i = snake.n; i>0; i--)
                {
                        snake.szb[i] = snake.szb[i - 1];
                }
        }
        void chargesnake()        //键盘控制蛇方向
        {
                int move;                 //方向键char or int
                        move = getch();
                switch (move)
                {
                case up:
                        if (snake.ch != down)
                                snake.ch = up;
                        break;
                case down:
                        if (snake.ch != up)
                                snake.ch = down;
                        break;
                case right:
                        if (snake.ch != left)
                                snake.ch = right;
                        break;
                case left:
                        if (snake.ch != right)
                                snake.ch = left;
                        break;
                }
        }
        void coorfood()          //食物坐标
        {                             //表示随机数0到64之间*10表达0 10 20.....
                food.fzb.x = rand() % 32* 20;          //食物坐标
                food.fzb.y = rand() % 24 * 20;
                        food.flag = 1;             //??????表示未被吃掉
        }
        void drawfood()           //绘制食物
        {
                setlinecolor(YELLOW);
                setfillcolor(YELLOW);
        //        fillrectangle(food.szb.x, food.szb.y, food.szb.x + 10, food.szb.y + 10);
                fillroundrect(food.fzb.x, food.fzb.y, food.fzb.x + 20, food.fzb.y + 20,20,20);  //??
        }
        void eatfood()           //胖多吃到食物
        {
                if (snake.szb[0].x == food.fzb.x&&snake.szb[0].y == food.fzb.y)
                {
                        snake.n++;
                        food.flag = 0;
                }
        }


#include"snake.h"
#include<stdio.h>
int main()
{
        initsnake();
        //snake.ch = getch();
        while (1)
        {
                while (!kbhit())         //判断是否有按键盘键盘,不等待按键有无都立即返回
                {
                        if (food.flag == 0)             //为什么这里第一个食物会出现?food.flag默认值不是1吗????
                        {
                                coorfood();      //食物坐标
                        }

                                cleardevice();
                                drawfood();
                       
                        movesnake();
                        drawsnake();
                        eatfood();
                        Sleep(120);      //蛇的速度注意s大写
                }
                chargesnake();      //有点不理解?????
                }





上一篇:C语言的一个小编程题(关于阶乘求和),求解错误
下一篇:小程序

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

59_avatar_middle
ico_lz  楼主| chenhaiyuan 发表于 2018-5-12 15:24:34 | 显示全部楼层
已解决....................

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 加入驿站 qq_login

本版积分规则

关闭

站长提醒上一条 /1 下一条

QQ
QQ在线咨询
联系电话
13591366679
手机扫一扫 关注本站精彩内容
wxqrcode

QQ|小黑屋|手机版|VC驿站 ( 辽ICP备09019393号tongdun|网站地图wx_jqr

GMT+8, 2018-7-18 16:36

Powered by Discuz! X3.4

© 2009-2018 cctry.com

快速回复 返回顶部 返回列表