此博客仅用于保存此代码。 华容道,该游戏中有三种方块,一种是普通方块,显示形如“01 ”、“13 ”此类;一种是盲点,即指无法知道上面是何数字的方块,显示为“?? ”;还有一种是障碍,是无法移动的方块,显示为“XX ”。其他玩法与华容道基本相同,输入check检查,检查时允许最后右下角的三个方块出现错误。

代码:

#include<bits/stdc++.h>
#include<conio.h>
#include<stdio.h>
#include "windows.h"
using namespace std;
const int MAXN=1e2+5;
int a[MAXN][MAXN];
int ax[MAXN];
int ay[MAXN];
string s;
int n,m=0,r,x,y,ans=0,bo;
char c;
int main(){
	printf("请选择棋盘大小(3~10)\n");
	scanf("%d",&n);
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			a[i][j]=(i-1)*n+j;
			ax[a[i][j]]=i;
			ay[a[i][j]]=j;
		}
	}
	printf("即将开始游戏,请选择游戏模式:1,普通;2,障碍;3,盲划;23,障碍+盲划。 输入0查看玩法\n");
	int x0=n,y0=n;
	while(m==0){
		scanf("%d",&m);
		if(m==0) printf("此游戏为华容道,只要将棋盘恢复原样即可,检查时允许右下角的最后三个位置不对。你只需要输入棋盘中空格旁边的数(含盲点的输入坐标),就可以将此数划到空格处。进入游戏后,输入c即可检查;输入g即可手动打乱;输入r将步数清零;输入b即可退出;输入p清屏。\n");
	}
	if(m>1){
		for(int i=1;i<=n;i++){
			for(int j=1;j<=n;j++){
				if(a[i][j]<10) printf("0");
				printf("%d ",a[i][j]);
			}
			printf("\n");
		}
		if(m==2 || m==23){
			printf("请先输入障碍数量,再依次输入障碍坐标\n"); 
			scanf("%d",&r);
			for(int i=1;i<=r;i++){
				scanf("%d%d",&x,&y);
				a[x][y]+=1000;
			}
		}
		if(m==3 || m==23){
			printf("请先输入盲点数量,再依次输入盲点坐标\n"); 
			scanf("%d",&r);
			for(int i=1;i<=r;i++){
				scanf("%d%d",&x,&y);
				a[x][y]-=1000;
			}
		}
	}
	while(true) {
		printf("已走步数:%d\n",ans); 
		for(int i=1;i<=n;i++){
			for(int j=1;j<=n;j++){
				if(a[i][j]>1000) printf("XX ");
				else if(a[i][j]<-800) printf("?? ");
				else if(i==x0 && j==y0) printf("[] ");
				else {
					if(a[i][j]<10) printf("0");
					printf("%d ",a[i][j]);					
				}
				
			}
			printf("\n");
		}
	//	cin >> s;
	//	c=s[0];	
		c= _getch();
		bo=0;
		for(int i=1;i<=n;i++){
			for(int j=1;j<=n;j++){
				if(a[i][j]==r && r<=1000) bo=1;
			}
		}
		if(c=='a' || c=='s' || c=='d' || c=='w'){
			if(c=='d'){
				if(y0+1>n || a[x0][y0+1]>800) {
					printf("输入有误!\n");
					ans--;
				}
				else{
					a[x0][y0]=a[x0][y0+1];
					ax[a[x0][y0]]=x0;
					ay[a[x0][y0]]=y0;
					y0+=1;
					a[x0][y0]=n*n;
				}				
			}
			else if(c=='w'){
				if(x0-1<1 || a[x0-1][y0]>800) {
					printf("输入有误!\n");
					ans--;
				}
				else{
					a[x0][y0]=a[x0-1][y0];
					ax[a[x0][y0]]=x0-1;
					ay[a[x0][y0]]=y0;
					x0-=1;
					a[x0][y0]=n*n;
				}				
			}
			else if(c=='a'){
				if(y0-1<1 || a[x0][y0-1]>800) {
					printf("输入有误!\n");
					ans--;
				}
				else{
					a[x0][y0]=a[x0][y0-1];
					ax[a[x0][y0]]=x0;
					ay[a[x0][y0]]=y0-1;
					y0-=1;
					a[x0][y0]=n*n;
				}			
			}
			else{
				if(x0+1>n || a[x0+1][y0]>800) {
					printf("输入有误!\n");
					ans--;
				}
				else{
					a[x0][y0]=a[x0+1][y0];
					ax[a[x0][y0]]=x0+1;
					ay[a[x0][y0]]=y0;
					x0+=1;
					a[x0][y0]=n*n;
				}				
			}
			ans++;
		}
		else if(c=='c'){
			bo=1;
			for(int i=1;i<=n;i++){
				for(int j=1;j<=n;j++){
					if(i==n && j>n-3) bo=bo;
					else if(a[i][j]<-800) {
						if(a[i][j]+1000!=(i-1)*n+j) bo=0;
					}							
					else if(a[i][j]>1000) {
						if(a[i][j]-1000!=(i-1)*n+j) bo=0;
					}							
					else {
						if(a[i][j]!=(i-1)*n+j) bo=0;
					}
				}
			}
			if(bo==1){
				printf("恭喜你!答案正确!共用%d步。输入0继续,输入1结束\n",ans);
				scanf("%d",&r);
				if(r==1) return 0; 
			}
			else printf("答案错啦,再认真检查一下吧!\n");
		}
		else if(c=='g'){
			printf("请重新输入棋盘。(空格、盲点和障碍无法改动)\n");
			for(int i=1;i<=n;i++){
				for(int j=1;j<=n;j++){
					scanf("%d",&r);
					if(a[i][j]>1000 || a[i][j]<-800 || (i==x0 && j==y0)) r=a[i][j];
					a[i][j]=r;
					ax[r]=i;
					ay[y]=j;
				}
			}
		}
		else if(c=='r') ans=0;
		else if(c=='b') return 0;
		else if(c=='p') system("cls");
		else printf("输入有误!\n"); 
	}
	return 0;
}