自制操作系统(七、在自制操作系统玩游戏)

废话不多说,直接上代码

[org 0x7c00]

; 定义游戏板数组
board1 db ' ', ' ', ' '
board2 db ' ', ' ', ' '
board3 db ' ', ' ', ' '
player_turn db 'X' ; 玩家 'X' 的回合

start:
    mov bp, 0x8000
    mov sp, bp

    ; 清屏
    mov ax, 0x0600
    mov bx, 0x0700
    mov cx, 0
    mov dx, 0x184f
    int 0x10

    ; 打印欢迎信息
    mov ah, 0x0E
    mov al, 'T'
    int 0x10
    mov al, 'i'
    int 0x10
    mov al, 'c'
    int 0x10
    mov al, '-'
    int 0x10
    mov al, 'T'
    int 0x10
    mov al, 'a'
    int 0x10
    mov al, 'c'
    int 0x10
    mov al, 't'
    int 0x10
    mov al, 'a'
    int 0x10
    mov al, 'c'
    int 0x10
    mov al, 'e'
    int 0x10
    mov al, ' '
    int 0x10
    mov al, 'G'
    int 0x10
    mov al, 'a'
    int 0x10
    mov al, 'm'
    int 0x10
    mov al, 'e'
    int 0x10
    mov al, '!'
    int 0x10

.wait_input:
    mov ah, 0x00
    int 0x16
    cmp al, '1'
    je .play_move_1
    cmp al, '2'
    je .play_move_2
    cmp al, '3'
    je .play_move_3
    cmp al, '4'
    je .play_move_4
    cmp al, '5'
    je .play_move_5
    cmp al, '6'
    je .play_move_6
    cmp al, '7'
    je .play_move_7
    cmp al, '8'
    je .play_move_8
    cmp al, '9'
    je .play_move_9
    jmp .wait_input

.play_move_1:
    mov byte [board1], player_turn
    jmp .update_screen
.play_move_2:
    mov byte [board1 + 1], player_turn
    jmp .update_screen
.play_move_3:
    mov byte [board1 + 2], player_turn
    jmp .update_screen
.play_move_4:
    mov byte [board2], player_turn
    jmp .update_screen
.play_move_5:
    mov byte [board2 + 1], player_turn
    jmp .update_screen
.play_move_6:
    mov byte [board2 + 2], player_turn
    jmp .update_screen
.play_move_7:
    mov byte [board3], player_turn
    jmp .update_screen
.play_move_8:
    mov byte [board3 + 1], player_turn
    jmp .update_screen
.play_move_9:
    mov byte [board3 + 2], player_turn
    jmp .update_screen

.update_screen:
    ; 更新屏幕显示
    mov bp, 0x8000
    mov sp, bp
	mov ax, 0x0600
	mov bx, 0x0700
	mov cx, 0
	mov dx, 0x184f
	int 0x10
	mov ah, 02h
	xor bh, bh
	mov dh, 0
	mov dl, 0
	int 10h
.update_screen1:
    mov ah, 0x0E
    mov si, board1
    mov cx, 3
.print_loop1:
    lodsb
    mov al, '|'
    int 0x10
    mov al, [si]
    int 0x10
    mov al, '|'
    int 0x10
    inc si
    loop .print_loop1
.update_screen2:
    mov ah, 0x0E
    mov al, 0x0D
    int 0x10
    mov al, 0x0A
    int 0x10
    mov al, '-'
    int 0x10
    mov al, '-'
    int 0x10
    mov al, '|'
    int 0x10
    mov al, '|'
    int 0x10
    mov al, '-'
    int 0x10
    mov al, '|'
    int 0x10
    mov al, '|'
    int 0x10
    mov al, '-'
    int 0x10
    mov al, '-'
    int 0x10
    mov al, 0x0D
    int 0x10
    mov al, 0x0A
    int 0x10
    mov si, board2
    mov cx, 3
.print_loop2:
    lodsb
    mov al, '|'
    int 0x10
    mov al, [si]
    int 0x10
    mov al, '|'
    int 0x10
    inc si
    loop .print_loop2
.update_screen3:
    mov ah, 0x0E
    mov al, 0x0D
    int 0x10
    mov al, 0x0A
    int 0x10
    mov al, '-'
    int 0x10
    mov al, '-'
    int 0x10
    mov al, '|'
    int 0x10
    mov al, '|'
    int 0x10
    mov al, '-'
    int 0x10
    mov al, '|'
    int 0x10
    mov al, '|'
    int 0x10
    mov al, '-'
    int 0x10
    mov al, '-'
    int 0x10
    mov al, 0x0D
    int 0x10
    mov al, 0x0A
    int 0x10
    mov si, board3
    mov cx, 3
.print_loop3:
    lodsb
    mov al, '|'
    int 0x10
    mov al, [si]
    int 0x10
    mov al, '|'
    int 0x10
    inc si
    loop .print_loop3
    ; 检查游戏是否结束
    ; ...

    ; 切换玩家
    mov al, player_turn
    cmp al, 'X'
    je .switch_to_O
    cmp al, 'O'
    je .switch_to_X
.switch_to_X:
    mov byte [player_turn], 'X'
    jmp .wait_input
.switch_to_O:
    mov byte [player_turn], 'O'
    jmp .wait_input

; 游戏结束逻辑
; ...

times 510-($-$$) db 0
dw 0xAA55

这里没有添加游戏结束逻辑

能看到这里的读者已经非常厉害了

读者可以自行添加代码逻辑

运行试试

图片暂时无法上传,可能是csdn出了问题,深感歉意

 好的,非常成功。等一下......咦?

图片暂时无法上传,可能是csdn出了问题,深感歉意

什么鬼!

代码的逻辑完全没有问题,但是虚拟机运行出了问题

按键根本匹配不上 ,一直是o,我的代码里没有这个字符,只有O和X

看来可能是虚拟机或者bios的问题,真机运行应该可以

这就当是大家的课后作业了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值