回 帖 发 新 帖 刷新版面

主题:问个用Qbasic编游戏的问题?

请问用什么方法才能用键盘控制一个东西移动呢?
就像按右键时小人往右跑之类的……
高手们卜另赐教!!

回复列表 (共34个回复)

21 楼

在程序的最后加一个语句end也可.在运行程序后怎么只能按右键?

22 楼

在程序最后加一个语句END也可以.
请问:运行程后只能按右键?

23 楼

Del是CHR$(127)

24 楼

各位大哥
小弟我不懂
为什末你们用的语句在我的教科书上没有呀
???????????????????????[em10]

25 楼

别睬他们.

26 楼

问一个问题,为什么我用75 77 72 80 时只能用小键盘上的4 6 8 2
而直按用键盘上的上下左右键?键盘上的“上下左右”键的控制码是多少呀?
我用的是DOS自带的Qbasic1.1版(我怀疑是版本的问题),麻烦用这个版本试试,谢谢

27 楼

我还得努力,这些贴子我一句都看不懂,但我觉得如果学会了会很好玩,很有用

28 楼

DECLARE SUB Food ()     '食物投放
DECLARE SUB headin (xx!, yy!)   '画蛇头
DECLARE SUB EndOut ()           '擦蛇尾
DECLARE SUB delay (seconds)     '时间延迟
SCREEN 12
DIM SHARED foodx AS INTEGER     '记录食物坐标
DIM SHARED foody AS INTEGER

DIM SHARED snake(1 TO 2, 1 TO 5000) AS INTEGER  '构造队列,用于存储坐标系列
DIM SHARED snakeh AS INTEGER
DIM SHARED snakee AS INTEGER
DIM SHARED snakelenth AS INTEGER
gamestart:
snakelenth = 0
snakeh = 1
snakee = 1
CLS
INPUT "Yow want to play witch stage(1 - 50)"; stage     '用户选择游戏级别
IF stage = 0 THEN GOTO 1000
IF stage < 1 THEN stage = 1     '游戏级别合法化处理
IF stage > 50 THEN stage = 50
Grade = stage
OutGrade = 0
stage = .5 * (1 / stage)
CLS
LINE (1, 1)-(640, 480), , BF
LINE (10, 10)-(630, 470), 9, BF
DIM xx, yy
DIM SHARED way AS STRING
way = ""
xx = 60
yy = 10
CALL headin(10, 10)
CALL headin(20, 10)
CALL headin(30, 10)
CALL headin(40, 10)
CALL headin(50, 10)

CALL Food
Draws:
    IF xx < 10 OR xx > 620 OR yy < 10 OR yy > 460 OR way = "stop" THEN      '撞墙判断
        LOCATE 1, 30
        PRINT "  CopyRight 2005 hguitar  "
        LOCATE 2, 30
        PRINT "http://www.liushunqing.com ";
        LOCATE 10, 1
        PRINT STRING$(80, "=")
        PRINT STRING$(30, " "); " Game Over "; STRING$(39, " ")
        PRINT STRING$(35, " "); " Press [Esc] To Escape..."; STRING$(20, " ")
        PRINT STRING$(35, " "); " Press [Enter] To Restart..."; STRING$(17, " ")
        PRINT STRING$(80, " ")
        PRINT STRING$(80, " ")
        LOCATE 15, 40
        PRINT "Your grade is:"; OutGrade
        PRINT STRING$(80, "=")
        DO
            key$ = INKEY$
            IF key$ = CHR$(27) THEN END
            IF key$ = CHR$(13) THEN GOTO gamestart
        LOOP
    END IF
       
    IF way <> "" THEN
        IF POINT(xx + 5, yy + 5) = 0 THEN way = "stop"  '撞自己判断
        CALL headin(xx, yy)     '画蛇头
        IF xx = foodx AND yy = foody AND snakelenth <= 5000 THEN '吃蛋判断
            CALL headin(xx, yy)
            CALL Food                      '重新投放食物
            CALL Food
            CALL Food
            CALL Food
            CALL Food
            CALL Food
            CALL Food
            OutGrade = Grade + OutGrade
            CALL headin(xx, yy)
        ELSEIF snakelenth > 5000 THEN
            snakelenth = 5000
            CALL Food                       '重新投放食物
            CALL Food
            CALL Food
            CALL Food
            CALL Food
            CALL Food
            CALL Food
            OutGrade = Grade + OutGrade     '计分
            CALL EndOut                     '擦蛇尾
        ELSE
            CALL EndOut                     '擦蛇尾
        END IF
    END IF
       
    Draws$ = INKEY$         '获取用户输入
    IF Draws$ = CHR$(0) + CHR$(75) OR way = "r" THEN        '根据用户按键选择方向
        xx = xx - 10
        CALL delay(stage)
    ELSEIF Draws$ = CHR$(0) + CHR$(77) OR way = "l" THEN
        xx = xx + 10
        CALL delay(stage)
    ELSEIF Draws$ = CHR$(0) + CHR$(72) OR way = "u" THEN
        yy = yy - 10
        CALL delay(stage)
    ELSEIF Draws$ = CHR$(0) + CHR$(80) OR way = "d" THEN
        yy = yy + 10
        CALL delay(stage)
    ELSE
        CALL delay(stage)
    END IF

    GOTO Draws      '返回,继续画蛇
1000 END

SUB delay (seconds)

    delays = TIMER                  '利用Timer实现延时
    WHILE ABS(TIMER - delays) < seconds
    WEND
       
    Draws$ = INKEY$         '获取用户输入
    IF Draws$ = CHR$(27) THEN       '根据用户输入选择操作方式
        way = "stop"
    ELSEIF Draws$ = CHR$(0) + CHR$(75) AND way <> "l" THEN
        way = "r"
    ELSEIF Draws$ = CHR$(0) + CHR$(77) AND way <> "r" THEN
        way = "l"
    ELSEIF Draws$ = CHR$(0) + CHR$(72) AND way <> "d" THEN
        way = "u"
    ELSEIF Draws$ = CHR$(0) + CHR$(80) AND way <> "u" THEN
        way = "d"
    END IF

END SUB

SUB EndOut      '擦蛇尾(实质上是数据出队列的操作)
    snakelenth = snakelenth - 1
    IF snakelenth < 0 THEN snakelenth = 0: GOTO EndEndOut
    xx = snake(1, snakee)
    yy = snake(2, snakee)
    snakee = (snakee + 1) MOD 5001
    LINE (xx, yy)-(xx + 9, yy + 9), 9, BF
EndEndOut:
END SUB

SUB Food        '食物投放过程
    RANDOMIZE TIMER
ReFood:
    xx = (INT(RND * 62) + 1) * 10   '随机生成食物坐标
    yy = (INT(RND * 46) + 1) * 10
    IF POINT(xx + 3, yy + 3) <> 9 THEN GOTO ReFood  '如果不在空地上(例如蛇身上),则重新生成
    LINE (xx, yy)-(xx + 9, yy + 9), , BF  '画食物
    foodx = xx      '记录食物坐标
    foody = yy
END SUB

SUB headin (xx, yy)     '画蛇头,并将坐标入队列储存
    snakelenth = snakelenth + 1
    snake(1, snakeh) = xx
    snake(2, snakeh) = yy
    snakeh = (snakeh + 1) MOD 5001
    LINE (xx, yy)-(xx + 9, yy + 9), 0, BF
END SUB

'加分啊,加分,我写这么多就是为了加分

29 楼

DECLARE SUB Food ()     '食物投放
DECLARE SUB headin (xx!, yy!)   '画蛇头
DECLARE SUB EndOut ()           '擦蛇尾
DECLARE SUB delay (seconds)     '时间延迟
SCREEN 12
DIM SHARED foodx AS INTEGER     '记录食物坐标
DIM SHARED foody AS INTEGER

DIM SHARED snake(1 TO 2, 1 TO 5000) AS INTEGER  '构造队列,用于存储坐标系列
DIM SHARED snakeh AS INTEGER
DIM SHARED snakee AS INTEGER
DIM SHARED snakelenth AS INTEGER
gamestart:
snakelenth = 0
snakeh = 1
snakee = 1
CLS
INPUT "Yow want to play witch stage(1 - 50)"; stage     '用户选择游戏级别
IF stage = 0 THEN GOTO 1000
IF stage < 1 THEN stage = 1     '游戏级别合法化处理
IF stage > 50 THEN stage = 50
Grade = stage
OutGrade = 0
stage = .5 * (1 / stage)
CLS
LINE (1, 1)-(640, 480), , BF
LINE (10, 10)-(630, 470), 9, BF
DIM xx, yy
DIM SHARED way AS STRING
way = ""
xx = 60
yy = 10
CALL headin(10, 10)
CALL headin(20, 10)
CALL headin(30, 10)
CALL headin(40, 10)
CALL headin(50, 10)

CALL Food
Draws:
    IF xx < 10 OR xx > 620 OR yy < 10 OR yy > 460 OR way = "stop" THEN      '撞墙判断
        LOCATE 1, 30
        PRINT "  CopyRight 2005 hguitar  "
        LOCATE 2, 30
        PRINT "http://www.liushunqing.com ";
        LOCATE 10, 1
        PRINT STRING$(80, "=")
        PRINT STRING$(30, " "); " Game Over "; STRING$(39, " ")
        PRINT STRING$(35, " "); " Press [Esc] To Escape..."; STRING$(20, " ")
        PRINT STRING$(35, " "); " Press [Enter] To Restart..."; STRING$(17, " ")
        PRINT STRING$(80, " ")
        PRINT STRING$(80, " ")
        LOCATE 15, 40
        PRINT "Your grade is:"; OutGrade
        PRINT STRING$(80, "=")
        DO
            key$ = INKEY$
            IF key$ = CHR$(27) THEN END
            IF key$ = CHR$(13) THEN GOTO gamestart
        LOOP
    END IF
       
    IF way <> "" THEN
        IF POINT(xx + 5, yy + 5) = 0 THEN way = "stop"  '撞自己判断
        CALL headin(xx, yy)     '画蛇头
        IF xx = foodx AND yy = foody AND snakelenth <= 5000 THEN '吃蛋判断
            CALL headin(xx, yy)
            CALL Food                      '重新投放食物
            CALL Food
            CALL Food
            CALL Food
            CALL Food
            CALL Food
            CALL Food
            OutGrade = Grade + OutGrade
            CALL headin(xx, yy)
        ELSEIF snakelenth > 5000 THEN
            snakelenth = 5000
            CALL Food                       '重新投放食物
            CALL Food
            CALL Food
            CALL Food
            CALL Food
            CALL Food
            CALL Food
            OutGrade = Grade + OutGrade     '计分
            CALL EndOut                     '擦蛇尾
        ELSE
            CALL EndOut                     '擦蛇尾
        END IF
    END IF
       
    Draws$ = INKEY$         '获取用户输入
    IF Draws$ = CHR$(0) + CHR$(75) OR way = "r" THEN        '根据用户按键选择方向
        xx = xx - 10
        CALL delay(stage)
    ELSEIF Draws$ = CHR$(0) + CHR$(77) OR way = "l" THEN
        xx = xx + 10
        CALL delay(stage)
    ELSEIF Draws$ = CHR$(0) + CHR$(72) OR way = "u" THEN
        yy = yy - 10
        CALL delay(stage)
    ELSEIF Draws$ = CHR$(0) + CHR$(80) OR way = "d" THEN
        yy = yy + 10
        CALL delay(stage)
    ELSE
        CALL delay(stage)
    END IF

    GOTO Draws      '返回,继续画蛇
1000 END

SUB delay (seconds)

    delays = TIMER                  '利用Timer实现延时
    WHILE ABS(TIMER - delays) < seconds
    WEND
       
    Draws$ = INKEY$         '获取用户输入
    IF Draws$ = CHR$(27) THEN       '根据用户输入选择操作方式
        way = "stop"
    ELSEIF Draws$ = CHR$(0) + CHR$(75) AND way <> "l" THEN
        way = "r"
    ELSEIF Draws$ = CHR$(0) + CHR$(77) AND way <> "r" THEN
        way = "l"
    ELSEIF Draws$ = CHR$(0) + CHR$(72) AND way <> "d" THEN
        way = "u"
    ELSEIF Draws$ = CHR$(0) + CHR$(80) AND way <> "u" THEN
        way = "d"
    END IF

END SUB

SUB EndOut      '擦蛇尾(实质上是数据出队列的操作)
    snakelenth = snakelenth - 1
    IF snakelenth < 0 THEN snakelenth = 0: GOTO EndEndOut
    xx = snake(1, snakee)
    yy = snake(2, snakee)
    snakee = (snakee + 1) MOD 5001
    LINE (xx, yy)-(xx + 9, yy + 9), 9, BF
EndEndOut:
END SUB

SUB Food        '食物投放过程
    RANDOMIZE TIMER
ReFood:
    xx = (INT(RND * 62) + 1) * 10   '随机生成食物坐标
    yy = (INT(RND * 46) + 1) * 10
    IF POINT(xx + 3, yy + 3) <> 9 THEN GOTO ReFood  '如果不在空地上(例如蛇身上),则重新生成
    LINE (xx, yy)-(xx + 9, yy + 9), , BF  '画食物
    foodx = xx      '记录食物坐标
    foody = yy
END SUB

SUB headin (xx, yy)     '画蛇头,并将坐标入队列储存
    snakelenth = snakelenth + 1
    snake(1, snakeh) = xx
    snake(2, snakeh) = yy
    snakeh = (snakeh + 1) MOD 5001
    LINE (xx, yy)-(xx + 9, yy + 9), 0, BF
END SUB

'加分啊,加分,我写这么多就是为了加分

30 楼

DECLARE SUB Food ()     '食物投放
DECLARE SUB headin (xx!, yy!)   '画蛇头
DECLARE SUB EndOut ()           '擦蛇尾
DECLARE SUB delay (seconds)     '时间延迟
SCREEN 12
DIM SHARED foodx AS INTEGER     '记录食物坐标
DIM SHARED foody AS INTEGER

DIM SHARED snake(1 TO 2, 1 TO 5000) AS INTEGER  '构造队列,用于存储坐标系列
DIM SHARED snakeh AS INTEGER
DIM SHARED snakee AS INTEGER
DIM SHARED snakelenth AS INTEGER
gamestart:
snakelenth = 0
snakeh = 1
snakee = 1
CLS
INPUT "Yow want to play witch stage(1 - 50)"; stage     '用户选择游戏级别
IF stage = 0 THEN GOTO 1000
IF stage < 1 THEN stage = 1     '游戏级别合法化处理
IF stage > 50 THEN stage = 50
Grade = stage
OutGrade = 0
stage = .5 * (1 / stage)
CLS
LINE (1, 1)-(640, 480), , BF
LINE (10, 10)-(630, 470), 9, BF
DIM xx, yy
DIM SHARED way AS STRING
way = ""
xx = 60
yy = 10
CALL headin(10, 10)
CALL headin(20, 10)
CALL headin(30, 10)
CALL headin(40, 10)
CALL headin(50, 10)

CALL Food
Draws:
    IF xx < 10 OR xx > 620 OR yy < 10 OR yy > 460 OR way = "stop" THEN      '撞墙判断
        LOCATE 1, 30
        PRINT "  CopyRight 2005 hguitar  "
        LOCATE 2, 30
        PRINT "http://www.liushunqing.com ";
        LOCATE 10, 1
        PRINT STRING$(80, "=")
        PRINT STRING$(30, " "); " Game Over "; STRING$(39, " ")
        PRINT STRING$(35, " "); " Press [Esc] To Escape..."; STRING$(20, " ")
        PRINT STRING$(35, " "); " Press [Enter] To Restart..."; STRING$(17, " ")
        PRINT STRING$(80, " ")
        PRINT STRING$(80, " ")
        LOCATE 15, 40
        PRINT "Your grade is:"; OutGrade
        PRINT STRING$(80, "=")
        DO
            key$ = INKEY$
            IF key$ = CHR$(27) THEN END
            IF key$ = CHR$(13) THEN GOTO gamestart
        LOOP
    END IF
       
    IF way <> "" THEN
        IF POINT(xx + 5, yy + 5) = 0 THEN way = "stop"  '撞自己判断
        CALL headin(xx, yy)     '画蛇头
        IF xx = foodx AND yy = foody AND snakelenth <= 5000 THEN '吃蛋判断
            CALL headin(xx, yy)
            CALL Food                      '重新投放食物
            CALL Food
            CALL Food
            CALL Food
            CALL Food
            CALL Food
            CALL Food
            OutGrade = Grade + OutGrade
            CALL headin(xx, yy)
        ELSEIF snakelenth > 5000 THEN
            snakelenth = 5000
            CALL Food                       '重新投放食物
            CALL Food
            CALL Food
            CALL Food
            CALL Food
            CALL Food
            CALL Food
            OutGrade = Grade + OutGrade     '计分
            CALL EndOut                     '擦蛇尾
        ELSE
            CALL EndOut                     '擦蛇尾
        END IF
    END IF
       
    Draws$ = INKEY$         '获取用户输入
    IF Draws$ = CHR$(0) + CHR$(75) OR way = "r" THEN        '根据用户按键选择方向
        xx = xx - 10
        CALL delay(stage)
    ELSEIF Draws$ = CHR$(0) + CHR$(77) OR way = "l" THEN
        xx = xx + 10
        CALL delay(stage)
    ELSEIF Draws$ = CHR$(0) + CHR$(72) OR way = "u" THEN
        yy = yy - 10
        CALL delay(stage)
    ELSEIF Draws$ = CHR$(0) + CHR$(80) OR way = "d" THEN
        yy = yy + 10
        CALL delay(stage)
    ELSE
        CALL delay(stage)
    END IF

    GOTO Draws      '返回,继续画蛇
1000 END

SUB delay (seconds)

    delays = TIMER                  '利用Timer实现延时
    WHILE ABS(TIMER - delays) < seconds
    WEND
       
    Draws$ = INKEY$         '获取用户输入
    IF Draws$ = CHR$(27) THEN       '根据用户输入选择操作方式
        way = "stop"
    ELSEIF Draws$ = CHR$(0) + CHR$(75) AND way <> "l" THEN
        way = "r"
    ELSEIF Draws$ = CHR$(0) + CHR$(77) AND way <> "r" THEN
        way = "l"
    ELSEIF Draws$ = CHR$(0) + CHR$(72) AND way <> "d" THEN
        way = "u"
    ELSEIF Draws$ = CHR$(0) + CHR$(80) AND way <> "u" THEN
        way = "d"
    END IF

END SUB

SUB EndOut      '擦蛇尾(实质上是数据出队列的操作)
    snakelenth = snakelenth - 1
    IF snakelenth < 0 THEN snakelenth = 0: GOTO EndEndOut
    xx = snake(1, snakee)
    yy = snake(2, snakee)
    snakee = (snakee + 1) MOD 5001
    LINE (xx, yy)-(xx + 9, yy + 9), 9, BF
EndEndOut:
END SUB

SUB Food        '食物投放过程
    RANDOMIZE TIMER
ReFood:
    xx = (INT(RND * 62) + 1) * 10   '随机生成食物坐标
    yy = (INT(RND * 46) + 1) * 10
    IF POINT(xx + 3, yy + 3) <> 9 THEN GOTO ReFood  '如果不在空地上(例如蛇身上),则重新生成
    LINE (xx, yy)-(xx + 9, yy + 9), , BF  '画食物
    foodx = xx      '记录食物坐标
    foody = yy
END SUB

SUB headin (xx, yy)     '画蛇头,并将坐标入队列储存
    snakelenth = snakelenth + 1
    snake(1, snakeh) = xx
    snake(2, snakeh) = yy
    snakeh = (snakeh + 1) MOD 5001
    LINE (xx, yy)-(xx + 9, yy + 9), 0, BF
END SUB

'加分啊,加分,我写这么多就是为了加分

我来回复

您尚未登录,请登录后再回复。点此登录或注册