01 WS-DIR PIC 9 VALUE 4. *> 方向 1上2下3左4右 01 WS-FOOD-X PIC 9(2) VALUE 10. *> 食物 x 01 WS-FOOD-Y PIC 9(2) VALUE 6. *> 食物 y 01 WS-RUNNING PIC 9 VALUE 1. *> 运行标志 01 WS-SCORE PIC 9(4) VALUE 0. *> 得分 01 WS-STEPS PIC 9(4) VALUE 0. *> 步数 01 WS-MAX-STEPS PIC 9(4) VALUE 500. *> 步数上限
3.4 显示字符
1 2 3 4
01 WS-BODY-CHAR PIC X VALUE "o". 01 WS-FOOD-CHAR PIC X VALUE "*". 01 WS-WALL-CHAR PIC X VALUE "#". 01 WS-CLEAR-SEQ PIC X(7) VALUE X"1B5B324A1B5B48".
4. 核心算法
4.1 初始化(INIT-GAME)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
INIT-GAME. MOVE 3 TO WS-SNAKE-LEN MOVE 4 TO WS-DIR MOVE 0 TO WS-SCORE MOVE 0 TO WS-STEPS MOVE 1 TO WS-RUNNING MOVE SPACES TO WS-END-REASON MOVE 5 TO WS-SX(1) MOVE 6 TO WS-SY(1) MOVE 4 TO WS-SX(2) MOVE 6 TO WS-SY(2) MOVE 3 TO WS-SX(3) MOVE 6 TO WS-SY(3) *> 用当前时间 (HHMMSShh) 初始化随机数序列 MOVE FUNCTION CURRENT-DATE TO WS-TIMESTAMP COMPUTE WS-SEED = FUNCTION NUMVAL(WS-TIMESTAMP(9:8)) COMPUTE WS-TMP = FUNCTION RANDOM(WS-SEED) * 1000000000 PERFORM PLACE-FOOD PERFORM CLEAR-SCREEN.
要点:
蛇初始为 3 节,水平排列在 (3,6)(4,6)(5,6)
用 FUNCTION CURRENT-DATE 取当前时间,截取第 9-16 位(HHMMSSss)作为随机种子
CHOOSE-DIR. MOVE 99 TO WS-BEST-DIST MOVE 0 TO WS-BEST-DIR PERFORM VARYING WS-TRY-DIR FROM 1 BY 1 UNTIL WS-TRY-DIR > 4 PERFORM TEST-DIRECTION IF WS-SAFE = 1 COMPUTE WS-DIST = FUNCTION ABS(WS-TRY-X - WS-FOOD-X) + FUNCTION ABS(WS-TRY-Y - WS-FOOD-Y) IF WS-DIST < WS-BEST-DIST OR (WS-DIST = WS-BEST-DIST AND WS-TRY-DIR = WS-DIR) MOVE WS-DIST TO WS-BEST-DIST MOVE WS-TRY-DIR TO WS-BEST-DIR END-IF END-IF END-PERFORM IF WS-BEST-DIR NOT = 0 MOVE WS-BEST-DIR TO WS-DIR END-IF.
SHOW-GAME. PERFORM CLEAR-SCREEN MOVE WS-SCORE TO WS-SCORE-OUT MOVE WS-SNAKE-LEN TO WS-LEN-OUT DISPLAY "==========================================" DISPLAY " COBOL 贪吃蛇 得分: " WS-SCORE-OUT " 长度: " WS-LEN-OUT DISPLAY "==========================================" PERFORM VARYING WS-I FROM 1 BY 1 UNTIL WS-I > 12 MOVE SPACES TO WS-LINE MOVE WS-WALL-CHAR TO WS-LINE(1:1) PERFORM VARYING WS-J FROM 1 BY 1 UNTIL WS-J > 20 EVALUATE WS-CELL(WS-I, WS-J) WHEN 0 MOVE " " TO WS-DISP-CHAR WHEN 1 MOVE WS-BODY-CHAR TO WS-DISP-CHAR WHEN 2 MOVE WS-FOOD-CHAR TO WS-DISP-CHAR WHEN OTHER MOVE "?" TO WS-DISP-CHAR END-EVALUATE MOVE WS-DISP-CHAR TO WS-LINE(WS-J + 1:1) END-PERFORM MOVE WS-WALL-CHAR TO WS-LINE(22:1) DISPLAY WS-LINE END-PERFORM DISPLAY "==========================================".