⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 editor.c

📁 坦克大战,实现基本的游戏功能
💻 C
字号:
/*
    MapEdit.c

    地图编辑器
    最后修改: 2007-06-19

*/

#include <stdio.h>
#include <bios.h>
#include "graph.h"
#include "mouse.h"
#include "char.h"
#include "map.h"

char g_byFlag=0;      /* 1-地图已被修改, 0-地图未修改 */
char m_szPath[17]="maps\\";    /* 存储文件名 */

void TryDraw(int nX1, int nY1, int nX2, int nY2, char byValue)  /* 画地图元素但不保存 */
{
    int i, j;

    for(i=nX1;i<=nX2;i++)
    {
        for(j=nY1;j<=nY2;j++)
        {
            DrawMapUnit(i, j, byValue);
        }
    }

    Rect(nX1*8, nY1*8, nX2*8+7, nY2*8+7, YELLOW);
}


void Restore(int nX1, int nY1, int nX2, int nY2)  /* 还原 TryDraw 所做 */
{
    int i, j;

    for(i=nX1;i<=nX2;i++)
    {
        for(j=nY1;j<=nY2;j++)
        {
            RestoreMapUnit(i, j);
        }
    }
    DrawBase();
}

void RealDraw(int nX1, int nY1, int nX2, int nY2, char byValue) /* 保存更改 */
{
    int i, j;

    for(i=nX1;i<=nX2;i++)
    {
        for(j=nY1;j<=nY2;j++)
        {
            SetMap(i, j, byValue);
        }
    }

    /* 老家 */
    SetMap(29, 59, 0);
    SetMap(30, 59, 0);

    /* 玩家出生点 */
    SetMap(26, 58, 0);
    SetMap(26, 59, 0);
    SetMap(27, 58, 0);
    SetMap(27, 59, 0);
    SetMap(32, 58, 0);
    SetMap(32, 59, 0);
    SetMap(33, 58, 0);
    SetMap(33, 59, 0);

    /* 敌方出生点 */
    SetMap( 0, 0, 0);
    SetMap( 0, 1, 0);
    SetMap( 1, 0, 0);
    SetMap( 1, 1, 0);
    SetMap(29, 0, 0);
    SetMap(29, 1, 0);
    SetMap(30, 0, 0);
    SetMap(30, 1, 0);
    SetMap(58, 0, 0);
    SetMap(58, 1, 0);
    SetMap(59, 0, 0);
    SetMap(59, 1, 0);

    g_byFlag=1;
}

void ShowMsg(char szMsg[])  /* 显示提示信息 */
{
    Box(488, 370, 631, 415, WHITE);
    OutTextXY(491, 373, 628, 388, szMsg, BLUE, -1);
}

char GetPath()  /* 等待用户输入文件名并获取 */
{
    int key, i=0;
    char ch, chr[2];

    key=bioskey(0);

    while(i<=12)
    {
        if(key==0x011b)  /* ESC */
        {
            return 0;
        }
        else if(key==0x1c0d)  /* Enter */
        {
            if(i>0) break;
        }
        else if(key==0x0e08)  /* BackSpace */
        {
            if(i>0)
            {
                i--;
                Box(491+i*8, 389, 506+i*8, 404, WHITE);
            }
        }
        else
        {
            ch=key&0x00ff;  /* 取低八位 */
            if((ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z'||(ch>='0'&&ch<='9')||ch=='.'))
            {
                if(i<12){
                    m_szPath[i+5]=ch;
                    chr[0]=ch;
                    chr[1]='\0';
                    OutTextXY(491+i*8, 389, 506+i*8, 404, chr, BLUE, -1);
                    i++;
                }
            }
        }
        key=bioskey(0);
    }
    m_szPath[i+5]='\0';
    return 1;
}

char SaveMap()  /* 保存地图,保存成功 1, 未保存返回 0 */
{
    FILE *temp;
    int key;

    ShowMsg("请输入文件名:");
    if(GetPath()==0)
    {
        ShowMsg("取消保存");
        return 0;
    }
    temp=fopen(m_szPath, "rb");
    if(temp!=NULL)
    {
        fclose(temp);
        ShowMsg("覆盖文件(Y/N)?");
        key=bioskey(0);
        while(key!=0x1559&&key!=0x1579&&key!=0x314e&&key!=0x316e)
        {
            key=bioskey(0);
        }
        if(key==0x314e||key==0x316e)
        {
            ShowMsg("取消保存");
            return 0;
        }
    }
    if(!WriteMap(m_szPath))
    {
        ShowMsg("保存失败");
        return 0;
    }
    ShowMsg("保存成功");
    g_byFlag=0;
    return 1;
}

char AskSave()  /* 询问是否保存, 保存成功或用户选择不保存返回 1, 其它情况返回 0 */
{
    int key;

    if(g_byFlag==0)
    {
        return 1;
    }
    ShowMsg("保存地图吗(Y/N)?");
    key=bioskey(0);
    while(key!=0x1559&&key!=0x1579&&key!=0x314e&&key!=0x316e)
    {
        key=bioskey(0);
    }
    if(key==0x314e||key==0x316e)
    {
        return 1;
    }
    else
    {
        return SaveMap();
    }
}

void LoadMap()  /* 打开地图文件并读入 */
{

    FILE *p;
    ShowMsg("请输入文件名:");
    if(GetPath()==0)
    {
        ShowMsg("取消打开");
        return;
    }
    if(ReadMap(m_szPath)==0)
    {
        ShowMsg("打开失败!");
        return;
    }
    DrawMap();
    ShowMsg(m_szPath);
    g_byFlag=0;
}

void NewMap()  /* 新建地图 */
{
    int i, j;

    for(i=0;i<60;i++)
    {
        for(j=0;j<60;j++)
        {
            SetMap(i, j, 0);
        }
    }
    DrawMap();

    RealDraw(28, 58, 28, 59, 1);
    RealDraw(29, 58, 30, 58, 1);
    RealDraw(31, 58, 31, 59, 1);
    Restore(28, 58, 31, 59);

    ShowMsg("新地图");

    g_byFlag=0;
}

void Init() /* 初始化 */
{
    InitGraph();
    InstallMouse(0, 0, 479, 479);
    OpenCharSet();

    Box(480, 0, 639, 479, WHITE);

    OutTextXY(497, 17, 640, 32, "请使用数字键选择", BLACK, -1);
    OutTextXY(531, 33, 640, 48, "0 -->", BLACK, -1);
    DrawMapUnit(72, 5, 0);
    OutTextXY(531, 49, 640, 64, "1 -->", BLACK, -1);
    DrawMapUnit(72, 7, 1);
    OutTextXY(531, 65, 640, 80, "2 -->", BLACK, -1);
    DrawMapUnit(72, 9, 2);
    OutTextXY(531, 81, 640, 96, "3 -->", BLACK, -1);
    DrawMapUnit(72, 11, 3);
    OutTextXY(531, 97, 640, 112, "4 -->", BLACK, -1);
    DrawMapUnit(72, 13, 4);

    OutTextXY(513, 129, 640, 144, "鼠标左键:画图", BLACK, -1);
    OutTextXY(513, 145, 640, 160, "鼠标右键:清除", BLACK, -1);

    OutTextXY(513, 177, 640, 192, "增大尺寸: +", BLACK, -1);
    OutTextXY(513, 193, 640, 208, "减少尺寸: -", BLACK, -1);

    OutTextXY(513, 241, 640, 256, "新建地图: F1", BLACK, -1);
    OutTextXY(513, 257, 640, 272, "保存地图: F2", BLACK, -1);
    OutTextXY(513, 273, 640, 288, "打开地图: F3", BLACK, -1);
    OutTextXY(513, 289, 640, 300, "退出程序: ESC", BLACK, -1);

    OutTextXY(491, 417, 640, 432, "坦克大战地图编辑器", BLACK, -1);
    OutTextXY(491, 433, 640, 448, "v1.0 final", BLACK, -1);
    OutTextXY(491, 449, 640, 464, "作者:溪流", BLACK, -1);

    NewMap();
}

int main()
{

    int x=0, y=0;
    int lx0, ly0, llastx=0, llasty=0, lx, ly;
    int type=1, size=1, key;


    Init();

    while(1)
    {
        /* 鼠标操作 */
        GetMousePosition(&x, &y);
        lx=x/8;
        ly=y/8;
        if(lx>60-size)
        {
            lx=60-size;
            x=480-8*size+1;
            SetMousePosition(x, y);
        }
        if(ly>60-size)
        {
            ly=60-size;
            y=480-8*size+1;
            SetMousePosition(x, y);
        }

        if(GetButtonState(LBUTTON)==PRESSED&&GetButtonState(RBUTTON)==RELEASED)
        {
            RealDraw(lx, ly, lx+size-1, ly+size-1, type);
        }
        else if(GetButtonState(LBUTTON)==RELEASED&&GetButtonState(RBUTTON)==PRESSED)
        {
            RealDraw(lx, ly, lx+size-1, ly+size-1, 0);
        }
        
        if(lx!=llastx||ly!=llasty)
        {
            Restore(llastx, llasty, llastx+size-1, llasty+size-1);
            TryDraw(lx, ly, lx+size-1, ly+size-1, type);
            llastx=lx;
            llasty=ly;
        }


        /* 键盘操作 */
        if(bioskey(1))
        {
            key=bioskey(0);
            switch(key)
            {
            case 0x0d3d: /* + */
                if(size<5)
                {
                    size++;
                    if(lx>60-size)
                    {
                        lx=60-size;
                        x=480-8*size+1;
                        SetMousePosition(x, y);
                    }
                    if(ly>60-size)
                    {
                        ly=60-size;
                        y=480-8*size+1;
                        SetMousePosition(x, y);
                    }
                    TryDraw(lx, ly, lx+size-1, ly+size-1, type);
                    llastx=lx;
                    llasty=ly;
                }
                break;
            case 0x0c2d: /* - */
                if(size>1)
                {
                    size--;
                    Restore(llastx+size, llasty, llastx+size, llasty+size);
                    Restore(llastx, llasty+size, llastx+size, llasty+size);
                    Restore(llastx+size, llasty+size, llastx+size, llasty+size);
                    TryDraw(lx, ly, lx+size-1, ly+size-1, type);
                }
                break;
            case 0x0b30: /* 0 */
                type=0;
                TryDraw(lx, ly, lx+size-1, ly+size-1, type);
                break;
            case 0x0231: /* 1 */
                type=1;
                TryDraw(lx, ly, lx+size-1, ly+size-1, type);
                break;
            case 0x0332: /* 2 */
                type=2;
                TryDraw(lx, ly, lx+size-1, ly+size-1, type);
                break;
            case 0x0433: /* 3 */
                type=3;
                TryDraw(lx, ly, lx+size-1, ly+size-1, type);
                break;
            case 0x0534: /* 4 */
                type=4;
                TryDraw(lx, ly, lx+size-1, ly+size-1, type);
                break;
            case 0x3b00: /* F1 */
                if(AskSave())
                    NewMap();
                break;
            case 0x3c00: /* F2 */
                SaveMap();
                break;
            case 0x3d00: /* F3 */
                if(AskSave())
                    LoadMap();
                break;
            case 0x011b: /* ESC */
                if(AskSave())
                {
                    CloseCharSet();
                    CloseGraph();
                    return 0;
                }
            }
        }
    }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -