- C20250082's blog
华容道
- 2022-9-19 22:31:28 @
此博客仅用于保存此代码。 华容道,该游戏中有三种方块,一种是普通方块,显示形如“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;
}