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

📄 key.c

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

    键盘操作相关函数实现
    最后修改: 2007-06-19

*/

#include "key.h"
#include <dos.h>

char g_szKeyName[128][7]=  /* 键名定义 */
{
    "!None\0\0",
    "Esc\0\0\0\0",
    "1\0\0\0\0\0\0",
    "2\0\0\0\0\0\0",
    "3\0\0\0\0\0\0",
    "4\0\0\0\0\0\0",
    "5\0\0\0\0\0\0",
    "6\0\0\0\0\0\0",
    "7\0\0\0\0\0\0",
    "8\0\0\0\0\0\0",
    "9\0\0\0\0\0\0",
    "0\0\0\0\0\0\0",
    "-\0\0\0\0\0\0",
    "+\0\0\0\0\0\0",
    "BackSp\0",
    "Tab\0\0\0\0",
    "Q\0\0\0\0\0\0",
    "W\0\0\0\0\0\0",
    "E\0\0\0\0\0\0",
    "R\0\0\0\0\0\0",
    "T\0\0\0\0\0\0",
    "Y\0\0\0\0\0\0",
    "U\0\0\0\0\0\0",
    "I\0\0\0\0\0\0",
    "O\0\0\0\0\0\0",
    "P\0\0\0\0\0\0",
    "[\0\0\0\0\0\0",
    "]\0\0\0\0\0\0",
    "Enter\0\0",
    "LCtrl\0\0",
    "A\0\0\0\0\0\0",
    "S\0\0\0\0\0\0",
    "D\0\0\0\0\0\0",
    "F\0\0\0\0\0\0",
    "G\0\0\0\0\0\0",
    "H\0\0\0\0\0\0",
    "J\0\0\0\0\0\0",
    "K\0\0\0\0\0\0",
    "L\0\0\0\0\0\0",
    ";\0\0\0\0\0\0",
    "\"\0\0\0\0\0\0",
    "~\0\0\0\0\0\0",
    "LShift\0",
    "\\\0\0\0\0\0\0",
    "Z\0\0\0\0\0\0",
    "X\0\0\0\0\0\0",
    "C\0\0\0\0\0\0",
    "V\0\0\0\0\0\0",
    "B\0\0\0\0\0\0",
    "N\0\0\0\0\0\0",
    "M\0\0\0\0\0\0",
    "<\0\0\0\0\0\0",
    ">\0\0\0\0\0\0",
    "?\0\0\0\0\0\0",
    "RShift\0",
    "Num *\0\0",
    "LAlt\0\0\0",
    "Space\0\0",
    "CapsLk\0",
    "F1\0\0\0\0\0",
    "F2\0\0\0\0\0",
    "F3\0\0\0\0\0",
    "F4\0\0\0\0\0",
    "F5\0\0\0\0\0",
    "F6\0\0\0\0\0",
    "F7\0\0\0\0\0",
    "F8\0\0\0\0\0",
    "F9\0\0\0\0\0",
    "F10\0\0\0\0",
    "NumLk\0\0",
    "ScrlLk\0",
    "Num 7\0\0",
    "Num 8\0\0",
    "Num 9\0\0",
    "Num -\0\0",
    "Num 4\0\0",
    "Num 5\0\0",
    "Num 6\0\0",
    "Num +\0\0",
    "Num 1\0\0",
    "Num 2\0\0",
    "Num 3\0\0",
    "Num 0\0\0",
    "NumDel\0",
    "!None\0\0",
    "!None\0\0",
    "!None\0\0",
    "F11\0\0\0\0",
    "F12\0\0\0\0",
    "!None\0\0",
    "!None\0\0",
    "Home\0\0\0",
    "Up\0\0\0\0\0",
    "PageUp\0",
    "!None\0\0",
    "Left\0\0\0",
    "!None\0\0",
    "Right\0\0",
    "!None\0\0",
    "End\0\0\0\0",
    "Down\0\0\0",
    "PageDn\0",
    "Insert\0",
    "Delete\0",
    "!None\0\0",
    "!None\0\0",
    "!None\0\0",
    "!None\0\0",
    "!None\0\0",
    "!None\0\0",
    "!None\0\0",
    "!None\0\0",
    "!None\0\0",
    "!None\0\0",
    "!None\0\0",
    "!None\0\0",
    "!None\0\0",
    "!None\0\0",
    "!None\0\0",
    "!None\0\0",
    "!None\0\0",
    "!None\0\0",
    "!None\0\0",
    "Pause\0\0",
    "NumEnt\0",
    "RCtrl\0\0",
    "Num /\0\0",
    "RAlt\0\0\0"
};

char g_byKeyState[128];  /* 各键当前状态 */
char g_byIsKBInstalled=0;  /* 标记键盘中断程序是否启用 */
char g_byFlagE0=0;  /* E0 状态 */
char g_byFlagE1=0;  /* E1 状态 */
char g_byFlag2A=0;  /* E0、2A 状态 */
char g_byLastKey=0;  /* 保存最后的按键 */
void interrupt far (*g_pfnOldInt9Handle)();  /* 原先的键盘中断程序地址 */

void interrupt NewInt9()
{

    unsigned char ScanCode, temp;

    ScanCode=inportb(0x60);
    temp=inportb(0x61);
    outportb(0x61, temp|0x80);
    outportb(0x61, temp&0x7f);
    outport(0x20, 0x20);

    temp=((ScanCode&0x80)>>7);  /* 取最高位 */

    if(ScanCode==0xE0)  /* E0 */
    {
        g_byFlagE0=1;
        ScanCode=0;
    }
    else if(ScanCode==0xE1)  /* E1 */
    {
        g_byFlagE1=1;
        ScanCode=0;
    }
    else
    {

        ScanCode&=0x7f;  /* 去除最高位, 取扫描码通码 */
        if(g_byFlagE0)  /* E0 状态下 */
        {
            if(ScanCode==0x1c) ScanCode=0x7c;       /* NumEnt */
            else if(ScanCode==0x1d) ScanCode=0x7d;  /* RCtrl  */
            else if(ScanCode==0x35) ScanCode=0x7e;  /* Num /  */
            else if(ScanCode==0x38) ScanCode=0x7f;  /* RAlt   */
            else if(ScanCode==0x2A)  /* E0、2A */
            {
                g_byFlag2A=!g_byFlag2A;  /* 因为 E0、2A 和 E0、AA 总是成对出现 */
                ScanCode=0;
            }
            else if(g_byFlag2A||temp==1)  /* E0、2A 状态下, 或者断码  */
            {
                ScanCode+=20;  /* Insert、Delete、Home、End、PageUp、PageDn、方向键 */
            }

            g_byFlagE0=0;
        }
        else if(g_byFlagE1)
        {
            if(ScanCode==0x45)  /* PauseBreak */
            {
                ScanCode=0x7b;
                g_byFlagE1=0;
            }
            else
            {
                ScanCode=0;  /* 忽略 PauseBreak 的第二个扫描码 0x1d */
            }
        }
    }

    /* 存按键状态 */
    if(temp)
    {
        g_byKeyState[ScanCode]=0;
        g_byLastKey=0;
    }
    else
    {
        g_byKeyState[ScanCode]=1;
        g_byLastKey=ScanCode;
    }
}

void ClearKey(unsigned char keyCode)  /* 清除按键状态 */
{
    g_byKeyState[keyCode]=0;
}

void ClearKeyState()  /* 清除所有按键状态 */
{
    int i;
    for(i=0;i<128;i++)
    {
        g_byKeyState[i]=0;
    }
    g_byFlagE0=0;
    g_byFlagE1=0;
    g_byFlag2A=0;
    g_byLastKey=0;
}

void InstallKeyboard()  /* 启用键盘中断 */
{

    if(g_byIsKBInstalled==0)
    {
        ClearKeyState();
        g_pfnOldInt9Handle=getvect(0x09);
        disable();
        setvect(0x09, NewInt9);
        enable();
        g_byIsKBInstalled=1;
    }
}

int ShutDownKeyboard()  /* 还原键盘中断 */
{
    if(g_byIsKBInstalled!=0)
    {
        disable();
        setvect(0x09, g_pfnOldInt9Handle);
        enable();
        g_byIsKBInstalled=0;
    }

    return 0;
}

char GetKeyState(unsigned char KeyCode)  /* 取指定键状态 */
{
    g_byLastKey=0;
    return g_byKeyState[KeyCode];
}

char *GetKeyName(unsigned char KeyCode) /* 取键名 */
{
    return g_szKeyName[KeyCode];
}

char BIOSKey()  /* 等待按键并返回键值 */
{
    int ret;

    g_byLastKey=0;
    while(g_byLastKey==0);
    ret=g_byLastKey;
    g_byLastKey=0;

    return ret;
}

⌨️ 快捷键说明

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