【C++五子棋】简陋的入门小游戏

公告

  • 网上做这个的dalao已经很多了,蒟蒻的这个目前尚有缺陷——在落子的时候会刷新两三次,看着有点卡顿,但可以接受;

  • 游戏一般算法不难,主要是实现,这里不再对原理进行解释;

游戏截图

五子棋1
五子棋2

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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值