66中国跳棋(7)162(8)169(9)175(10)181(11)

举报
用户已注销 发表于 2021/11/19 04:39:40 2021/11/19
【摘要】 智力游戏 这个游戏,属于独立钻石棋系列的一种,由标准的独立钻石棋变化而来。 关于标准的独立钻石棋:点击打开链接 这个程序也是用那个直接修改而来,而且只需要修改3个地方,下面都用标注出来了。 代码: #include<iostream>using namespace std; int sum(i...

智力游戏





这个游戏,属于独立钻石棋系列的一种,由标准的独立钻石棋变化而来。

关于标准的独立钻石棋:点击打开链接

这个程序也是用那个直接修改而来,而且只需要修改3个地方,下面都用标注出来了。

代码:


  
  1. #include<iostream>
  2. using namespace std;
  3. int sum(int list[][7]) //sum函数用来返回最后剩余多少个棋子
  4. {
  5. int sum = 0;
  6. for (int i = 0; i < 7; i++)for (int j = 0; j < 7; j++)sum += list[i][j];
  7. return sum - 49; ///这个地方和独立钻石不一样
  8. }
  9. void up(int list[][7], int i, int j) //跳过(i,j)往上跳
  10. {
  11. list[i - 1][j] ++;
  12. list[i][j] --;
  13. list[i + 1][j] --;
  14. }
  15. void down(int list[][7], int i, int j) //跳过(i,j)往下跳
  16. {
  17. list[i + 1][j] ++;
  18. list[i][j] --;
  19. list[i - 1][j] --;
  20. }
  21. void left(int list[][7], int i, int j) //跳过(i,j)往左跳
  22. {
  23. list[i][j - 1] ++;
  24. list[i][j] --;
  25. list[i][j + 1] --;
  26. }
  27. void right(int list[][7], int i, int j) //跳过(i,j)往右跳
  28. {
  29. list[i][j + 1] ++;
  30. list[i][j] --;
  31. list[i][j - 1] --;
  32. }
  33. bool move(int list[][7]) //找出任何可以跳的一步,并跳,跳完之后递归调用move(),直到不能再跳
  34. {
  35. if (sum(list) < 4)return true; //当得到一种只剩下3颗棋子的方法,程序结束
  36. for (int i = 1; i < 6; i++)for (int j = 0; j<7; j++)
  37. {
  38. if ((i == 3 || j>1 && j < 5) && list[i][j] == 2)
  39. {
  40. if (list[i - 1][j] == 1 && list[i + 1][j] == 2) //满足往上跳的条件
  41. {
  42. up(list, i, j);
  43. if (move(list))
  44. {
  45. cout << i << j << "up ";
  46. return true;
  47. }
  48. down(list, i, j); //恢复list和result
  49. list[i][j] += 2;
  50. }
  51. else if (list[i - 1][j] == 2 && list[i + 1][j] == 1)//满足往下跳的条件
  52. {
  53. down(list, i, j);
  54. if (move(list))
  55. {
  56. cout << i << j << "down ";
  57. return true;
  58. }
  59. up(list, i, j);
  60. list[i][j] += 2;
  61. }
  62. }
  63. }
  64. for (int i = 0; i < 7; i++)for (int j = 1; j < 6; j++)
  65. {
  66. if ((j == 3 || i>1 && i < 5) && list[i][j] == 2)
  67. {
  68. if (list[i][j - 1] == 1 && list[i][j + 1] == 2)//满足往左跳的条件
  69. {
  70. left(list, i, j);
  71. if (move(list))
  72. {
  73. cout << i << j << "left ";
  74. return true;
  75. }
  76. right(list, i, j);
  77. list[i][j] += 2;
  78. }
  79. else if (list[i][j - 1] == 2 && list[i][j + 1] == 1)//满足往右跳的条件
  80. {
  81. right(list, i, j);
  82. if (move(list))
  83. {
  84. cout << i << j << "right ";
  85. return true;
  86. }
  87. left(list, i, j);
  88. list[i][j] += 2;
  89. }
  90. }
  91. }
  92. return false;
  93. }
  94. int main()
  95. {
  96. int list[7][7]; //list用来表示状态,1表示空格,2表示有棋子
  97. 不像独立钻石用0表示角落,为了方便,这里也用1
  98. for (int i = 0; i < 7; i++) 这个初始化和独立钻石不一样
  99. for (int j = 0; j < 7; j++)
  100. {
  101. list[i][j] = 1;
  102. if (i == 3 || j == 3)list[i][j] = 2;
  103. }
  104. list[2][4] = list[4][2] = list[2][2] = list[4][4] = 2;
  105. list[3][3] = 1; //初始化list
  106. move(list);
  107. cout << endl << "注意,输出的顺序是反着的";
  108. system("pause>nul");
  109. return 0;
  110. }

输出结果:

43up  44left  43down  53up  34down  44right  35left  14down  03right  12up  32up  31right  24up  23down  22up

注意,输出的顺序是反着的

类似独立钻石棋详解一文,把输出这些反过来写到main函数里面,运行可以得到下图:

代码:


  
  1. #include<iostream>
  2. using namespace std;
  3. void display(int list[][7])
  4. {
  5. for (int i = 0; i < 7; i++)
  6. {
  7. for (int j = 0; j < 7; j++)
  8. {
  9. if (list[i][j] == 2)cout << "●";
  10. else cout << " ";
  11. }
  12. cout << endl;
  13. }
  14. cout << endl<<endl<<endl;
  15. system("pause>nul");
  16. }
  17. void up(int list[][7],int i,int j) //跳过(i,j)往上跳
  18. {
  19. list[i-1][j] ++;
  20. list[i][j] --;
  21. list[i+1][j] --;
  22. display(list);
  23. }
  24. void down(int list[][7], int i, int j) //跳过(i,j)往下跳
  25. {
  26. list[i+1][j] ++;
  27. list[i][j] --;
  28. list[i-1][j] --;
  29. display(list);
  30. }
  31. void left(int list[][7], int i, int j) //跳过(i,j)往左跳
  32. {
  33. list[i][j-1] ++;
  34. list[i][j] --;
  35. list[i][j+1] --;
  36. display(list);
  37. }
  38. void right(int list[][7], int i, int j) //跳过(i,j)往右跳
  39. {
  40. list[i][j+1] ++;
  41. list[i][j] --;
  42. list[i][j-1] --;
  43. display(list);
  44. }
  45. int main()
  46. {
  47. int list[7][7]; //list用来表示状态,1表示空格,2表示有棋子
  48. 不像独立钻石用0表示角落,为了方便,这里也用1
  49. for (int i = 0; i < 7; i++) 这个初始化和独立钻石不一样
  50. {
  51. for (int j = 0; j < 7; j++)
  52. {
  53. list[i][j] = 1;
  54. if (i == 3 || j == 3 )list[i][j] = 2;
  55. }
  56. }
  57. list[2][4] = list[4][2] = list[2][2] = list[4][4] = 2;
  58. list[3][3] = 1; //初始化list
  59. display(list);
  60. up(list, 2, 2);
  61. down(list, 2, 3);
  62. up(list, 2, 4);
  63. right(list, 3, 1);
  64. up(list, 3, 2);
  65. up(list, 1, 2);
  66. right(list, 0, 3);
  67. down(list, 1, 4);
  68. left(list, 3, 5);
  69. right(list, 4, 4);
  70. down(list, 3, 4);
  71. up(list, 5, 3);
  72. down(list, 4, 3);
  73. left(list, 4, 4);
  74. up(list, 4, 3);
  75. system("pause>nul");
  76. return 0;
  77. }

162(8)


169(9)

175(10)






181(11)



文章来源: blog.csdn.net,作者:csuzhucong,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/nameofcsdn/article/details/53050353

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。