公告
-
网上做这个的dalao已经很多了,蒟蒻的这个目前尚有缺陷——在落子的时候会刷新两三次,看着有点卡顿,但可以接受;
-
游戏一般算法不难,主要是实现,这里不再对原理进行解释;
游戏截图
Code
#include<bits/stdc++.h>
#include<windows.h>
#define int long long
#define red FOREGROUND_RED
#define green FOREGROUND_GREEN
#define blue FOREGROUND_BLUE
#define gray FOREGROUND_INTENSITY
#define light SetConsoleTextAttribute
#define win GetStdHandle(STD_OUTPUT_HANDLE)
using namespace std;
string mapchar[10]={"┏ ","┳ ","┓ ","┣ ","╋ ","┫ ","┗ ","┻ ","┛ "};
int mapp[20][20]={{0,1,1,1,1,1,1,1,1,1,1,1,1,1,2},{3,4,4,4,4,4,4,4,4,4,4,4,4,4,5},{3,4,4,4,4,4,4,4,4,4,4,4,4,4,5},{3,4,4,4,4,4,4,4,4,4,4,4,4,4,5},{3,4,4,4,4,4,4,4,4,4,4,4,4,4,5},{3,4,4,4,4,4,4,4,4,4,4,4,4,4,5},{3,4,4,4,4,4,4,4,4,4,4,4,4,4,5},{3,4,4,4,4,4,4,4,4,4,4,4,4,4,5},{3,4,4,4,4,4,4,4,4,4,4,4,4,4,5},{3,4,4,4,4,4,4,4,4,4,4,4,4,4,5},{3,4,4,4,4,4,4,4,4,4,4,4,4,4,5},{3,4,4,4,4,4,4,4,4,4,4,4,4,4,5},{3,4,4,4,4,4,4,4,4,4,4,4,4,4,5},{3,4,4,4,4,4,4,4,4,4,4,4,4,4,5},{6,7,7,7,7,7,7,7,7,7,7,7,7,7,8}};
int news[20][20],dx=7,dy=7;//落子标记X用户当前选定的位置
void outing(string s){//逐字输出,优化游戏体验
for(int i=0;i<s.size();i++){
cout<<s[i];Sleep(20);
}
return;
}
void print(int player){//输出棋盘
system("cls");
light(win,gray|red|green);
for(int i=0;i<15;i++){
for(int j=0;j<15;j++){
if(i==dx&&j==dy){light(win,gray|red);}
if(!news[i][j])cout<<mapchar[mapp[i][j]];
else if(news[i][j]==1)cout<<"○";
else cout<<"●";
light(win,gray|red|green);
}
printf("\n");
}
if(!player){outing("[执黑]\n");}
else{outing("[执白]\n");}
return;
}
int winl(int player){//判断有没有五子连珠[暴力,非常笨,但是时间复杂度不是很离谱]
int num=0;
for(int i=0;i<=15;i++){
for(int j=0;j<15;j++){
if(news[i][j]){num++;}
if(news[i][j]==player){
int x=i,y=j;bool check=true;
for(int k=0;k<=4;k++){if(player!=news[x+k][y]){check=false;break;}}
if(check){return 1;}else{check=true;}
for(int k=0;k<=4;k++){if(player!=news[x-k][y]){check=false;break;}}
if(check){return 1;}else{check=true;}
for(int k=0;k<=4;k++){if(player!=news[x][y+k]){check=false;break;}}
if(check){return 1;}else{check=true;}
for(int k=0;k<=4;k++){if(player!=news[x][y-k]){check=false;break;}}
if(check){return 1;}else{check=true;}
for(int k=0;k<=4;k++){if(player!=news[x+k][y+k]){check=false;break;}}
if(check){return 1;}else{check=true;}
for(int k=0;k<=4;k++){if(player!=news[x-k][y-k]){check=false;break;}}
if(check){return 1;}else{check=true;}
for(int k=0;k<=4;k++){if(player!=news[x-k][y+k]){check=false;break;}}
if(check){return 1;}else{check=true;}
for(int k=0;k<=4;k++){if(player!=news[x+k][y-k]){check=false;break;}}
if(check){return 1;}else{check=true;}
}
}
}
if(num==225){return 2;}
return 0;
}
void game(){//游戏主函数
memset(news,0,sizeof(news));
int player=0,wins;
char c;
while(1){
print(player);
while(cin>>c){
if(c=='w'&&dx>0){dx--;}
if(c=='s'&&dx<14){dx++;}
if(c=='a'&&dy>0){dy--;}
if(c=='d'&&dy<14){dy++;}
print(player);
if(c=='k'&&!news[dx][dy]){news[dx][dy]=player+1;break;}
}
print(player);
wins=winl(player+1);
if(wins==2){outing("[平局]\n");return;}
else if(wins==0){player^=1;continue;}
else{if(player==0){outing("[黑胜]\n");return;}else{outing("[白胜]\n");return;}}
}
return;
}
void game_front(){//开始界面
light(win,gray|red|green);
outing("╔═════════════════五子棋═════════════════╗\n");
outing("║Make by ");light(win,gray|green|blue);outing("Kochakin ");
light(win,gray|red|green);
outing("║\n║ ═游戏规则═ ║\n");
outing("║ ║\n");
outing("║ 本游戏一共有两名玩家,一人执黑,一人执 ║\n");
outing("║ 白,执黑先落子在15X15的棋盘中,以谁先 ║\n");
outing("║ 在横,竖和两条对角线上有连续的5颗字为 ║\n");
outing("║ 胜利;(黑是空心子,白是实心子) ║\n");
outing("║ ║\n");
outing("║ ═操作规则═ ║\n");
outing("║ ║\n");
outing("║ 每一轮按W A S D 键选择要落子的位置,选 ║\n");
outing("║ 好后按K键落子,进入下一轮 ║\n");
outing("║ ║\n");
outing("╚══════════════按任意键开始══════════════╝\n");
getchar();
return;
}
signed main(){
game_front();
game();
return 0;
}