鱼C论坛

 找回密码
 立即注册
查看: 1342|回复: 11

[已解决]关于大小比较操作的问题

[复制链接]
发表于 2020-6-9 22:24:21 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
是这样,我在写一个简单的游戏,假如A,B,C与D,E,F是对手,他们每个人持有一个数字,A:5,B:4,C:7,D:1,E:9,F:4,
要实现的操作有:1、先判定谁的数字最大,谁就先发起进攻(这里是E先发起进攻,对手人员比自己数字少的A,B,C生命减少9)
2、判定第数字第二大的发起进攻的,比它数字小的都减少生命(这里第2人为C,D,F生命减少7)
3、以此类推...如果有重复的,再进行一次内部随机取值,判定谁大谁小进行进攻,对手谁数字比它小谁就扣血....
我苦思冥想不得其解,还求大佬指点,麻烦了!
最佳答案
2020-6-10 00:42:49
本帖最后由 Twilight6 于 2020-6-10 00:48 编辑

看注释吧,第一个代码是你举例子的卡片值,第二个代码是随机卡片值:

  1. from random import choice

  2. team1 = [('A', 5), ('B', 4), ('C', 7)]  # 队伍 1
  3. team2 = [('D', 1), ('E', 9), ('F', 4)]  # 队伍 2
  4. number = {}.fromkeys([i[0] for i in team1 + team2], 50)  # 初始化各个人的生命值为 50

  5. sort_number = sorted(team1 + team2, key=lambda x: x[1])[::-1]  # 大小排序

  6. over = []  # 记录已经攻击过的人员

  7. for i in range(len(sort_number) - 1):
  8.     if sort_number[i] in over:  # 判断是否已经参与过比较
  9.         continue
  10.     temp = [sort_number[i]]

  11.     while True:  # 循环判断卡片数值大小是否相等
  12.         if sort_number[i][1] != sort_number[i + 1][1]:  # 不相等就退出循环
  13.             break
  14.         temp.append(sort_number[i + 1])  # 大小相等加入列表,待 choice 随机选择进行攻击
  15.         i += 1
  16.     while temp != []:
  17.         win = 0  # 用于判断是否进行过攻击,若为0则没有进行过攻击

  18.         random_men = choice(temp)  # 从数字排相等的人中随机挑选一个出来攻击

  19.         over.append(random_men)   # 加入已经攻击的列表

  20.         temp.remove(random_men)  # 移除本次选中的人,因为怕会有大于 2 个人的情况
  21.         print(f'------{random_men[0]}的回合------'.center(38))
  22.         if random_men in team1:  # 判断是队伍 1 的人攻击 还是 队伍 2的人攻击
  23.             for i in team2:
  24.                 if i[1] < random_men[1]: # 判断卡片是否比攻击人小
  25.                     win = 1   # 用于记录该人进行过攻击
  26.                     number[i[0]] -= random_men[1] # 减少生命值
  27.                     print(
  28.                         f'{i[0]}所持有的卡片数字为{i[1]}小于{random_men[0]}的卡片数{random_men[1]},{i[0]}的生命值-{random_men[1]},剩余{number[i[0]]}')

  29.         elif random_men in team2:  # 和上面同理,其实这里可以用 else
  30.             for i in team1:
  31.                 if i[1] < random_men[1]:
  32.                     win = 1
  33.                     number[i[0]] -= random_men[1]
  34.                     print(f'{i[0]}所持有的卡片数字为{i[1]}小于{random_men[0]}的卡片数{random_men[1]},{i[0]}的生命值-{random_men[1]},剩余{number[i[0]]}')
  35.         if win == 0:
  36.             print(f'对手的卡片没有人比{random_men[0]}小,因此跳过{random_men[0]}的攻击回合')

  37. print('剩余的生命值情况:A:{},B:{},C:{},D:{},E:{},F:{}'.format(*number.values()))
复制代码





  1. from random import choice,randint

  2. team1 = [('A',randint(1,10)),('B',randint(1,10)),('C',randint(1,10))] # 队伍 1
  3. team2 = [('D',randint(1,10)),('E',randint(1,10)),('F',randint(1,10))] # 队伍 2
  4. number = {}.fromkeys([i[0] for i in team1+team2],50)  # 初始化各个人的生命值为 50


  5. sort_number = sorted(team1+team2,key=lambda x:x[1])[::-1] # 大小排序

  6. over = [] # 记录已经攻击过的人员

  7. for i in range(len(sort_number)-1):
  8.     if sort_number[i] in over:  # 判断是否已经参与过比较
  9.         continue
  10.     temp = [sort_number[i]]

  11.     while True: # 循环判断卡片数值大小是否相等
  12.         if sort_number[i][1] != sort_number[i+1][1]: # 不相等就退出循环
  13.             break
  14.         temp.append(sort_number[i+1]) # 大小相等加入列表,待 choice 随机选择进行攻击
  15.         i += 1
  16.     while temp != []:
  17.         win = 0
  18.         random_men = choice(temp)
  19.         over.append(random_men)
  20.         temp.remove(random_men)
  21.         print(f'------{random_men[0]}的回合------'.center(38))
  22.         if random_men in team1:
  23.             for i in team2:
  24.                 if i[1] < random_men[1]:
  25.                     win = 1
  26.                     number[i[0]] -= random_men[1]
  27.                     print(f'{i[0]}所持有的卡片数字为{i[1]}小于{random_men[0]}的卡片数{random_men[1]},{i[0]}的生命值-{random_men[1]},剩余{number[i[0]]}')

  28.         elif random_men in team2:
  29.             for i in team1:
  30.                 if i[1] < random_men[1]:
  31.                     win = 1
  32.                     number[i[0]] -= random_men[1]
  33.                     print(f'{i[0]}所持有的卡片数字为{i[1]}小于{random_men[0]}的卡片数{random_men[1]},{i[0]}的生命值-{random_men[1]},剩余{number[i[0]]}')
  34.         if win == 0:
  35.             print(f'对手的卡片没有人比{random_men[0]}小,因此跳过{random_men[0]}的攻击回合')

  36. print('剩余的生命值情况:A:{},B:{},C:{},D:{},E:{},F:{}'.format(*number.values()))
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-6-9 23:16:58 | 显示全部楼层
先排序,然后用三个数组,一个数字记录已经排好序的数字,另一个记录abcdef,最后一个记录分数;
楼主的意思是想要思路还是需要代码呢
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-6-9 23:19:17 | 显示全部楼层
小甲鱼的铁粉 发表于 2020-6-9 23:16
先排序,然后用三个数组,一个数字记录已经排好序的数字,另一个记录abcdef,最后一个记录分数;
楼主的意 ...

可否有空简易的写个代码,谢谢了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-6-9 23:21:15 | 显示全部楼层
lbxx916 发表于 2020-6-9 23:19
可否有空简易的写个代码,谢谢了

稍等
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-6-9 23:23:02 | 显示全部楼层
查找python类排序,CSDN上拷贝来的:
  1. class OB():
  2.     def __init__(self,num):
  3.         self.num = num
  4.     def __lt__(self,other):
  5.         return self.num<other.num

  6. l = [OB(9),OB(4),OB(7),OB(1),OB(7)]
  7. l.sort()
  8. print([e.num for e in l])

  9. #输出结果: [1, 4, 7, 7, 9]
  10. #————————————————
  11. #版权声明:本文为CSDN博主「geek_hch」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
  12. #原文链接:https://blog.csdn.net/geek_hch/java/article/details/88614698
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-6-9 23:59:11 | 显示全部楼层
#include<stdio.h>
#include<stdlib.h>
int main(void)
{
        int a[11]={0},b[11]={0},temp,flag,n;//a记录字母对应的数字,b记录分数
        char ch[11],x;
        for(int i=0;i<10;i++)
        {
                printf("请输入%d个代号以及他们的数字\n",10-i);
                scanf("%c%d",&ch[i],&a[i]);
                x=getchar();//吃掉空格
                n=i;//记录个数
                 }
        //泡沫排序法对数字和对应的字母排序
                for(int i=0;i<=10;i++)
            {
                    for(int j=0;j<=10-i;j++)
                    {
                            if(a[j]<=a[j+1])
                            {   //数字排序
                                    temp=a[j];
                                    a[j]=a[j+1];
                                    a[j+1]=temp;
                    //字母根据数字大小排序
                                    flag=ch[j];
                                    ch[j]=ch[j+1];
                                    ch[j+1]=flag;
                            }
                    }
            }
        //开始小的扣生命值
                for(int i=0;i<n;i++)
                {
                        for(int j=i+1;j<n;j++)
                        {
                                b[j]=b[j]-a[i];
                        }
                }
                printf("他们的血量为\n");
                for(int i=0;i<n;i++)
                        printf("%c血量为%d\n",ch[i],b[i]);
        system("pause");
        return 0;
}

唉这个有一个漏洞,比如我输入q1 w2 e3 r4 t5 y6 u7 i8 o9 p0运行出来p就消失了,其他的分数都对,太晚了不想调试了,早点睡,晚安
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-6-10 00:42:49 | 显示全部楼层    本楼为最佳答案   
本帖最后由 Twilight6 于 2020-6-10 00:48 编辑

看注释吧,第一个代码是你举例子的卡片值,第二个代码是随机卡片值:

  1. from random import choice

  2. team1 = [('A', 5), ('B', 4), ('C', 7)]  # 队伍 1
  3. team2 = [('D', 1), ('E', 9), ('F', 4)]  # 队伍 2
  4. number = {}.fromkeys([i[0] for i in team1 + team2], 50)  # 初始化各个人的生命值为 50

  5. sort_number = sorted(team1 + team2, key=lambda x: x[1])[::-1]  # 大小排序

  6. over = []  # 记录已经攻击过的人员

  7. for i in range(len(sort_number) - 1):
  8.     if sort_number[i] in over:  # 判断是否已经参与过比较
  9.         continue
  10.     temp = [sort_number[i]]

  11.     while True:  # 循环判断卡片数值大小是否相等
  12.         if sort_number[i][1] != sort_number[i + 1][1]:  # 不相等就退出循环
  13.             break
  14.         temp.append(sort_number[i + 1])  # 大小相等加入列表,待 choice 随机选择进行攻击
  15.         i += 1
  16.     while temp != []:
  17.         win = 0  # 用于判断是否进行过攻击,若为0则没有进行过攻击

  18.         random_men = choice(temp)  # 从数字排相等的人中随机挑选一个出来攻击

  19.         over.append(random_men)   # 加入已经攻击的列表

  20.         temp.remove(random_men)  # 移除本次选中的人,因为怕会有大于 2 个人的情况
  21.         print(f'------{random_men[0]}的回合------'.center(38))
  22.         if random_men in team1:  # 判断是队伍 1 的人攻击 还是 队伍 2的人攻击
  23.             for i in team2:
  24.                 if i[1] < random_men[1]: # 判断卡片是否比攻击人小
  25.                     win = 1   # 用于记录该人进行过攻击
  26.                     number[i[0]] -= random_men[1] # 减少生命值
  27.                     print(
  28.                         f'{i[0]}所持有的卡片数字为{i[1]}小于{random_men[0]}的卡片数{random_men[1]},{i[0]}的生命值-{random_men[1]},剩余{number[i[0]]}')

  29.         elif random_men in team2:  # 和上面同理,其实这里可以用 else
  30.             for i in team1:
  31.                 if i[1] < random_men[1]:
  32.                     win = 1
  33.                     number[i[0]] -= random_men[1]
  34.                     print(f'{i[0]}所持有的卡片数字为{i[1]}小于{random_men[0]}的卡片数{random_men[1]},{i[0]}的生命值-{random_men[1]},剩余{number[i[0]]}')
  35.         if win == 0:
  36.             print(f'对手的卡片没有人比{random_men[0]}小,因此跳过{random_men[0]}的攻击回合')

  37. print('剩余的生命值情况:A:{},B:{},C:{},D:{},E:{},F:{}'.format(*number.values()))
复制代码





  1. from random import choice,randint

  2. team1 = [('A',randint(1,10)),('B',randint(1,10)),('C',randint(1,10))] # 队伍 1
  3. team2 = [('D',randint(1,10)),('E',randint(1,10)),('F',randint(1,10))] # 队伍 2
  4. number = {}.fromkeys([i[0] for i in team1+team2],50)  # 初始化各个人的生命值为 50


  5. sort_number = sorted(team1+team2,key=lambda x:x[1])[::-1] # 大小排序

  6. over = [] # 记录已经攻击过的人员

  7. for i in range(len(sort_number)-1):
  8.     if sort_number[i] in over:  # 判断是否已经参与过比较
  9.         continue
  10.     temp = [sort_number[i]]

  11.     while True: # 循环判断卡片数值大小是否相等
  12.         if sort_number[i][1] != sort_number[i+1][1]: # 不相等就退出循环
  13.             break
  14.         temp.append(sort_number[i+1]) # 大小相等加入列表,待 choice 随机选择进行攻击
  15.         i += 1
  16.     while temp != []:
  17.         win = 0
  18.         random_men = choice(temp)
  19.         over.append(random_men)
  20.         temp.remove(random_men)
  21.         print(f'------{random_men[0]}的回合------'.center(38))
  22.         if random_men in team1:
  23.             for i in team2:
  24.                 if i[1] < random_men[1]:
  25.                     win = 1
  26.                     number[i[0]] -= random_men[1]
  27.                     print(f'{i[0]}所持有的卡片数字为{i[1]}小于{random_men[0]}的卡片数{random_men[1]},{i[0]}的生命值-{random_men[1]},剩余{number[i[0]]}')

  28.         elif random_men in team2:
  29.             for i in team1:
  30.                 if i[1] < random_men[1]:
  31.                     win = 1
  32.                     number[i[0]] -= random_men[1]
  33.                     print(f'{i[0]}所持有的卡片数字为{i[1]}小于{random_men[0]}的卡片数{random_men[1]},{i[0]}的生命值-{random_men[1]},剩余{number[i[0]]}')
  34.         if win == 0:
  35.             print(f'对手的卡片没有人比{random_men[0]}小,因此跳过{random_men[0]}的攻击回合')

  36. print('剩余的生命值情况:A:{},B:{},C:{},D:{},E:{},F:{}'.format(*number.values()))
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2020-6-10 16:30:00 | 显示全部楼层
小甲鱼的铁粉 发表于 2020-6-9 23:59
唉这个有一个漏洞,比如我输入q1 w2 e3 r4 t5 y6 u7 i8 o9 p0运行出来p就消失了,其他的分数都对,太晚了 ...

感谢了,这么晚回复
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-6-10 16:30:31 | 显示全部楼层
Twilight6 发表于 2020-6-10 00:42
看注释吧,第一个代码是你举例子的卡片值,第二个代码是随机卡片值:

非常感谢,我现在明白了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-6-10 16:31:20 | 显示全部楼层
lbxx916 发表于 2020-6-10 16:30
非常感谢,我现在明白了

没事  我写的代码一点不简洁,辛苦了~
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-6-10 19:35:23 | 显示全部楼层
Twilight6 发表于 2020-6-10 16:31
没事  我写的代码一点不简洁,辛苦了~

我的最佳没了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-6-10 19:44:29 | 显示全部楼层

哈哈  不是主要是楼主是要Python 的

评分

参与人数 1荣誉 +1 鱼币 +1 收起 理由
小甲鱼的铁粉 + 1 + 1 鱼C有你更精彩^_^

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-6-21 14:02

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表