打印

老x用51 DIY的VGA第三版:俄罗斯方块(更新完整源码及原理图)

[复制链接]
楼主: xwj
手机看帖
扫描二维码
随时随地手机跟帖
21
xwj|  楼主 | 2010-5-13 20:17 | 只看该作者 回帖奖励 |倒序浏览
中英文混合显示程序模块,可以灵活显示12*12点阵或者16*16点阵的中英文字符串,直接print("字符串")即可。


/****************************************************************************/
//源程序大公开//
//(c) Copyright 2001-2010 xuwenjun //
//All Rights Reserved //
//V1.01 //
/****************************************************************************/
//标 题:XWJ_OSD 程序 //
//文件名: xwj_osd_mini.c//
//版 本: V1.01 //
//修改人: 徐文军 E-mail:xuwenjun@21cn.com //
//日 期: 2010-05-13//
//描 述: GUI界面程序mini版 //
//只保留最简单的12和16点阵中英文 文字混合显示功能 //
/****************************************************************************/
//声 明: //
//以下代码仅免费提供给学习用途,但引用或修改后必须在文件中声明出处. //
//如用于商业用途请与作者联系.E-mail:xuwenjun@21cn.com //
//有问题请mailto xuwenjun@21cn.com 欢迎与我交流!//
/****************************************************************************/
//老版本: 无 老版本文件名://
/****************************************************************************/

                                // 有关 XWJ_OSD 包涵文件//
/****************************************************************************/
#include "asc8x12.h"                        //12x8点阵英文字库
#include "hz12.dot"
#include "hz16.dot"

#define __OSD_MAIN_C__
#include "xwj_osd_mini.h"                        //包涵OSD_IO头文件



                                //XWJ_OSD 函数实现体//
//XWJ_OSD私有函数
/****************************************************************************/
void fk_OSD_xyToAdr(uchar  uCol, uchar  uRow)                // 计算Sram地址,私有函数
{                                                                                ////(uCol:x:0~128,1点/1;uRow:y:0~64,1点/1)
        SramAdr = (((uRow&0x7f)*(OSD_CFG_GRH_WID/8))+uCol/8);//转换显存地址
}

//XWJ_OSD公用函数
/****************************************************************************/
void OSD_Cls(void)                                        // 清屏
{
        uint  i;

        bHz12=1;                //bHz12=1:12X12点阵汉字;bHz12=0:16X16点阵汉字
        bHz16bak=0;                                //上一行中显示过16点阵

        for(i=0;i<sizeof(diaplay_buf);i++)
        {
                *(uchar  xdata *)(i)=0xff;
        }
        uRow = 0;                                        // 置地址指针存储变量
        uCol = 0;
}

/****************************************************************************/
void fn_OSD_LF(uchar  uChrHeight)                                        // 清屏到行尾,换行,print函数调用
{
        uCol = 0;                                        //行尾空格补满后再换行
        if(bHz16bak)                                        //上一行中显示过16点阵
                uRow += 16;
        else
                uRow += 12;
       
        bHz16bak=0;                                        //上一行中显示过16点阵清零
        if(uRow > (OSD_CFG_GRH_HIG-uChrHeight))        // 光标换页检查
        {
                uRow = 0;
        }
}

/****************************************************************************/
void fn_OSD_Write12dot(uchar  lines,uchar  code *adr)         // 写2字节12点,print函数调用
{
        uchar  i;
        uchar  temp1,temp2;
        if(uCol&0x04)        //先写高半字节,再写一个字节,共12点
        {       
                for(i=0;i<lines;i++)
                {
                        temp1=*adr++;
                        temp2=*adr++;
                        *SramAdr = (*SramAdr|0xf0)&(~(temp1<<4));
                        SramAdr++;
                        *SramAdr = ~((temp1>>4)|(temp2<<4));
                        SramAdr += OSD_CFG_GRH_WID/8-1;
                }
        }
        else        //先写一个字节,再写低半字节,共12点
        {       
                for(i=0;i<lines;i++)
                {
                        temp1=*adr++;
                        temp2=*adr++;
                        *SramAdr = ~temp1;
                        SramAdr++;
                        *SramAdr = (*SramAdr|0x0f)&(~temp2);
                        SramAdr += OSD_CFG_GRH_WID/8-1;
                }
        }
}

/****************************************************************************/
void print(char*uStr)                                // ASCII、汉字混合显示函数
{
        charc1,c2;
        charcode *adr;
        uchar  i;
       

        uchar  uChrHeight,uChrWidth;
        uint j;
       
        if (bHz12)                //bHz12=1:12X12点阵汉字;bHz12=0:16X16点阵汉字
        {
                uChrHeight=12;                //汉字点阵高度,1点/单位
        }
        else
        {
                uChrHeight=16;
        }

        while(*uStr)
        {
                c1 = *uStr++;
                c2 = *uStr;
                if(c1 >= 0)
//                        uChrWidth=uChrHeight/2;
                        uChrWidth=(uChrHeight/2+4)&0xf8;
                else
                        uChrWidth=uChrHeight;
               
        // ---------------------------------------- //        修正光标到正确的显示位置
                if(uCol > (OSD_CFG_GRH_WID-uChrWidth) )        // 光标换行检查
                {
                        fn_OSD_LF(uChrHeight);                                        // 清屏到行尾,换行
                }
        // ---------------------------------------- //
                if(c1 >= 0)                                        // ASCII
                {
                        if(c1 < 0x20)                        //字符
                        {
                                switch(c1)
                                {
                                        case LCR:
                                        case LF:                // 回车或换行
                                                fn_OSD_LF(uChrHeight);                                        // 清屏到行尾,换行
                                                if(uRow == 0)        // 光标换页检查
                                                {
//                                                        delay(1000);
                                                        OSD_Cls();
                                                }
                                               
                                                continue;                                        //回车换行不显示
                                        case BS:                // 退格
                                                if(uCol >= uChrWidth)
                                                        uCol -= uChrWidth;
                                                c1 = ' ';
                                                break;
                                        default:                // 其他
                                                c1 = '.';        // < 0x20时,显示1个.
                                                break;
                                }
                        }
        // ---------------------------------------- //        可显示ASCII字符
                        fk_OSD_xyToAdr(uCol,uRow);                // 计算Sram地址
                        adr=&chardot8_12[ 0 ]+(c1-0x20)*12;
                        for(i=0;i<uChrHeight;i++)
                        {
                                if(i<12)
                                {
                                        *SramAdr = ~*adr++;
                                }
                                else
                                {
                                        *SramAdr = 0xff;
                                }
                                SramAdr += OSD_CFG_GRH_WID/8;
                        }
                        if(c1 != BS)                        // 非退格
                                uCol += uChrWidth;
                }
                else
        // ---------------------------------------- //       
                {                                        // 中文
        // ---------------------------------------- //        索引字库方式显示
                        fk_OSD_xyToAdr(uCol,uRow);                // 计算Sram地址
                        if (!bHz12)                //bHz12=1:12X12点阵汉字;bHz12=0:16X16点阵汉字
                        {
                                bHz16bak=1;                        //本行显示过16点阵标志
                                for(j=0;j<hzNum16;j++)
                                {
                                        if((c1 ==(char)( hzIndex16[ j*2 ])) && (c2 == (char)(hzIndex16[ j*2+1 ])))
                                                break;
                                }
                                adr=&hzdot16[ 0 ]+j*32;
                                for(i=0;i<uChrHeight;i++)
                                {
                                        *SramAdr++ = ~*adr++;
                                        *SramAdr = ~*adr++;
                                        SramAdr += OSD_CFG_GRH_WID/8-1;
                                }
                        }
                        else
                        {
                                for(j=0;j<hzNum12;j++)
                                {
                                        if((c1 ==(char)( hzIndex12[ j*2 ])) && (c2 == (char)(hzIndex12[ j*2+1 ])))
                                                break;
                                }
                                adr=&hzdot12[ 0 ]+j*24;
                                fn_OSD_Write12dot(uChrHeight,adr);         // 写2字节12点,print函数调用
                        }                               
                        uCol += uChrWidth;
                        uStr++;                                                                //一个汉字2字节,英文只一字节
                }
        }       
}

/****************************************************************************/

//本程序由xwj设计的UltraEdit脚本加亮显示,如需要脚本请访问我的Blog:wwww.21ic.com或联系xwjfile@21cn.com

使用特权

评论回复
22
xwj|  楼主 | 2010-5-13 20:28 | 只看该作者
俄罗斯方块程序,以前上传过的,这次做了一点点改动和优化,就直接套用进去了。

主要就是修改各种显示:比如方块、颜色、提示等。
主程序很简单,就是每隔一场读取一次按键,然后执行对应的移动、合并、消行、计分等。

老x的俄罗斯方块采用了和别人完全不同的碰撞判断方法哦~ 这点就要看你自己去读程序、发掘它了哦~:)

俄罗斯方块程序部分摘录与下:
/****************************************************************************/
//                                源程序大公开                              //
//                    (c) Copyright 2001-2010 xuwenjun                     //
//                            All Rights Reserved                           //
//                                    V1.01                                 //
/****************************************************************************/
//标 题: 俄罗斯方块程序                                                    //
//文件名: xwj_fk.c                                                          //
//版 本: V1.01                                                             //
//修改人: 徐文军                         E-mail:xuwenjun@21cn.com           //
//日 期: 2010-05-13                                                        //
//描 述: 俄罗斯方块程序                                                    //
//      1、改为VGA输出显示,支持彩色显示                                    //
//      2、增加方块投影预览、新方块避免碰撞、过关效果等,功能更为完善       //
//      3、程序代码量相当少,包括VGA驱动占用:data=123.1 xdata=764 code=8797  //
//         其中还包括字库占用的1786字节                                     //
//声 明:                                                                   //
//        以下代码仅免费提供给学习用途,但引用或修改后必须在文件中声明出处. //
//        如用于商业用途请与作者联系.    E-mail:xuwenjun@21cn.com           //
//        有问题请mailto xuwenjun@21cn.com   欢迎与我交流!                  //
/****************************************************************************/
//老版本: V1.00                          老版本文件名:xwj_fk.c              //
//创建人: 徐文军                         E-mail:xuwenjun@21cn.com           //
//日 期: 05-05-13                                                          //
//描 述: 老x以前发布过的俄罗斯方块程序哦,5年啦~                           //
//      1、功能完整,直接使用                                               //
//      2、模块独立性强,移植方便,外部仅init和move函数,修改显示和输入即可 //
//      3、对减少内存占用、尽量减少屏幕操作进行适当优化                     //
//      4、新方块生成高度随机,绝对无规律                                   //
//      5、仿真环境为Keil7.5+Proteus6.5,可以联机也可脱机运行                //
/****************************************************************************/
#include <stdlib.h>
#include "xwj_vga_drive.h"      //包涵OSD_index头文件
#include "xwj_osd_mini.h"       //包涵OSD_IO头文件
#include "keyboard.h"           //包涵键盘头文件
#include "change.h"             //包涵数制转换头文件
#include "music.h"              //包涵音乐头文件
#define __XWJ_FK_C__
#include "xwj_fk.h"             //包涵俄罗斯方块头文件
//==============变量定义==============
/****************************************************************************/
...
//==============常量定义==============
/****************************************************************************/
...
/****************************************************************************/
void fk_dot(uchar  x,uchar  y,uchar  type);        //显示1个方块点
void fk_cldot(uchar  x,uchar  y);             //清除1个方块点
void fk_refline(yy);                            //刷新1行背景
void fk_print(uchar  x,uchar  y,uchar  type,uchar  num);     //显示方块数字0~9,3x5点阵,x=0~7,y=4~19
void fk_print2(uchar  x,uchar  y,uchar  type,uchar  num); //显示2位方块数字0~9,3x5点阵,x=0~3,y=4~19
void fk_show(void);                 //显示分数
bit fk_chk(void);                   //当前方块冲突检查
bit fk_chknew(void);                    //新方块冲突检查
void fk_dotnew(uchar  x,uchar  y);        //显示1个预览方块点
void fk_cldotnew(uchar  x,uchar  y);      //清除1个预览方块点
void fk_refnew(void);                   //刷新预览方块
void fk_del_refnew(void);               //清除预览方块
void fk_ref_pause(bit flag);        //显示/清除当前方块,暂停时用
void fk_ref_pauseold(bit flag);     //显示/清除old方块
void fk_reffk(void);                    //刷新方块
void fk_new_auto(void);                 //新方块自动避免碰撞
uchar  fk_chk_shadow(void);          //查找判断新的方块投影高度
void fk_shadow(void);           //显示方块投影
void fk_shadow_flash(void);         //方块投影闪烁
void fk_new(void);                      //产生新方块
void fk_Cls(void);                  // 方块清屏
void fk_add(void)                   //方块合并
{
    uchar  i,j,k;
    uchar  full=0x00;
    uchar  fulltemp;
    uchar  fullline=0x00;
   
    for (i=0;i<4;i++)   //方块合并
    {
        fk_map[ fk_y+i ] |= (fk_mod[ fk_type_r ][ i ])<<fk_x;
        full <<= 1;
        if ((fk_y+i >= 4) && (fk_map[ fk_y+i ] == 0xffff))        //满行
        {
            full |= 0x01;
        }
    }
   
    if (full != 0)      //有满行
    {
        Start_music(Music1);    //播放音乐:删除一满行音效
        for (j=0;j<5;j++)       //消行闪烁3次
        {
            delay17(12);
            fulltemp=full;
            for (i=0;i<4;i++)   //4行
            {
                if ((fulltemp&0x08) != 0)
                {
                    fk_map[ fk_y+i ] ^= FULLMAP;
                    fk_refline(fk_y+i);
                }
                fulltemp <<= 1;
            }
        }
        for (i=LINEMAX;i<LINEMAX+4;i++) //上面行下移
        {
            fk_refline(i);
        }
        fulltemp=full;
        for (i=fk_y;i<LINEMAX+4+fullline;i++)   //上面行下移
        {
            ...
        }
        line += fullline;                           //更新分数、行数
        i=(1<<fullline)-1;
        score_guan += i;                //一关的得分
        score += i;                     //总分
        bHz12=0;            //bHz12=1:12X12点阵汉字;bHz12=0:16X16点阵汉字
        printat(0,69,str_score[ fullline ]);  //夸奖
        fk_show();                      //显示分数
        if (((line-fullline)/LINEGUAN) != (line/LINEGUAN))//每20行速度+1
        {
            speed ++;
            Start_music(Music8);    //播放音乐:过关音效
            
            bHz12=0;        //bHz12=1:12X12点阵汉字;bHz12=0:16X16点阵汉字
            printat(0,69,"(^_^)");
            
            bHz12=1;        //bHz12=1:12X12点阵汉字;bHz12=0:16X16点阵汉字
            if(score_guan>=75)                  //一关的得分
                {printat(20,0,str_win[ 6 ]);} //评价  ""
            else if(score_guan>65)
                {printat(20,0,str_win[ 5 ]);} //评价  ""
            else if(score_guan>52)
                {printat(20,0,str_win[ 4 ]);} //评价  ""
            else if(score_guan>40)
                {printat(20,0,str_win[ 3 ]);} //评价  ""
            else if(score_guan>30)
                {printat(20,0,str_win[ 2 ]);} //评价  ""
            else if(score_guan>22)
                {printat(20,0,str_win[ 1 ]);} //评价  ""
            else
                {printat(20,0,str_win[ 0 ]);} //评价  ""
            score_guan=0;                   //一关的得分
            
            if(speed>=12)
            {
                //。。。过关特效
            }
            delay17(10);
        }
        fk_new();               //产生新方块
    }
    else
    {
        bHz12=0;        //bHz12=1:12X12点阵汉字;bHz12=0:16X16点阵汉字
        if (fk_y > LINEMAX-6)   //
            {printat(0,69,"糟糕 ");}        //糟糕了
        else if (fk_y > LINEMAX-10) //
            {printat(0,69,"加油 ");}        //加油啊
        else
            {printat(0,69,str_score[ 0 ]);}   //空白

        if (fk_y==LINEMAX)      //在最高位置碰撞且不能消行则游戏结束
        {
            fk_run=0;   //方块初始化
            Start_music(Music5);    //播放音乐:游戏结束音乐
            bHz12=0;        //bHz12=1:12X12点阵汉字;bHz12=0:16X16点阵汉字
            printat(0,69,":>_<:");
        }
        else
            fk_new();   //产生新方块
    }
}
/****************************************************************************/
void fk_init(void)                  //方块初始化
{
    uchar  i;
    uchar  j;
    if(Mute)                //音乐关闭
        Start_music(Music4);    //播放音乐:开机音乐
    keyinit();          //按键初始化,清空输入缓冲区
   
    moven=0;
    if (maxscore<score)
        maxscore=score;             //保留最高记录
    score=0;
    if (maxline<line)
        maxline=line;
    line=0;
    fk_show();                      //显示分数
    fk_del_refnew();                //清除预览方块
    for (i=0;i<sizeof(diaplay_buf)%255;i++)
    {
        j=j+diaplay_buf[ i ];
    }
    srand(j);
    for (i=0;i<sizeof(Dis_Buf);i++)
    {
        j=j+Dis_Buf[ i ];
        j+=rand();
    }
    srand(j+TL0);
    j=rand()&0xfc+1;
    for (i=0;i<j;i++)
    {
        rand();
    }
    fk_newtype_r = rand()%28;
    fk_newx=NEWX;
    score_guan=0;                   //一关的得分
    for (i=0;i<4;i++)
    {
        fk_map[ i ]=0xffff;           //背景映象
    }
    for (i=4;i<LINEMAX+4;i++)
    {
        fk_map[ i ]=0xffff;           //背景映象
        fk_refline(i);              //刷新1行背景
        delay17(6);
    }
    for (i=LINEMAX+4;i>=4;i--)
    {
        fk_map[ i ]=~FULLMAP;         //背景映象
        fk_refline(i);              //刷新1行背景
        delay17(6);
    }
   
    fk_print2(1,6,1,automapn);      //显示2位方块数字0~9,3x5点阵,x=0~3,y=4~19
    fk_print2(1,13,0,speed+1);      //显示2位方块数字0~9,3x5点阵,x=0~3,y=4~19
    fk_new();                       //产生新方块
    while (~fk_run)
    {
        fk_move();                  //等待设置速度关数开始
        delay17(1);
    }
    fk_pause=0;                     //游戏暂停:关
    fk_Cls();                       // 清屏
    fk_show();                      //显示分数
    fk_new();                       //产生新方块
}   
/****************************************************************************/
void fk_move(void)                      //移动方块
{
    unsigned char temp;
    unsigned char i;
   
    if(KeyTest())                   //检查有无按键
    {
        putinbuf(KeyGetCode());     //按键码输入接收缓冲区
    }
    if (checkin())
    {
        temp=getbyte();
    }
    else
        temp=0xff;                  //无键设为无效键用于下移方块
    switch(temp)
    {
    default:
        if (fk_pause)
            break;
        if (--moven)                //游戏难度
            break;
        else
        {
            moven=fk_speed[ speed ];
            if (fk_run &&(speed<10))                    //游戏中自动下移
                Start_music(Music0);    //播放音乐:自动下落音效
        }
    case DownKey:       //下移
        moven++;
        if (fk_run)                 //游戏中下移
        {
            if (fk_pause)               //游戏暂停
                break;
   
            if(fk_y>0)
            {
                fk_y--;
                if(fk_chk())
                {
                    fk_y++;     //有冲突取消操作,执行碰撞组合
                    fk_add();   //方块合并  //产生新方块
                }
            }
            else                //方块到底也执行碰撞组合
            {
                fk_add();       //方块合并
            }
        }
        else                        //初始化时
        {
            fk_new();               //产生新方块
        }
        break;
    case UpKey:     //上键
        if (fk_run)                 //游戏中右移
        {
            fk_pause^=1;
            if(!fk_pause)
            {
                fk_ref_pause(1);        //恢复暂停时刷新显示方块
            }
            else
            {
                fk_shadow_flash();          //清除:方块投影
            }
        }
        else
        {
            fk_run=1;
        }
        break;
    case EndKey:        //下移到底
        if (fk_pause)               //游戏暂停
            break;
   
        fk_y=fk_shadowy;
        moven=1;
        break;
    case RightKey:      //右移
        if (fk_run)                 //游戏中右移
        {
            moven++;
            if (fk_pause)               //游戏暂停
                break;
   
            if(fk_x<=FK_LEN)
            {
                fk_x++;
                if(fk_chk())
                    fk_x--;//有冲突取消操作
            }
        }
        else                            //初始化时
        {
            speed++;
            speed %= 16;
            fk_print2(1,13,0,speed+1);      //显示2位方块数字0~9,3x5点阵,x=0~3,y=4~19
            fk_show();                  //显示分数
        }
        break;
    case LeftKey:       //左移
        if (fk_run)                     //游戏中左移
        {
            moven++;
            if (fk_pause)               //游戏暂停
                break;
   
            if(fk_x>0)
            {
                fk_x--;
                if(fk_chk())
                    fk_x++;//有冲突取消操作
            }
        }
        else                            //初始化时
        {
            automapn++;
            fk_map[ automapn+3 ]=rand()-1|~FULLMAP; //背景映象
            fk_refline(automapn+3);             //刷新1行背景
            if(automapn == 16)
            {
                automapn = 0;
                fk_Cls();                   // 清屏
            }
            fk_print2(1,6,1,automapn);      //显示2位方块数字0~9,3x5点阵,x=0~3,y=4~19
            fk_print2(1,13,0,speed+1);      //显示2位方块数字0~9,3x5点阵,x=0~3,y=4~19
            fk_show();                  //显示分数
        }
        break;
    case BKey:      //右转
        if (fk_run)                     //游戏中右转
        {
            moven++;
            if (fk_pause)               //游戏暂停
                break;
   
            i=fk_type_r;
            fk_type_r++;
            if((fk_type_r&0xfc) != (i&0xfc))
                fk_type_r = i&0xfc;
            if(fk_chk())
            {
                fk_type_r = i;                  //有冲突取消操作
                if(fk_x ==0)
                {
                    putinbuf(RightKey);     //按键码输入接收缓冲区
                    putinbuf(BKey);         //按键码输入接收缓冲区
                    putinbuf(LeftKey);      //按键码输入接收缓冲区
                }
                else if(fk_x >= FK_LEN-4)
                {
                    need_rounds++;
                    putinbuf(LeftKey);      //按键码输入接收缓冲区
                    putinbuf(BKey);         //按键码输入接收缓冲区
                }
            }
            else
            {
                while(need_rounds)
                {
                    need_rounds--;
                    putinbuf(RightKey);     //按键码输入接收缓冲区
                }
            }
        }
        else                            //初始化时
        {
            fk_run = 1;
        }
        break;
    case AKey:      //左转
        if (fk_run)                     //游戏中右转
        {
            moven++;
            if (fk_pause)               //游戏暂停
                break;
   
            i=fk_type_r;
            fk_type_r--;
            if((fk_type_r&0xfc) != (i&0xfc))
                fk_type_r = (i&0xfc)+3;
            if(fk_chk())
            {
                fk_type_r = i;                  //有冲突取消操作
                if(fk_x ==0)
                {
                    putinbuf(RightKey);     //按键码输入接收缓冲区
                    putinbuf(BKey);         //按键码输入接收缓冲区
                    putinbuf(LeftKey);      //按键码输入接收缓冲区
                }
                else if(fk_x >= FK_LEN-4)
                {
                    need_rounds++;
                    putinbuf(LeftKey);      //按键码输入接收缓冲区
                    putinbuf(AKey);         //按键码输入接收缓冲区
                }
            }
            else
            {
                while(need_rounds)
                {
                    need_rounds--;
                    putinbuf(RightKey);     //按键码输入接收缓冲区
                }
            }
        }
        else                            //初始化时
        {
            fk_run = 1;
        }
        break;
    }
   
    if(fk_run)
    {
        if(fk_pause)
        {
            if(flag_Time0_5s_old^flag_Time0_5s_State)   //半秒标志有变化
            {
                flag_Time0_5s_old=flag_Time0_5s_State;
                fk_ref_pause(flag_Time0_5s_State);      //暂停时刷新显示方块
            }
        }
        else if((fk_x!=fk_oldx)||(fk_y!=fk_oldy)||(fk_type_r!=fk_oldtype_r))
        {
            if((fk_x!=fk_oldx)||(fk_type_r!=fk_oldtype_r))
            {
                fk_shadow();            //显示方块投影
            }
            
            fk_reffk(); //刷新显示
        }
        else
        {
            fk_shadow_flash();          //方块投影闪烁
        }
    }
    rand();
}
/****************************************************************************/
void main(void)
{
    OSD_Cls();
    vga_init();             //VGA驱动初始化
    delay17(6);             //延时0.1秒
    Mute=1;                 //音乐关闭
    fk_init();              //方块初始化
    while(1)
    {
        if (~fk_run)
            fk_init();              //方块初始化
        fk_move();                  //移动方块
        delay17(1);
    }
}
/****************************************************************************/
//本程序由xwj设计的UltraEdit脚本加亮显示,如需要脚本请访问我的Blog:wwww.21ic.com或联系xwjfile@21cn.com

使用特权

评论回复
23
xwj|  楼主 | 2010-5-13 20:40 | 只看该作者
一个游戏机好不好用、好不好玩,按键是很关键的。
既要可靠,又要灵敏,而且最好是能够聪明的**下所有的按键序列,这样就能快速操作来的玩激烈的游戏了。

老x的按键程序,可带有缓冲队列哦~ 因此可以非常快地按键而不丢键、不误操作。不然的话,想象下要让方块转2下它却转了3下或者只转了1下的话,那会怎么样呢?:)

而且,老x的按键程序可以很容易的支持多个输入设备哦~想想这有什么用呢?

PS:
程序贴太多就没人看了。老x先卖个关子,等有人要的时候再贴剩下的:)

使用特权

评论回复
24
xwj|  楼主 | 2010-5-13 21:09 | 只看该作者
本帖最后由 xwj 于 2010-6-23 17:59 编辑

做这个(而且非要用51)主要是因为看到别人做了个这样的:
[侃单片机] 主题:(转)AT89c2051+彩显+俄罗斯方块(绝对震撼)
所以老x就想做个明显胜过他的。这个硬件是最早做好了的,简单的夜早就调出来了,只是没想到匠人先做了个“最烂的示波器”出来,结果害得老x也跑题了,也跑去做那个VGA示波器去了;P

现在终于回归正题,把俄罗斯方块做好了,以后也就不准备再来折腾这个了。
还是13楼和14楼说的对啊,
不应该再玩这些东西了,还是把时间放在挣钱上要紧

这年头,挣钱才是王道啊~~~~~~~~~~~~~~~~~




看看老x做的:
IMG_0323.jpg (664.77 KB)
下载次数:0
2010-5-13 19:50




使用特权

评论回复
25
dong2007| | 2010-5-13 21:40 | 只看该作者
冲着VGA来的,哈哈!

使用特权

评论回复
26
mybao| | 2010-5-14 16:59 | 只看该作者
顶一个,辛苦了

使用特权

评论回复
27
cc810610186| | 2010-5-15 10:27 | 只看该作者
这也太牛了,差距实在太大了。。。

使用特权

评论回复
28
fuxiangbo| | 2010-5-15 10:35 | 只看该作者
这个好玩,弄个套件来...在显示器上玩不错,现在都有闲置显示器了....

使用特权

评论回复
29
juelang| | 2010-5-15 11:44 | 只看该作者
我见识了强人了,这还叫惨不忍睹,我无地自容了

使用特权

评论回复
30
xuyiyi| | 2010-5-15 11:54 | 只看该作者
哈!顶老X, 学习了!

使用特权

评论回复
31
xwj|  楼主 | 2010-5-15 11:56 | 只看该作者
呵呵,
“惨不忍睹”是指手机拍出来的视频效果画质惨不忍睹,即看不清楚,噪点巨大,连颜色都严重变样了,最恼火的是动态视频严重拖尾,汗!:L

实际显示效果比视频里的漂亮、清晰多了。

使用特权

评论回复
32
xwj|  楼主 | 2010-5-15 11:58 | 只看该作者
PS:
老x正在整理原理图,很快就会贴出来的(很简单的)。

至于套件,等感兴趣的人多了时再统一决定外壳、打板吧,游戏性还是挺不错的:)

使用特权

评论回复
33
xuyiyi| | 2010-5-15 13:21 | 只看该作者
哈!支持!
等老X的套件。

使用特权

评论回复
34
lgc-sdu| | 2010-5-15 16:18 | 只看该作者
大牛啊 留名在此:victory:

使用特权

评论回复
35
subey2010| | 2010-5-15 23:17 | 只看该作者
太牛了

使用特权

评论回复
36
subey2010| | 2010-5-15 23:18 | 只看该作者
太牛了

使用特权

评论回复
37
tankooo| | 2010-5-17 09:31 | 只看该作者
本帖最后由 tankooo 于 2010-5-17 10:01 编辑

关注  
坐等老X套件
可以出书的话也不错

使用特权

评论回复
38
原野之狼| | 2010-5-17 11:41 | 只看该作者
我也等着~

使用特权

评论回复
39
huangqi412| | 2010-5-18 09:11 | 只看该作者
半夜还不睡觉:L
mbutterfly 发表于 2010-5-12 08:28


一眼扫过整个贴,俺只看到一个贴...

使用特权

评论回复
40
cubasa| | 2010-5-18 10:30 | 只看该作者
老X下一步不是想做WII了吧?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则