五子棋c++游戏

#include <cstdio>
#include <windows.h>
#include <cstdlib>
#include <conio.h>
#include <iostream>
#include <cstring>
using namespace std;
#define Forij(x) for(int i=1;i<=x;i++) for(int j=1;j<=x;j++)
#define N 5
long long fx[4][2]= {{1,1},{1,0},{0,1},{1,-1}};
long long Q,GG;
string C[20]= {"●","○","﹢","═","║","╔","╚","╗","╝","?"}; //╋
void color(long long a) { //颜色函数
	SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),a);
}
void gotoxy(long long x,long long y) {
	COORD pos;
	pos.X=2*x;
	pos.Y=y;
	SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),pos);
}
struct Gomoku {
	long long m[50][50],nx,ny;
	void reset() {
		system("cls");
		memset(m,-1,sizeof(m));
		color(7);
		for (long long i=1; i<=N; i++) {
			gotoxy(0,i);
			cout<<C[4];
			gotoxy(N+1,i);
			cout<<C[4];
			gotoxy(i,0);
			cout<<C[3]; 
			gotoxy(i,N+1);
			cout<<C[3];
		}
		gotoxy(0,0);
		cout<<C[5];
		gotoxy(0,N+1);
		cout<<C[6];
		gotoxy(N+1,0);
		cout<<C[7];
		gotoxy(N+1,N+1);
		cout<<C[8];
		color(3);
		Forij(N) {
			gotoxy(i,j);
			cout<<C[2];
		}
		nx=ny=N/2+1;
		gotoxy(nx,ny);
	}
	void _drop(long long x,long long i,long long j) {
		m[i][j]=x;
		gotoxy(i,j);
		color(15);
		cout<<C[x];
	}
	long long check() {
		Forij(N) {
			for (long long Fx=0,tmp,lst,xx,yy; Fx<4; Fx++) {
				if(m[i][j]!=-1) {
					xx=i,yy=j,tmp=0,lst=m[i][j];
					for (long long k=1; k<=5; k++) {
						if (xx>N || yy>N) {
							break;
						}
						if (m[xx][yy]==(lst^1)) {
							break;
						}
						if (m[xx][yy]==lst) tmp++;
						xx+=fx[Fx][0],yy+=fx[Fx][1];
					}
					if (tmp==5) {
						return lst;
					}
				}
			}
		}
		return -1;
	}
	long long arnd(long long x,long long y) {
		long long cnt=0;
		for (long long i=x-1;i<=x+1;i++) {
			if (i>0&&i<=N) {
				for (long long j=y-1;j<=y+1;j++) {
					if (j>0&&j<=N) {
						if (m[i][j]>-1) {
							cnt++;
						}
					}
				}
			}
		}
		return cnt;
	}
	void get_val(long long x,long long y,long long &val) {
		val=0;
		Forij(N) {
			for (long long Fx=0,tmp,tk,xx,yy; Fx<4; Fx++) {
				xx=i,yy=j,tmp=tk=0;
				for (long long k=1; k<=5; k++) {
					if (xx>N || yy>N) {
						tmp=0;
						break;
					}
					if (m[xx][yy]==(x^1)) {
						tmp=0;
						break;
					}
					if (m[xx][yy]==x) tmp++,tk+=(1<<(k-1));
					xx+=fx[Fx][0],yy+=fx[Fx][1];
				}
				switch(tmp) {
					case 5:
						val+=8000000000;
						break;
					case 4:
						val+=1000+350*y;
						break;
					case 3:
						val+=(tk==14)?(300+600*y):(300+200*y);
						break;
					case 2:
						val+=3+2*y;
						break;
					case 1:
						val+=1+y;
						break;
				}
			}
		}
	}
	void AI(long long x) {
		long long best,brnd,bi,bj,v1,v2,kkk;
		best=-2147483647;
		brnd=-2147483647;
		Forij(N) if (m[i][j]==-1) {
			m[i][j]=x;
			get_val(x,10,v1);
			get_val(x^1,80,v2);
			if (v1-v2>best){
				bi=i;
				bj=j;
				best=v1-v2;
			}
			if (v1-v2==best){
				if ((kkk=arnd(i,j))>brnd){
					brnd=kkk,bi=i,bj=j;
				}
			}
			m[i][j]=-1;
		}
		_drop(x,bi,bj);
	}
	void HM(long long x) {
		char ch=getch();
		for (;; ch=getch()) {
			if (ch=='w') {
				if (ny>1){
					ny--;
				}
			} else if (ch=='s') {
				if (ny<N){
					ny++;
				}
			} else if (ch=='a') {
				if (nx>1){
					nx--;
				}
			} else if (ch=='d') {
				if (nx<N){
					nx++;
				}
			} else if (m[nx][ny]==-1) {
				_drop(x,nx,ny);
				return;
			}
			gotoxy(nx,ny);
		}
	}
} A;
int main() {
	for (;;) {
		A.reset();
		for (GG=-1;;) {
			gotoxy(A.nx,A.ny);
			A.HM(0);
			GG=A.check();
			if (GG>-1){
				break;
			}
			A.AI(1);
			GG=A.check();
			if (GG>-1){
				break;
			}
		}
		gotoxy(5,N+3);
		if (GG==0){
			cout<<"你赢了\n";
		}
		if (GG==1){
			cout<<"AI赢了\n";
		}
		while (kbhit()){
			getch();
		}
		Sleep(500);
		gotoxy(5,N+3);
		printf("按任意键继续。");
		getch();
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值