好吧,所以我有一个问题,我怀疑这是一个实际的c ++功能,但是值得一试...我正在创建一个基于终端文本的mancala游戏,并且正在使用一个数组来跟踪板的每个杯子中的点,我想知道是否有任何方式可以让用户触发“ boardArray [13]”杯子,并且数组的流动按时间顺序进行,我想的价值 “ boardArray [13]”循环回到木板的开始,然后开始分配回到“ boardArray [1]”。我怀疑这是否有意义,请告诉我是否需要我澄清。我基本上想要一个数组
1,2,3,4,5,6,7,8,9,10,11,12,13,14, RESET
1,2,3,4,5,6,7,8,9,10,11,12,13,14, RESET
1,2,3...
答案 0 :(得分:3)
内置数组类型不会执行此操作。如果需要的话,创建带有重载运算符的类型来完成这项工作很容易。
template <std::size_t N>
class LoopedArray {
int data[N];
public:
int &operator[](size_t index) {
return data[index % N];
}
};
int main() {
LoopedArray<13> la;
// put known values into the array:
for (int i=0; i<13; i++)
la[i] = i;
// demonstrate reading the data with "looping" of the index:
for (int i=0; i<100; i++)
std::cout << la[i] << "\t";
}
我是否真的建议这样做,还有很多疑问,但是可以肯定的,我想我可以相信这可能是有用的...
答案 1 :(得分:2)
为此,您不需要“循环数组”,就我所知,这样的东西在C ++中是不存在的。
通过循环索引,您可以非常轻松地达到相同的效果。
不是使用yourArray[i]
,而是使用yourArray[i%14]
仅访问它的前14个元素。
答案 2 :(得分:0)
我知道的C ++中没有这样的数组(或与此相关的所有编程)。
您可以尝试的是一个链表:
class node {
public:
node* next;
int value;
}
然后,将多个链接在一起:
node root;
node* current=&root
for(i=0;i<14;i++) {
current->value=0; // for initialization
current->next = new node;
current = current->next;
}
current->next = root;
这些项目将循环链接。您可以像这样访问它们
int value = current->value;
for(int i=0;i<value;i++) {
current = current->next;
current.value +=1;
}
这当然很混乱,尤其是当您尝试删除它时。
void DeleteList(node *n,node *root) {
if(n == root) {
return;
}
DeleteList(n->next,root);
delete n;
}
那只是一个例子,但是很快就会遇到很多问题。
我想我真的应该推荐与AlbertM recommended类似的东西,但是为您包装了一个不错的函数:
void addPoints(int arr[], int cup, int arrlen) {
int value = arr[cup]; // stored for later
arr[cup] = 0; // since we are emptying the cup
for(int i=0; i<value;i++) {
arr[(cup+i)%arrlen] += 1;
}
}