DS||该谁发球了

题目描述
乒乓球是一项很受国人欢迎的运动,假设A和B对打,每次都是A先发球,那么乒乓球的发球规则如下:
1、一方得11分,另一方得分小于等于9分,比赛结束,前者获胜;
2、如果出现10:10的比分,那么比赛进入延长赛,双方轮流发一次球,当分差是2分时比赛结束,得分多者获胜;
3、其它情况,双方轮流发2次球;
请编写程序,根据当前比分判断该谁发球了?

输入
输入包括多行数据,每行数据包括两个正整数a和b,代表A和B在乒乓球比赛中的比分,0<=a,b<=100

输出
针对每行输入,输出接下来的发球方是A还是B?如果比赛结束,输出Game Over

样例输入 Copy
0 0
0 2
11 9
样例输出 Copy
A
B
Game Over
提示
输入参考:
int a,b;
while(cin >> a >> b)
{
//…
}

#include <stdio.h>
#include <iostream>
using namespace std;
int main(int argc, char *argv[])
{
    int a, b;
    while(scanf("%d%d",&a,&b)!=EOF)
    {
        if((a==11||b==11)&&(11-a>=2||11-b>=2))
         printf("Game Over\n");
        else 
		{if(a>=10&&b>=10)
		{
			if(a-b==2||b-a==2)
			printf("Game Over\n");
			else 
			{
				if(a==b)
				printf("A\n");
				else
				printf("B\n");
			}
			
		}
        
        else 
        {
        	if((a+b)%4<=1)
        	printf("A\n");
        	else
			printf("B\n");
        }}
        
    }
    return 0;
}
; 乒乓球游戏汇编代码 ; 使用MASM语法,针对DOS环境 .MODEL SMALL .STACK 100H .DATA ; 端口地址定义 pa EQU 280H pb EQU 281H pc EQU 282H pn1 EQU 283H p0 EQU 288H p1 EQU 289H p2 EQU 28AH pn2 EQU 28BH ; 数码管编码表 s DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,77H,7CH,39H,5EH,7BH,71H ; 全局变量 led DB 0 f DW 1 s1 DW 50 m DW 0 n DW 0 data1 DB 0 count DW 0 msg DB 'Please serve!',0DH,0AH,'$' .CODE STARTUP: MOV AX, @DATA MOV DS, AX ; 初始化8255 MOV DX, pn1 MOV AL, 81H ; 控制字:A/B口输出,C口输入 OUT DX, AL ; 初始化8253 MOV DX, pn2 MOV AL, 27H ; 控制字:计数器0,方式3 OUT DX, AL MOV DX, p0 MOV AL, 20H ; 计数初值 OUT DX, AL CALL ATTACK ; 进入主游戏 MOV AH, 4CH ; 退出程序 INT 21H ; LED移动函数 LEDDIC PROC NEAR CMP f, 1 JE LEFT SHR led, 1 ; 右移 JMP EXIT_LED LEFT: SHL led, 1 ; 左移 EXIT_LED: RET LEDDIC ENDP ; 速度检测 SPEED PROC NEAR MOV DX, pc IN AL, DX TEST AL, 04H ; 检查PC2 JZ LOW_SPEED MOV s1, 10 ; 高速 RET LOW_SPEED: MOV s1, 20 ; 低速 RET SPEED ENDP ; 显示甲得分 SCOREM PROC NEAR MOV DX, pc MOV AL, 20H ; 开启高位 OUT DX, AL MOV BX, m AND BX, 0FH ; 取低4位 MOV AL, s[BX] MOV DX, pa OUT DX, AL RET SCOREM ENDP ; 显示乙得分 SCOREN PROC NEAR MOV DX, pc MOV AL, 10H ; 开启低位 OUT DX, AL MOV BX, n AND BX, 0FH MOV AL, s[BX] MOV DX, pa OUT DX, AL RET SCOREN ENDP ; 发球检测 START PROC NEAR START_LOOP: CALL SPEED MOV DX, pc IN AL, DX TEST AL, 01H ; 检测PC0 JZ CHECK_PC1 MOV led, 80H ; 甲发球 MOV f, 0 JMP START_EXIT CHECK_PC1: TEST AL, 02H ; 检测PC1 JZ START_LOOP MOV led, 01H ; 乙发球 MOV f, 1 START_EXIT: RET START ENDP ; 得分判断 OUT_CHECK PROC NEAR CMP led, 0 JNE OUT_EXIT CMP f, 1 JNE PLAYER_A INC n ; 乙得分 JMP SCORE_CHECK PLAYER_A: INC m ; 甲得分 SCORE_CHECK: ; 胜负判断(简化处理) MOV AX, m CMP AX, 11 JL OUT_EXIT SUB AX, n CMP AX, 2 JL OUT_EXIT MOV m, 0 ; 重置比分 MOV n, 0 OUT_EXIT: RET OUT_CHECK ENDP ; 中断服务程序 ISR PROC FAR PUSH AX PUSH DX MOV DX, pc IN AL, DX CMP f, 1 JNE CHECK_B TEST AL, 01H ; 甲击球 JZ ISR_EXIT MOV f, 0 JMP ISR_EXIT CHECK_B: TEST AL, 02H ; 乙击球 JZ ISR_EXIT MOV f, 1 ISR_EXIT: POP DX POP AX IRET ISR ENDP ; 主游戏循环 ATTACK PROC NEAR ; 注册中断(示例使用DOS功能) MOV AX, 2510H ; 设置中断向量10H MOV DX, OFFSET ISR INT 21H ; 初始化8253 MOV DX, pn2 MOV AL, 51H OUT DX, AL GAME_LOOP: ; 显示发球提示 MOV AH, 09H MOV DX, OFFSET msg INT 21H CALL START ; 等待发球 BALL_LOOP: MOV DX, pb MOV AL, led OUT DX, AL ; 更新LED MOV CX, s1 SPEED_LOOP: ; 数码管动态显示 TEST CX, 01H JZ SHOW_N CALL SCOREM JMP DISPLAY_DONE SHOW_N: CALL SCOREN DISPLAY_DONE: ; 延时10ms(简化处理) PUSH CX MOV CX, 1000 DELAY_LOOP: LOOP DELAY_LOOP POP CX LOOP SPEED_LOOP CALL LEDDIC ; 移动LED CALL OUT_CHECK ; 得分检测 CMP led, 0 JNE BALL_LOOP ; 球未出界继续 JMP GAME_LOOP ; 开始下一轮 RET ATTACK ENDP END此代码最后实现的功能
04-03
; 乒乓球游戏汇编代码 ; 使用MASM语法,针对DOS环境 .MODEL SMALL .STACK 100H .DATA ; 端口地址定义 pa EQU 280H pb EQU 281H pc EQU 282H pn1 EQU 283H p0 EQU 288H p1 EQU 289H p2 EQU 28AH pn2 EQU 28BH ; 数码管编码表 s DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,77H,7CH,39H,5EH,7BH,71H ; 全局变量 led DB 0 f DW 1 ; 移动方向标志 s1 DW 50 ; 初始速度 m DW 0 ; 甲得分 n DW 0 ; 乙得分 msg DB ‘Please serve!’,0DH,0AH,‘$’ .CODE STARTUP: MOV AX, @DATA MOV DS, AX ; 初始化8255 MOV DX, pn1 MOV AL, 81H ; A/B口输出,C口输入 OUT DX, AL ; 初始化8253定时器 MOV DX, pn2 MOV AL, 36H ; 计数器0,方式3 OUT DX, AL MOV DX, p0 MOV AX, 1193 ; 1MHz时钟,产生50Hz中断 OUT DX, AL MOV AL, AH OUT DX, AL MAIN_LOOP: ; 显示发球提示 MOV AH, 09H MOV DX, OFFSET msg INT 21H CALL START ; 等待发球 GAME_LOOP: MOV DX, pb MOV AL, led OUT DX, AL ; 更新LED状态 ; 数码管动态显示 CALL SCOREM CALL DELAY CALL SCOREN CALL DELAY ; 检测击球 MOV DX, pc IN AL, DX CMP f, 1 JNE CHECK_RIGHT ; 向左移动时检测乙击球(PC1) TEST AL, 02H JZ MOVE_BALL MOV f, 0 ; 改变方向 JMP MOVE_BALL CHECK_RIGHT: ; 向右移动时检测甲击球(PC0) TEST AL, 01H JZ MOVE_BALL MOV f, 1 MOVE_BALL: CALL LEDDIC ; 移动球位置 CALL OUT_CHECK ; 得分检测 CMP led, 0 ; 检查球是否出界 JNE GAME_LOOP JMP MAIN_LOOP ; 开始新回合 MOV AH, 4CH ; 退出程序 INT 21H ; LED移动函数 LEDDIC PROC NEAR CMP f, 1 JE LEFT SHR led, 1 ; 右移 JMP EXIT_LED LEFT: SHL led, 1 ; 左移 EXIT_LED: RET LEDDIC ENDP ; 数码管显示延时 DELAY PROC NEAR PUSH CX MOV CX, 500 DLOOP: LOOP DLOOP POP CX RET DELAY ENDP ; 显示甲得分 SCOREM PROC NEAR MOV DX, pc MOV AL, 20H ; 开启高位数码管 OUT DX, AL MOV BX, m MOV AL, s[BX] MOV DX, pa OUT DX, AL RET SCOREM ENDP ; 显示乙得分 SCOREN PROC NEAR MOV DX, pc MOV AL, 10H ; 开启低位数码管 OUT DX, AL MOV BX, n MOV AL, s[BX] MOV DX, pa OUT DX, AL RET SCOREN ENDP ; 发球检测(带去抖动) START PROC NEAR START_LOOP: MOV DX, pc IN AL, DX TEST AL, 01H ; 检测甲发球 JZ CHECK_PC1 CALL DEBOUNCE TEST AL, 01H JZ CHECK_PC1 MOV led, 80H ; 甲发球位置 MOV f, 0 ; 初始向右移动 JMP START_EXIT CHECK_PC1: TEST AL, 02H ; 检测乙发球 JZ START_LOOP CALL DEBOUNCE TEST AL, 02H JZ START_LOOP MOV led, 01H ; 乙发球位置 MOV f, 1 ; 初始向左移动 START_EXIT: RET START ENDP ; 按键去抖动 DEBOUNCE PROC NEAR PUSH CX MOV CX, 1000 DB_LOOP: LOOP DB_LOOP POP CX RET DEBOUNCE ENDP ; 得分判断 OUT_CHECK PROC NEAR CMP led, 0 JNE OC_EXIT CMP f, 1 JNE PLAYER_A INC n ; 乙得分 JMP SCORE_CHECK PLAYER_A: INC m ; 甲得分 SCORE_CHECK: ; 胜负判断(11分制,领先2分) MOV AX, m CMP AX, 11 JL CHECK_N MOV BX, n SUB AX, BX CMP AX, 2 JGE RESET JMP OC_EXIT CHECK_N: MOV AX, n CMP AX, 11 JL OC_EXIT MOV BX, m SUB AX, BX CMP AX, 2 JL OC_EXIT RESET: MOV m, 0 MOV n, 0 OC_EXIT: RET OUT_CHECK ENDP END优化此代码 使此代码利用8253clock0为1MHz,out0与clock1的串联 实现输出2hz方波 并实现led的移动速度为0.5s ,任意一方领先两分或得到11分时结束游戏 给出修改后全部的代码
最新发布
04-03
; 乒乓球游戏汇编代码 ; 使用MASM语法,针对DOS环境 .MODEL SMALL .STACK 100H .DATA ; 端口地址定义 pa EQU 280H pb EQU 281H pc EQU 282H pn1 EQU 283H p0 EQU 288H p1 EQU 289H p2 EQU 28AH pn2 EQU 28BH ; 数码管编码表 s DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,77H,7CH,39H,5EH,7BH,71H ; 全局变量 led DB 0 f DW 1 ; 移动方向标志 s1 DW 50 ; 初始速度 m DW 0 ; 甲得分 n DW 0 ; 乙得分 msg DB ‘Please serve!’,0DH,0AH,‘$’ .CODE STARTUP: MOV AX, @DATA MOV DS, AX ; 初始化8255 MOV DX, pn1 MOV AL, 81H ; A/B口输出,C口输入 OUT DX, AL ; 初始化8253定时器 MOV DX, pn2 MOV AL, 36H ; 计数器0,方式3 OUT DX, AL MOV DX, p0 MOV AX, 1193 ; 1MHz时钟,产生50Hz中断 OUT DX, AL MOV AL, AH OUT DX, AL MAIN_LOOP: ; 显示发球提示 MOV AH, 09H MOV DX, OFFSET msg INT 21H CALL START ; 等待发球 GAME_LOOP: MOV DX, pb MOV AL, led OUT DX, AL ; 更新LED状态 ; 数码管动态显示 CALL SCOREM CALL DELAY CALL SCOREN CALL DELAY ; 检测击球 MOV DX, pc IN AL, DX CMP f, 1 JNE CHECK_RIGHT ; 向左移动时检测乙击球(PC1) TEST AL, 02H JZ MOVE_BALL MOV f, 0 ; 改变方向 JMP MOVE_BALL CHECK_RIGHT: ; 向右移动时检测甲击球(PC0) TEST AL, 01H JZ MOVE_BALL MOV f, 1 MOVE_BALL: CALL LEDDIC ; 移动球位置 CALL OUT_CHECK ; 得分检测 CMP led, 0 ; 检查球是否出界 JNE GAME_LOOP JMP MAIN_LOOP ; 开始新回合 MOV AH, 4CH ; 退出程序 INT 21H ; LED移动函数 LEDDIC PROC NEAR CMP f, 1 JE LEFT SHR led, 1 ; 右移 JMP EXIT_LED LEFT: SHL led, 1 ; 左移 EXIT_LED: RET LEDDIC ENDP ; 数码管显示延时 DELAY PROC NEAR PUSH CX MOV CX, 500 DLOOP: LOOP DLOOP POP CX RET DELAY ENDP ; 显示甲得分 SCOREM PROC NEAR MOV DX, pc MOV AL, 20H ; 开启高位数码管 OUT DX, AL MOV BX, m MOV AL, s[BX] MOV DX, pa OUT DX, AL RET SCOREM ENDP ; 显示乙得分 SCOREN PROC NEAR MOV DX, pc MOV AL, 10H ; 开启低位数码管 OUT DX, AL MOV BX, n MOV AL, s[BX] MOV DX, pa OUT DX, AL RET SCOREN ENDP ; 发球检测(带去抖动) START PROC NEAR START_LOOP: MOV DX, pc IN AL, DX TEST AL, 01H ; 检测甲发球 JZ CHECK_PC1 CALL DEBOUNCE TEST AL, 01H JZ CHECK_PC1 MOV led, 80H ; 甲发球位置 MOV f, 0 ; 初始向右移动 JMP START_EXIT CHECK_PC1: TEST AL, 02H ; 检测乙发球 JZ START_LOOP CALL DEBOUNCE TEST AL, 02H JZ START_LOOP MOV led, 01H ; 乙发球位置 MOV f, 1 ; 初始向左移动 START_EXIT: RET START ENDP ; 按键去抖动 DEBOUNCE PROC NEAR PUSH CX MOV CX, 1000 DB_LOOP: LOOP DB_LOOP POP CX RET DEBOUNCE ENDP ; 得分判断 OUT_CHECK PROC NEAR CMP led, 0 JNE OC_EXIT CMP f, 1 JNE PLAYER_A INC n ; 乙得分 JMP SCORE_CHECK PLAYER_A: INC m ; 甲得分 SCORE_CHECK: ; 胜负判断(11分制,领先2分) MOV AX, m CMP AX, 11 JL CHECK_N MOV BX, n SUB AX, BX CMP AX, 2 JGE RESET JMP OC_EXIT CHECK_N: MOV AX, n CMP AX, 11 JL OC_EXIT MOV BX, m SUB AX, BX CMP AX, 2 JL OC_EXIT RESET: MOV m, 0 MOV n, 0 OC_EXIT: RET OUT_CHECK ENDP END优化此代码 使此代码利用8253clock0为1MHz,out0与clock1的串联 实现输出2hz方波 并实现led的移动速度为0.5s ,任意一方领先两分或得到11分时结束游戏 给出修改后完整的代码
04-03
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值