如何避免在此程序上打印两个相反的东西?

时间:2019-01-31 20:44:24

标签: python

我正在尝试制作一个Rubik's Cube Scrambler,它会打印一系列随机动作来打乱我的立方体。但是,有时我的程序会打印出两个相互抵消的动作。如何避免这种情况?

这是我到目前为止所拥有的:

#include<stdio.h> 
int main() 
{ 
     int st[] ={1,2,3,4,5,6,7,8,0}; 
     int i; 
     for(i=0; st[i]; i++) 
         printf("\n%d %d %d %d", str[i], *(str+i), *(i+str), i[str]); 
     return 0;
}  

对不起,如果我的代码不好。我才刚开始。

4 个答案:

答案 0 :(得分:0)

将最后一个动作分配给循环外的变量,并与最后一个动作进行比较。如果它们抵消了,则生成一个新的,然后再次进行比较。

类似这样的东西(假设我正确理解了您的“动作”):

import random

scramble_length = random.randint(9,24)

move_list = ["U","U'","D","D'","B","B'","F","F'","L","L'","R","R'"]
varHold =""

for x in range(scramble_length):
    varNew = random.choice(move_list)
    B_DontContinue = True
    while (B_DontContinue):
        B_DontContinue = False
        if varHold == "U" and varNew == "U'":
            B_DontContinue=True
        elif varHold == "D" and varNew == "D'":
            B_DontContinue = True
        elif varHold == "R" and varNew =="R'":
            B_DontContinue = True
        elif varHold == "L" and varNew == "L'":
            B_DontContinue = True
        elif varHold == "B" and varNew == "B'":
            B_DontContinue = True
        elif varHold == "F'" and varNew == "F'":
                B_DontContinue = True

    print(random.choice(move_list))

答案 1 :(得分:0)

我可以想到几种不同的方法来解决这个问题。

  1. 您可以从列表中删除所有'条移动。您的多维数据集就像在同一方向上被随机的转弯序列所扰乱一样。仍然有很小的可能性,即连续四次相同的动作彼此抵消,但这比连续两次相反的动作的可能性小得多。

  2. 生成动作列表之后,连续扫描要取消的两个动作,然后替换其中一个(或随机排列列表)。继续这样做,直到没有任何取消动作对。

答案 2 :(得分:0)

您可以使用差值从可能的动作中删除最后一个动作的反面,然后再传递给random.choice

import random
scramble_length = random.randint(9, 24)
moves = {"U", "U'", "D", "D'", "B", "B'", "F", "F'", "L", "L'", "R", "R'"}
move = ''
for x in range(scramble_length):
    move = random.choice(tuple(moves - {move[0] if len(move) == 2 else move + "'"}))
    print(move)

示例输出:

B'
U'
D
F
B'
B'
R'
F'
R'
B'
F
D'
B'
R
B'
F
U'
D
D
U
L
U'
B

答案 3 :(得分:0)

而不是将其作为评论。

多维数据集映射结构:

  

1-多维数据集的每一侧有九个图块,其中行(R)为三,列的(C)为三。

2-从左到右,每列编号为1,2或3。行的同上。

3-示例“ UC1”代表以下指令:“移动列1”>“向上”。


因此,如果您引入坐标,则会得到例如字符串:

[“ UC1”,“ DR2”,“ UC2'”,“ DC3”,“ U1C”,RR1]。

此处RR1 =“将第1行移至>向右”。

因此,将您的更改添加到最终的映射结构中,而彼此之间完全相同的完全相同的取消动作会大大降低。而且,如果您的移动次数可以除以4,则您可能最终会使一个图块再次位于同一位置,但是其他两个图块(列或行)都不相同,而与图块的颜色无关。

请注意,就像让安提到的那样,您需要记住最后一步(last_move = [方向,行/列,行/列号])。

要为; p编码的许多变量