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

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

智力游戏





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

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

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

代码:


      #include<iostream>
      using namespace std;
      int sum(int list[][7]) //sum函数用来返回最后剩余多少个棋子
      {
     	int sum = 0;
     	for (int i = 0; i < 7; i++)for (int j = 0; j < 7; j++)sum += list[i][j];
     	return sum - 49;		///这个地方和独立钻石不一样
      }
      void up(int list[][7], int i, int j) //跳过(i,j)往上跳
      {
      	list[i - 1][j] ++;
      	list[i][j] --;
      	list[i + 1][j] --;
      }
      void down(int list[][7], int i, int j) //跳过(i,j)往下跳
      {
      	list[i + 1][j] ++;
      	list[i][j] --;
      	list[i - 1][j] --;
      }
      void left(int list[][7], int i, int j) //跳过(i,j)往左跳
      {
      	list[i][j - 1] ++;
      	list[i][j] --;
      	list[i][j + 1] --;
      }
      void right(int list[][7], int i, int j) //跳过(i,j)往右跳
      {
      	list[i][j + 1] ++;
      	list[i][j] --;
      	list[i][j - 1] --;
      }
      bool move(int list[][7]) //找出任何可以跳的一步,并跳,跳完之后递归调用move(),直到不能再跳
      {
     	if (sum(list) < 4)return true;		//当得到一种只剩下3颗棋子的方法,程序结束
     	for (int i = 1; i < 6; i++)for (int j = 0; j<7; j++)
      	{
     		if ((i == 3 || j>1 && j < 5) && list[i][j] == 2)
      		{
     			if (list[i - 1][j] == 1 && list[i + 1][j] == 2)	//满足往上跳的条件
      			{
     				up(list, i, j);
     				if (move(list))
      				{
      					cout << i << j << "up ";
     					return true;
      				}
     				down(list, i, j);	//恢复list和result
      				list[i][j] += 2;
      			}
     			else if (list[i - 1][j] == 2 && list[i + 1][j] == 1)//满足往下跳的条件
      			{
     				down(list, i, j);
     				if (move(list))
      				{
      					cout << i << j << "down ";
     					return true;
      				}
     				up(list, i, j);
      				list[i][j] += 2;
      			}
      		}
      	}
     	for (int i = 0; i < 7; i++)for (int j = 1; j < 6; j++)
      	{
     		if ((j == 3 || i>1 && i < 5) && list[i][j] == 2)
      		{
     			if (list[i][j - 1] == 1 && list[i][j + 1] == 2)//满足往左跳的条件
      			{
     				left(list, i, j);
     				if (move(list))
      				{
      					cout << i << j << "left ";
     					return true;
      				}
     				right(list, i, j);
      				list[i][j] += 2;
      			}
     			else if (list[i][j - 1] == 2 && list[i][j + 1] == 1)//满足往右跳的条件
      			{
     				right(list, i, j);
     				if (move(list))
      				{
      					cout << i << j << "right ";
     					return true;
      				}
     				left(list, i, j);
      				list[i][j] += 2;
      			}
      		}
      	}
     	return false;
      }
      int main()
      {
     	int list[7][7];				//list用来表示状态,1表示空格,2表示有棋子
      	不像独立钻石用0表示角落,为了方便,这里也用1
     	for (int i = 0; i < 7; i++)			这个初始化和独立钻石不一样
     	for (int j = 0; j < 7; j++)
      	{
      		list[i][j] = 1;
     		if (i == 3 || j == 3)list[i][j] = 2;
      	}
      	list[2][4] = list[4][2] = list[2][2] = list[4][4] = 2;
      	list[3][3] = 1;		//初始化list
     	move(list);
      	cout << endl << "注意,输出的顺序是反着的";
     	system("pause>nul");
     	return 0;
      }
  
 

输出结果:

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

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

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

代码:


      #include<iostream>
      using namespace std;
      void display(int list[][7])
      {
     	for (int i = 0; i < 7; i++)
      	{
     		for (int j = 0; j < 7; j++)
      		{
     			if (list[i][j] == 2)cout << "●";
     			else cout << " ";
      		}
      		cout << endl;
      	}
      	cout << endl<<endl<<endl;
     	system("pause>nul");
      }
      void up(int list[][7],int i,int j) //跳过(i,j)往上跳
      {
      	list[i-1][j] ++;
      	list[i][j] --;
      	list[i+1][j] --;
     	display(list);
      }
      void down(int list[][7], int i, int j) //跳过(i,j)往下跳
      {
      	list[i+1][j] ++;
      	list[i][j] --;
      	list[i-1][j] --;
     	display(list);
      }
      void left(int list[][7], int i, int j) //跳过(i,j)往左跳
      {
      	list[i][j-1] ++;
      	list[i][j] --;
      	list[i][j+1] --;
     	display(list);
      }
      void right(int list[][7], int i, int j) //跳过(i,j)往右跳
      {
      	list[i][j+1] ++;
      	list[i][j] --;
      	list[i][j-1] --;
     	display(list);
      }
      int main()
      {
     	int list[7][7];				//list用来表示状态,1表示空格,2表示有棋子
      								不像独立钻石用0表示角落,为了方便,这里也用1
     	for (int i = 0; i < 7; i++)			这个初始化和独立钻石不一样
      	{
     		for (int j = 0; j < 7; j++)
      		{
      			list[i][j] = 1;
     			if (i == 3 || j == 3 )list[i][j] = 2;
      		}
      	}
      	list[2][4] = list[4][2] = list[2][2] = list[4][4] = 2;
      	list[3][3] = 1;		//初始化list
     	display(list);
     	up(list, 2, 2);
     	down(list, 2, 3);
     	up(list, 2, 4);
     	right(list, 3, 1);
     	up(list, 3, 2);
     	up(list, 1, 2);
     	right(list, 0, 3);
     	down(list, 1, 4);
     	left(list, 3, 5);
     	right(list, 4, 4);
     	down(list, 3, 4);
     	up(list, 5, 3);
     	down(list, 4, 3);
     	left(list, 4, 4);
     	up(list, 4, 3);
     	system("pause>nul");
     	return 0;
      }
  
 

162(8)


169(9)

175(10)






181(11)


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

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

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

作者其他文章

评论(0

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

    全部回复

    上滑加载中

    设置昵称

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

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

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