24点 随机生成4个代表扑克牌牌面的数字字母,程序自动列出所有可能算出24的表达式

题目:24点游戏是经典的纸牌益智游戏。

常见游戏规则:
从扑克中每次取出4张牌。使用加减乘除,第一个能得出24者为赢。(其中,J代表11,Q代表12,K代表13,A代表1),按照要求编程解决24点游戏。

基本要求: 随机生成4个代表扑克牌牌面的数字字母,程序自动列出所有可能算出24的表达式,用擅长的语言(C/C++/Java或其他均可)实现程序解决问题。
      1.程序风格良好(使用自定义注释模板)
      2.列出表达式无重复。
题目分析

1.四个数的±/需要三个这样的运算符,全部可能有44*4=64种可能,所以采用枚举法。
2.因为要列举所有等于24的结果,要考虑运算顺序
一一列举这些结果,总共有5种:
((A□B)□C)□D
(A□(B□C))□D
A□(B□(C□D))
A□((B□C)□D)
(A□B)□(C□D)
此处函数:共有5个
例 :

int way1(int a,int b,int c,int d,char x,char y,char z)    //类型:((A□B)□C)□D
    {
    	return count(count(count(a,b,x),c,y),d,z);
    }
代码:
/*
title:随机生成4个代表扑克牌牌面的数字字母,程序自动列出所有可能算出24的表达式
     Dev-C++
author:Q

*/ 



#include<iostream>
#include<ctime>
#include<cstdlib>
using namespace std;
int count(int sum1,int sum2,char c);
double random(double start,double end);
double random(double start,double end)       //绝对随机数生成算法 
{
    return start + (end - start) * rand() / (RAND_MAX + 1.0);
}
int way1(int a,int b,int c,int d,char x,char y,char z)    //类型:((A□B)□C)□D
{
	return count(count(count(a,b,x),c,y),d,z);
}
int way2(int a,int b,int c,int d,char x,char y,char z)  //对应表达式类型:(A□(B□C))□D 
{
	return count(count(a,count(b,c,x),y),d,z);
}

int way3(int a,int b,int c,int d,char x,char y,char z)  //对应表达式类型:A□(B□(C□D))
{
	return count(a,count(b,count(c,d,x),y),z);
}
int way4(int a,int b,int c,int d,char x,char y,char z)  //对应表达式类型:A□((B□C)□D)
{
	return count(a,count(count(b,c,x),d,y),z);
}
int way5(int a,int b,int c,int d,char x,char y,char z)  //对应表达式类型:(A□B)□(C□D)
{
	return count(count(a,b,x),count(c,d,y),z);
}

int main()
{
    
	int sum=0,flag=0; 
	int randoms[4]={1,2,3,18}; 
	char mark[4]={'+','-','*','/'};
	srand((unsigned)time(NULL));
	for(int r=0;r<4;r++)                       //随机生成1-13的数字 
	{

		randoms[r]=random(1,13);
		cout<<randoms[r]<<" ";
	}
	cout<<endl;
	for(int i=0;i<4;i++)
	{
	    
		for(int j=0;j<4;j++)
		{
			for(int k=0;k<4;k++)
			{
				sum=way1(randoms[0],randoms[1],randoms[2],randoms[3],mark[i],mark[j],mark[k]);
				if(sum==24){
					flag=1;
					cout<<"("<<"("<<randoms[0]<<mark[i]<<randoms[1]<<")"<<mark[j]<<randoms[2]<<")"<<mark[k]<<randoms[3]<<"="<<24<<endl;
				}
				sum=way2(randoms[0],randoms[1],randoms[2],randoms[3],mark[i],mark[j],mark[k]);
				if(sum==24){
					flag=1;
					cout<<"("<<randoms[0]<<mark[i]<<"("<<randoms[1]<<mark[j]<<randoms[2]<<")"<<")"<<mark[k]<<randoms[3]<<"="<<24<<endl;
				}
				sum=way3(randoms[0],randoms[1],randoms[2],randoms[3],mark[i],mark[j],mark[k]);
				if(sum==24){
					flag=1;
					cout<<randoms[0]<<mark[i]<<"("<<randoms[1]<<mark[j]<<"("<<22222222/randoms[2]<<mark[k]<<randoms[3]<<")"<<")"<<"="<<24<<endl;
				}
				sum=way4(randoms[0],randoms[1],randoms[2],randoms[3],mark[i],mark[j],mark[k]);
				if(sum==24){
					flag=1;
					cout<<randoms[0]<<mark[i]<<"("<<"("<<randoms[1]<<mark[j]<<randoms[2]<<")"<<mark[k]<<randoms[3]<<")"<<"="<<24<<endl;
				}
				sum=way5(randoms[0],randoms[1],randoms[2],randoms[3],mark[i],mark[j],mark[k]);
				if(sum==24){
					flag=1;
					cout<<"("<<randoms[0]<<mark[i]<<randoms[1]<<")"<<mark[j]<<"("<<randoms[2]<<mark[k]<<randoms[3]<<")"<<"="<<24<<endl;
				}
			}
		}
	}
	if(flag==0)
	{
		cout<<" 这四个数没有能组成24的式子!"<<endl;
	}
	return 0;
}

int count(int sum1,int sum2,char c)
{
	switch(c){
		case '+':return sum1+sum2; 
		case '-':return sum1-sum2;
		case '*':return sum1*sum2;
		case '/':return sum1/sum2;
	}
	return 0;
}
运行截图

在这里插入图片描述

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,让我来回答你的问题。首先,我需要明确一下你的问题:你想让我帮你写一个 C 语言程序,用于编写 24 点游戏计分,以时间限制设置难度,让玩家选择,扑克牌随机生成 4 个数字,最后计得分,是这样吗? 如果是的话,那么这个问题涉及到多个方面,需要进行详细的讨论和解答。下面是我对这个问题的一些解答: 1. 什么是 24 点游戏? 24 点游戏是一种纸牌游戏,通常由 4 张扑克牌组成,每张扑克牌有一个点数,玩家需要通过加减乘除等运,将这 4 张扑克牌的点数组合成 24 点。 2. 如何用 C 语言实现 24 点游戏计分? 要实现 24 点游戏计分,我们需要进行如下步骤: - 随机生成 4 个扑克牌的点数。 - 让玩家进行加减乘除等运,将这 4 个扑克牌的点数组合成 24 点。 - 根据玩家的答案和规定的时间限制,计得分。 下面是一个简单的 C 语言程序,用于实现 24 点游戏计分: ```c #include <stdio.h> #include <stdlib.h> #include <time.h> int main() { int a, b, c, d; // 4 张扑克牌的点数 int ans; // 玩家的答案 int score; // 得分 time_t start, end; // 开始时间和结束时间 srand(time(NULL)); // 初始化随机数生成器 // 随机生成 4 个扑克牌的点数 a = rand() % 13 + 1; b = rand() % 13 + 1; c = rand() % 13 + 1; d = rand() % 13 + 1; printf("请用加减乘除等运,将下列 4 张扑克牌的点数组合成 24 点:\n"); printf("%d %d %d %d\n", a, b, c, d); // 记录开始时间 start = time(NULL); // 等待玩家输入答案 scanf("%d", &ans); // 记录结束时间 end = time(NULL); // 计得分 score = (ans == 24) ? (end - start) : 0; printf("你的得分为:%d\n", score); return 0; } ``` 以上程序中,我们使用了 srand() 函数来初始化随机数生成器,然后使用 rand() 函数来随机生成 4 个扑克牌的点数。接着,我们让玩家进行加减乘除等运,将这 4 个扑克牌的点数组合成 24 点,并记录玩家的答案和结束时间。最后,根据玩家的答案和规定的时间限制,计得分。 3. 如何设置时间限制和难度选择? 要设置时间限制和难度选择,我们可以使用如下代码: ```c int timeout; // 时间限制 int level; // 难度级别 printf("请选择难度级别(1-3):\n"); scanf("%d", &level); switch (level) { case 1: timeout = 30; // 初级难度,时间限制为 30 秒 break; case 2: timeout = 20; // 中级难度,时间限制为 20 秒 break; case 3: timeout = 10; // 高级难度,时间限制为 10 秒 break; default: printf("输入错误!\n"); return 1; } printf("你选择的难度级别为:%d\n", level); printf("你的时间限制为:%d 秒\n", timeout); ``` 以上代码中,我们使用了 switch 语句来根据玩家选择的难度级别来设置时间限制。初级难度的时间限制为 30 秒,中级难度的时间限制为 20 秒,高级难度的时间限制为 10 秒。如果玩家输入的难度级别不在 1 到 3 的范围内,程序会输出错误提示信息并退出。 4. 如何随机生成扑克牌的点数? 要随机生成扑克牌的点数,我们可以使用 rand() 函数,它可以生成一个介于 0 和 RAND_MAX 之间的随机整数。因为我们需要生成 1 到 13 之间的随机整数,所以可以使用如下代码来实现: ```c a = rand() % 13 + 1; ``` 以上代码中,我们首先使用 rand() 函数生成一个介于 0 和 RAND_MAX 之间的随机整数,然后使用 % 运符将其限制在 0 到 12 的范围内,最后加上 1,就可以生成一个介于 1 和 13 之间的随机整数了。 5. 总结 综上所述,要用 C 语言编写 24 点游戏计分程序,我们需要实现如下功能: - 随机生成 4 个扑克牌的点数。 - 让玩家进行加减乘除等运,将这 4 个扑克牌的点数组合成 24 点。 - 根据玩家的答案和规定的时间限制,计得分。 - 设置时间限制和难度选择。 - 随机生成扑克牌的点数。 希望我的回答对你有所帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值