#include<iostream> #include<stdlib.h> #include<conio.h>/*onio是Console Input/Output(控制台输入输出)的简写, 其中定义了通过控制台进行数据输入和数据输出的函数, 主要是一些用户通过按键盘产生的对应操作,比如getch()函数等等。*/ #include<easyx.h> #include<graphics.h>//画图头文件 #include<mmsystem.h> #pragma comment(lib,"winmm.lib") using namespace std; #define snakenum 500
struct snake { ? ? int size;//蛇的长度 ? ? int dir;//蛇的方向 ? ? int speed;//蛇的速度 ? ? POINT coor[snakenum];//坐标
}snake;
struct food { ? ? int x; ? ? int y; ? ? int r;//食物大小 ? ? bool flag;//标记是否被吃 ? ? DWORD color; }food;//食物结构
enum DIR { ? ? UP, ? ? DOWN, ? ? LEFT, ? ? RIGHT, };//枚举默认为0,1,2,3...//蛇的方向
//移动蛇
void gameinit() { ? ? mciSendString("open ./res/会不会刘大壮.mp3 alias nm", 0, 0, 0); ? ? mciSendString("play nm repeat",0, 0, 0); ? ? int i;/*SHOWCONSOLE*/ ? ? initgraph(500, 500);//显示控制台 ? ? snake.size = 3;//开始三节蛇 ? ? snake.speed = 10;//蛇速度 ? ? snake.dir = RIGHT; ? ? for (i = 0; i < snake.size; i++) ? ? { ? ? ? ? snake.coor[i].x = 40 - 10 * i;//根据蛇的半径求的位置 ? ? ? ? snake.coor[i].y = 10; ? ? } ? ? //随机产生一个整数,没有放置随机数种子,则每次都是固定的 ? ? //系统开机到现在经过的毫秒数 ? ? srand(time(NULL)); ? ? food.x = rand() % 70; ? ? food.y = rand() % 100; ? ? food.color = RGB(rand() % 256, rand() % 256, rand() % 256); ? ? food.r = rand() % 10 + 5; ? ? food.flag = true; }
void gamedraw() {
? ? //双缓冲绘图 ? ? BeginBatchDraw();
? ? setbkcolor(RGB(200, 250, 219)); ? ? cleardevice(); ? ? setfillcolor(RED);//蛇的颜色 ? ? for (int i = 0; i < snake.size; i++) ? ? { ? ? ? ? solidcircle(snake.coor[i].x, snake.coor[i].y, 5); ? ? }//画出三节蛇
? ? //绘制食物 ? ? if (food.flag) ? ? { ? ? ? ? solidcircle(food.x, food.y, food.r); ? ? }
? ? //绘制完毕后 ? ? EndBatchDraw(); }
void keycontrl() {
? ? if (_kbhit())//判断是否有按键有按键返回真执行下面移动 ? ? { ? ? ? ? //加下划线函数库内的函数 ? ? ? ? switch (_getch())/*是编程中所用的函数, ? ? ? ? ? ? 这个函数是一个不回显函数,当用户按下某个字符时 ? ? ? ? ? ? ,函数自动读取,无需按回车,有的C语言命令行程序会用到此函 ? ? ? ? ? ? 数做游戏,但是这个函数并非标准函数,要注意移植性!*/ ? ? ? ? ? ? // ?72 ?80 75 77上下左右键盘键值 ? ? ? ? { ? ? ? ? case 'w': ? ? ? ? case 'W': ? ? ? ? case 72: ? ? ? ? ? ? if (snake.dir != DOWN) ? ? ? ? ? ? { ? ? ? ? ? ? ? ? snake.dir = UP; ? ? ? ? ? ? } ? ? ? ? ? ? break;
? ? ? ? case 's': ? ? ? ? case 'S': ? ? ? ? case 80: ? ? ? ? ? ? if (snake.dir != UP) ? ? ? ? ? ? { ? ? ? ? ? ? ? ? snake.dir = DOWN; ? ? ? ? ? ? } ? ? ? ? ? ? break;
? ? ? ? case 'A': ? ? ? ? case 'a': ? ? ? ? case 75: ? ? ? ? ? ? if (snake.dir != RIGHT) ? ? ? ? ? ? { ? ? ? ? ? ? ? ? snake.dir = LEFT; ? ? ? ? ? ? } ? ? ? ? ? ? break;
? ? ? ? case 'D': ? ? ? ? case 'd': ? ? ? ? case 77: ? ? ? ? ? ? if (snake.dir != LEFT) ? ? ? ? ? ? { ? ? ? ? ? ? ? ? snake.dir = RIGHT; ? ? ? ? ? ? } ? ? ? ? ? ? break;
? ? ? ? ? ? //游戏暂停 ? ? ? ? case' ': ? ? ? ? ? ? while (1) ? ? ? ? ? ? { ? ? ? ? ? ? ? ? if (_getch() == ' ') ? ? ? ? ? ? ? ? { ? ? ? ? ? ? ? ? ? ? return; ? ? ? ? ? ? ? ? } ? ? ? ? ? ? } ? ? ? ? ? ? break;
? ? ? ? } ? ? } } //通过按键移动蛇
void ?snakemove() {
? ? int i;
? ? //让身体跟着头部移动的循环 ? ? for (i = snake.size - 1; i > 0; i--) ? ? { ? ? ? ? snake.coor[i] = snake.coor[i - 1];//一个循环让尾跟着前一个走 ? ? }
? ? switch (snake.dir) ? ? {//头部移动
? ? case UP:snake.coor[0].y -= snake.speed; ? ? ? ? if (snake.coor[0].y - 5 <= 0)//超出上面边界 ? ? ? ? { ? ? ? ? ? ? snake.coor[0].y = 500; ? ? ? ? } ? ? ? ? break;
? ? case DOWN://snake.speed等于蛇的半径 ? ? ? ? snake.coor[0].y += snake.speed; ? ? ? ? if (snake.coor[0].y + 5 >= 500)//超出上面边界 ? ? ? ? { ? ? ? ? ? ? snake.coor[0].y = 0; ? ? ? ? } ? ? ? ? break;
? ? case LEFT: ? ? ? ? snake.coor[0].x -= snake.speed; ? ? ? ? if (snake.coor[0].x - 5 <= 0)//超出左面边界 ? ? ? ? { ? ? ? ? ? ? snake.coor[0].x = 500; ? ? ? ? } ? ? ? ? break;
? ? case RIGHT: ? ? ? ? snake.coor[0].x += snake.speed; ? ? ? ? if (snake.coor[0].x + 5 >= 500)//超出上面边界 ? ? ? ? { ? ? ? ? ? ? snake.coor[0].x = 0; ? ? ? ? } ? ? ? ? break;
? ? default: ? ? ? ? break; ? ? } ? ? //画出三节蛇 ? ? //移动是什么发生改变 }
void eatfood() { ? ? //食物存在 ? ? if (food.flag && snake.coor[0].x >= food.x - food.r && snake.coor[0].x <= food.x + food.r && snake.coor[0].y ? ? ? ? >= food.y - food.r && snake.coor[0].y <= food.y + food.r) ? ? { ? ? ? ? food.flag = 0; ? ? ? ? snake.size++; ? ? } ? ? //如果食物消失,重新生成食物 ? ? if (!food.flag) ? ? { ? ? ? ? food.x = rand() % 500; ? ? ? ? food.y = rand() % 500; ? ? ? ? food.color = RGB(rand() % 256, rand() % 256, rand() % 256); ? ? ? ? food.r = rand() % 10 + 5; ? ? ? ? food.flag = true; ? ? } }
int main()
{ ? ? gameinit();//游戏初始化参数 ? ? gamedraw();//绘画 ? ? while (1) ? ? { ? ? ? ? snakemove(); ? ? ? ? gamedraw(); ? ? ? ? keycontrl(); ? ? ? ? eatfood(); ? ? ? ? Sleep(10);//等待一段时间 ? ? }
? ? return 0; }
|