2021-05-10

24点扑克纸牌小游戏C语言实现

  1. 题目要求
    用程序实现24点游戏
    游戏规则:
    从扑克中每次取出4张牌。使用加减乘除,第一个能得出24者为赢。(其中,J代表11,Q代表12,K代表13,A代表1),按照要求编程解决24点游戏。
    基本要求
    随机生成4个代表扑克牌牌面的数字字母,程序自动列出所有可能算出24的表达式,用擅长的语言(C/C++/Java或其他均可)实现程序解决问题。
    此次作业我采用C语言解决问题

  2. 问题分析
    可以通过num()函数生成四个1-13的随机数
    通过分析,表达式可分为三类:不含括号的表达式;含有一个括号的表达式;含有两个括号的表达式。
    这三类表达式可具体概括为以下五种:
    (1)((x,y),z),w
    (2)(x,y),(z,w)
    (3)(x,(y,z),w)
    (4)x,((y,z),w)
    (5)x,((y,(z,w))
    通过3个for循环的嵌套根据五种表达式类型穷举出四个随机数可能组成的所有表达式,并利用if条件判断输出所有能够得到24点的表达式。

  3. 算法设计思路
    通过num()函数生成1-13的随机数;
    通过cal()函数对两个操作数进行计算;
    通过express_1()函数计算表达式((x,y),z),w;
    通过express_2()函数计算表达式(x,(y,z),w);
    通过express_3()函数计算表达式x,((y,z),w);
    通过express_4()函数计算表达式x,((y,(z,w));
    通过express_5()函数计算表达式(x,y),(z,w);
    通过3个for循环穷举出四个随机数所能组成的所有表达

  4. 代码如下

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
 
int a[4];    // 数组a[]用于存放随机产生的四个操作数
char ope[4] = {'+','-','*','/'};    // 数组ope[]用于存放四类运算符
 
// 通过num()函数生成四个1-13的随机数
void num()
{
	int i;
	srand(time(NULL));
 
	for(i=0; i<4; i++)
	{
		a[i] = rand()%13+1;
	}
	for(i=0; i<4; i++)
	{
		printf("第%d张牌:%d\n", i+1, a[i]);
	}
}
 
// 通过cal()函数对两个操作数进行计算
int cal(int x, int y, char ope)
{
	int z;
	if(ope=='+')
		z = x+y;
	else if(ope=='-')
		z = x-y;
	else if(ope=='*')
		z = x*y;
	else if(ope=='/')
		z = x/y;
 
	return z;
}
 
// 通过express_1()函数计算表达式((A_B)_C)_D
int express_1(int i, int j, int k, int t, char ope1, char ope2, char ope3)
{
	int x1, x2, x3;
	x1 = cal(i, j, ope1);
	x2 = cal(x1, k, ope2);
	x3 = cal(x2, t, ope3);
 
	return x3;
}
 
// 通过express_2()函数计算表达式(A_(B_C))_D
int express_2(int i, int j, int k, int t, char ope1, char ope2, char ope3)
{
	int x1, x2, x3;
	x1 = cal(j, k, ope2);
	x2 = cal(i, x1, ope1);
	x3 = cal(x2, t, ope3);
 
	return x3;
}
 
// 通过express_3()函数计算表达式A_((B_C)_D)
int express_3(int i, int j, int k, int t, char ope1, char ope2, char ope3)
{
	int x1, x2, x3;
	x1 = cal(j, k, ope2);
	x2 = cal(x1, t, ope3);
	x3 = cal(i, x2, ope1);
 
	return x3;
}
 
// 通过express_4()函数计算表达式A_(B_(C_D))
int express_4(int i, int j, int k, int t, char ope1, char ope2, char ope3)
{
	int x1, x2, x3;
	x1 = cal(k, t, ope3);
	x2 = cal(j, x1, ope2);
	x3 = cal(i, x2, ope1);
 
	return x3;
}
 
// 通过express_5()函数计算表达式(A_B)_(C_D)
int express_5(int i, int j, int k, int t, char ope1, char ope2, char ope3)
{
	int x1, x2, x3;
	x1 = cal(i, j, ope1);
	x2 = cal(k, t, ope3);
	x3 = cal(x1, x2, ope2);
 
	return x3;
}
 
void main()
{
	printf("#**************************************#\n");
	printf("#                                      #\n");
	printf("#              欢迎来到                #\n");
	printf("#                                      #\n");
	printf("#             24点小游戏               #\n");
	printf("#                                      #\n");
	printf("#**************************************#\n");
 
	printf("请按任意键开始游戏:\n");
	getchar();
 
	num();
 
	int i, j, k, t;
	i = a[0];
	j = a[1];
	k = a[2];
	t = a[3];
 
	int x, y, z;
	char p, q, r;
 
	printf("\n");
	printf("所有能够出现24点的表达式有:\n");
 
	/* 通过三个for循环的嵌套,穷举出四个随机数所能组成的所有表达式;
	   通过与最里层for循环嵌套的五个if判断输出所有能够得到24点的表达式。*/
	for(x=0; x<4; x++)
	{
		p = ope[x];
		for(y=0; y<4; y++)
		{
			q = ope[y];
			for(z=0; z<4; z++)
			{
				r = ope[z];
				if(express_1(i, j, k, t, p, q, r)==24)
					printf("((%d %c %d) %c %d) %c %d = 24\n", i, p, j, q, k, r, t);
				if(express_2(i, j, k, t, p, q, r)==24)
					printf("(%d %c (%d %c %d)) %c %d = 24\n", i, p, j, q, k, r, t);
				if(express_3(i, j, k, t, p, q, r)==24)
					printf("%d %c ((%d %c %d) %c %d) = 24\n", i, p, j, q, k, r, t);
				if(express_4(i, j, k, t, p, q, r)==24)
					printf("%d %c (%d %c (%d %c %d)) = 24\n", i, p, j, q, k, r, t);
				if(express_5(i, j, k, t, p, q, r)==24)
					printf("(%d %c %d) %c (%d %c %d) = 24\n", i, p, j, q, k, r, t);
			}
		}
	}
}
  1. 测试结果
    在这里插入图片描述

在这里插入图片描述

  1. 总结
    此次作业主要了解并运用了一些C语言函数的知识,大部分函数都是查阅书本找出来的,在程序设计实现的过程中遇到了许多问题,就比如说通常我们要得到四个随机数都会利用rand()函数随机生成,可是用这种方法产生的随机数每次都是一样的,为了解决这一问题,我上网搜索到在使用rand()函数前都必须要利用srand()函数设置随机数种子,采用在随机数生成前加入srand(time(NULL));的方式解决了问题。除此之外,由于自身算法能力不强,找不到一个合理实现24点小游戏的算法,最后还是通过查阅大量资料找到了解决方法。
    希望下次可以多多尝试其他语言进行编程。此次作业发现自己还有很多需要学习的地方,希望之后多多实践,多多查阅资料,在实践中发现问题并解决问题。
这个数据可以使用Python进行解析和处理。可以按照以下步骤进行: 1. 将数据分割成每个数据项。 ``` data_items = data.split(',') ``` 2. 对于每个数据项,将其按#分割成四个小项,并存储到一个列表中。 ``` data_list = [] for item in data_items: item_list = item.split('#') data_list.append(item_list) ``` 3. 对于每个小项,进行相应的类型转换。 ``` for item in data_list: item[0] = int(item[0]) # 题号转换为整数 item[1] = datetime.datetime.strptime(item[1], '%Y-%m-%d %H:%M:%S') # 时间转换为datetime类型 if item[2] != '': # 操作类型转换为整数 item[2] = int(item[2]) item[3] = str(item[3]) # 科目转换为字符串类型 ``` 4. 可以按照需要对数据进行进一步处理,如按照题号、时间等进行排序、筛选等操作。 完整的Python代码如下: ``` import datetime data = '''1#2021-05-18 14:31:55##初级会计实务,2#2021-05-18 14:31:57#12#初级会计实务,2#2021-05-18 14:32:08##初级会计实务,3#2021-05-18 14:32:09#12#初级会计实务,4#2021-05-18 14:32:34#12#初级会计实务,4#2021-05-18 14:32:45##初级会计实务,5#2021-05-18 14:32:46#12#初级会计实务,5#2021-05-18 14:32:57##初级会计实务,6#2021-05-18 14:33:00#12#初级会计实务,7#2021-05-18 14:33:44#12#初级会计实务,7#2021-05-18 14:34:42##初级会计实务,8#2021-05-18 14:34:43#12''' # 将数据分割成每个数据项 data_items = data.split(',') # 对于每个数据项,将其按#分割成四个小项,并存储到一个列表中 data_list = [] for item in data_items: item_list = item.split('#') data_list.append(item_list) # 对于每个小项,进行相应的类型转换 for item in data_list: item[0] = int(item[0]) # 题号转换为整数 item[1] = datetime.datetime.strptime(item[1], '%Y-%m-%d %H:%M:%S') # 时间转换为datetime类型 if item[2] != '': # 操作类型转换为整数 item[2] = int(item[2]) item[3] = str(item[3]) # 科目转换为字符串类型 print(data_list) ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值