贪吃蛇小游戏
实现的功能:
1、有背景音乐
2、可随机生成障碍物
3、随机生成食物
4、能够绘制地图
5、有多种游戏难度(蛇移动的速度不同)
6、可绘制地图
7、有特殊食物(吃了以后会加分,蛇身子不会变长)
8、双蛇作战(由于用的是单线程,操作会有很大延迟)
9、有草地(可隐身)
// 贪吃蛇.cpp : 定义控制台应用程序的入口点。
#include "stdafx.h"
#include <windows.h>
#include <conio.h>
#include "iostream"
#pragma comment(lib,"winmm.lib")
typedef struct COORDS {
int xx;
int yy;
} COORDS, *PCOORDS;
#define 上 1
#define 下 2
#define 左 3
#define 右 4
#define 保存 5
#define 退出 6
#define 草丛 -2
#define UP 10
#define DOWN 11
#define LEFT 12
#define RIGHT 13
#define MAP_X 30
#define MAP_Y 30
#define 空地 0
#define 食物 1
#define 障碍物 2
#define P1 3
#define P2 4
#define 奖品 5 // 特殊食物
COORD g_Snake[100]; //第一条蛇的长度数组
COORDS g2_Snake[100]; //第二条蛇的长度数组
int g_nlenth = 4; //第一条蛇的长度
int g2_nlenth = 4; //第二条蛇的长度
int g_Dir = 右; //第一条蛇初始方向 右
int g2_Dir ; //第二条蛇的初始方向 左
int g_Map[MAP_X][MAP_Y] = {};
int g_FoodExist = 0; //基本食物
int g_Food = -1; // 加分不加身子
int g_SFood = -2; //对方加长度
int len = 0;
int len2 = 0;
int a = 200;// 初始速度
int n = 1; // 为下面做暂停定义的
int mem = 1;
#define KEY_DOWN(key) GetAsyncKeyState(key)==(SHORT)0x8001?1:0
#define MP mer.dwMousePosition
char ch;
int hp = 10; //第一个蛇的生命
int hp2 = 10; //第二个蛇的生命
using namespace std;
int waitKey(){
if (_kbhit()) //判断此用户是否按键,
return _getch(); //接受用户按键,并将按键返回
return 0; //没有按键,返回0
}
int waitKey2(){
if (_kbhit()) //判断此用户是否按键,
return _getch(); //接受用户按键,并将按键返回
return 0; //没有按键,返回0
}
/**********蛇的初始位置**************/
void InitGame()
{
g_Snake[0].X = 10;
g_Snake[0].Y = 3;
g_Snake[1].X = 10;
g_Snake[1].Y = 4;
g_Snake[2].X = 10;
g_Snake[2].Y = 5;
g_Snake[3].X = 10;
g_Snake[3].Y = 6;
for (int i = 0; i < MAP_X; i++)
{
for (int j = 0; j < MAP_Y; j++)
{
if (i == 0 || j == 0 || i == MAP_X - 1 || j == MAP_Y - 1) //定义的障碍物
{
g_Map[i][j] = 障碍物;
}
else
{
g_Map[i][j] = 空地;
}
}
}
}
void InitGame2()
{
g2_Snake[0].xx = 24;
g2_Snake[0].yy = 23;
g2_Snake[1].xx = 24;
g2_Snake[1].yy = 24;
g2_Snake[2].xx = 24;
g2_Snake[2].yy = 25;
g2_Snake[3].xx = 24;
g2_Snake[3].yy = 26;
for (int i = 0; i < MAP_X; i++)
{
for (int j = 0; j < MAP_Y; j++)
{
if (i == 0 || j == 0 || i == MAP_X - 1 || j == MAP_Y - 1) //定义的障碍物
{
g_Map[i][j] = 障碍物;
}
else
{
g_Map[i][j] = 空地;
}
}
}
}
/************************************************************************/
void WriteChar(int x, int y, const char* szStr, int color = 10 | 8)
{
// 1句柄代表的就是某一个实体
// 输出句柄代表的就是控制台输出相关的东西
// 使用控制台函数,需要先获得句柄
HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);
COORD pos = { x * 2, y };
SetConsoleTextAttribute(hOut, color);
SetConsoleCursorPosition(hOut, pos);
printf(szStr);
}
#define KEY_DOWN(key) GetAsyncKeyState(key)==(SHORT)0x8001?1:0
#define MP mer.dwMousePosition
void KeyEventProc(KEY_EVENT_RECORD ker)
{
COORD m = { 0, 0 };
if (ker.bKeyDown)
{
ch = ker.uChar.AsciiChar;
}
/*else
Draw_postion(m, "键盘弹起", 0x50);*/
}
void MouseEventProc(MOUSE_EVENT_RECORD mer, int c)
{
if (mer.dwButtonState == FROM_LEFT_1ST_BUTTON_PRESSED)
{
if (MP.X > 1 && MP.X < 60 && MP.Y>0 && MP.Y < 30)
{
switch (c)
{
case 1:WriteChar(mer.dwMousePosition.X / 2, mer.dwMousePosition.Y, "□", 15);
g_Map[mer.dwMousePosition.X / 2][mer.dwMousePosition.Y] = 2; break;
case 2:WriteChar(mer.dwMousePosition.X / 2, mer.dwMousePosition.Y, "※", 10);
g_Map[mer.dwMousePosition.X / 2][mer.dwMousePosition.Y] = -2; break;
case 3:WriteChar(mer.dwMousePosition.X / 2, mer.dwMousePosition.Y, "■", 15);
g_Map[mer.dwMousePosition.X / 2][mer.dwMousePosition.Y] = 0; break;
}
}
}
}
int flag = 1;
int MessageLoop()
{
HANDLE hStdin = GetStdHandle(STD_INPUT_HANDLE);
INPUT_RECORD stcRecord = { 0 };
DWORD dwRead;
SetConsoleMode(hStdin, ENABLE_WINDOW_INPUT | ENABLE_MOUSE_INPUT);
while (flag)
{
//等待事件
ReadConsoleInput(hStdin, &stcRecor