【趣味编程】常胜将军

常胜将军

一、问题描述

游戏规则:AB两人玩取火柴的游戏,共有21根火柴。每人每次最多取4根,最少取一根。取到最后一根火柴的玩家算输。保证某一玩家每次都赢


二、算法分析

如果每次都想让其中一个玩家赢(此处假设为B),那么只要控制最后剩余一根火柴给另一个玩家,就能保证B获胜;根据取火柴的总数可以知道只要保证每次都会取5根火柴,最后一定会剩余一根火柴,只要控制让最后一根火柴被A取走即可!所以如果A先取n根火柴,B只要每次只要取5-n根火柴,最后一根火柴肯定会被A取走;如果B先取火柴,则只要在前几次在5-n的取数中,多取5个就可以了!(常胜将军算法是取火柴游戏算法的一个特例)



三、代码实现


若使计算机每次获胜,那么该用户先取火柴(n),计算机每次取5-n;

import java.util.Scanner;

public class Gilded {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int last = 21;//剩余火柴数
		
		System.out.println("常胜将军小游戏");
		
		while (true) {   //死循环保证游戏能持续进行,直到决出胜负
			System.out.printf("目前火柴剩余%d根\n",last);
			System.out.print("用户取火柴的数量为:");
			//用户取火柴
			int user = sc.nextInt();  
			if ((user < 1)||(user > 4)||(user > last) ) {
				 System.out.println("您的输入有误,请重试");
				 continue;
			}
			last = last - user;
			if (last == 0) {
				System.out.println("用户取了最后一根火柴,计算机获胜");
				break;
			}else {
				//计算机取火柴的数量
				int com = 5 - user;
				System.out.printf("计算机取火柴的数量为:%d\n",com);
				//剩余火柴数量
				last = last - com;
				if (last == 0) {
					System.out.println("计算机取了最后一根火柴,用户获胜");
					break;
					}
				}
			}
		}
}

四、演示截图






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值