C语言贪吃蛇(备注,源码都有)

贪吃蛇小游戏
实现的功能:
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
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值