C语言实现五子棋

(作业)

#include "stdio.h"
#include "windows.h"
#include "conio.h"
//black 1
//white 2
#define empty 0
#define maxsize 19
//toward==1->水平方向检查;
//toward==2->竖直方向检查;
//toward==3->左对角线检查; 
//toward==4-> 右对角线检查; 
typedef struct DOT{
	int x;
	int y;
	int tag;
}Dot;

 
typedef struct score{
	int black;
	int white;
}Score;

void goto_xy(int x,int y){
	
	HANDLE hOut;
	hOut=GetStdHandle(STD_OUTPUT_HANDLE) ;
	COORD pos={x,y};
	SetConsoleCursorPosition(hOut,pos);
	
	
	CONSOLE_CURSOR_INFO CursorInfo;
	GetConsoleCursorInfo(hOut,&CursorInfo);
	CursorInfo.bVisible=0;
	SetConsoleCursorInfo(hOut,&CursorInfo);
	
	 
}

void Init(int model){
	char c;
	if(!model) c='+';
	else c=' ';
	goto_xy(0,0);
	for(int i=0;i<maxsize;i++){
		for(int j=0;j<maxsize;j++){
			printf("%c",c);
			printf(" ");
		}
		printf("\n");
	}
}

void get_mouse(Dot *dot){
	POINT ptB = {0,0};
	LPPOINT xy=&ptB;
	if(GetAsyncKeyState(VK_RBUTTON)){
		GetCursorPos(xy);
	
		if(xy->x<3||xy->x>459||xy->y<49||xy->y>485){
			return;
		}
	 
		dot->x=(xy->x-3)/24*2;
		dot->y=(xy->y-49)/23;
	}
	
}

int check(int array[][maxsize],Dot dot,int toward){ 								   
	int check=1;
	int result=0;
	int x;
	int y;
	int gap_x,gap_y;

	switch(toward){
		case 1:
			gap_x=1;
			gap_y=0;
			break;
		case 2:
			gap_x=0;
			gap_y=1;
			break;
		case 3:
			gap_x=1;
			gap_y=1;
			break;
		case 4:
			gap_x=-1;
			gap_y=1;
			break;	
	}
	
	x=dot.y;
	y=dot.x/2;
	while(check<=5&&x+gap_x<=18&&x+gap_x>=0&&y+gap_y>=0&&y+gap_y<=18&&array[x+=gap_x][y+=gap_y]==dot.tag){
		check++;
	}
	if(check==5){
		result=1;
		goto out;
	}
	
	x=dot.y;
	y=dot.x/2;
	while(check<=5&&x-gap_x<=18&&x-gap_x>=0&&y-gap_y>=0&&y-gap_y<=18&&array[x-=gap_x][y-=gap_y]==dot.tag){
		check++;
	}
	if(check==5){
		result=1;
	}
	out:
		return result;
}
bool Win_or_Not(int array[][maxsize],Dot dot){
	for(int i=1;i<=4;i++){
		int judge=check(array,dot,i);
		if(judge){
			return true;
		}
	}
	return false;
}
void New(Dot dot){
	static int stand=0;
	while(!GetAsyncKeyState(VK_RBUTTON)){
		if(GetAsyncKeyState(VK_RBUTTON)){
			break;
		}
		goto_xy(dot.x,dot.y);
		printf("%d",dot.tag);
		if(GetAsyncKeyState(VK_RBUTTON)){
			break;
		}
		Sleep(250);
		goto_xy(dot.x,dot.y);		
		printf(" ");
		if(GetAsyncKeyState(VK_RBUTTON)){
			break;
		}
		Sleep(250);
	}
	goto_xy(dot.x,dot.y);
	printf("%d",dot.tag);
}

void The_End(int winner,int model,int array[][maxsize],Score score){
	int choice=0;
	Init(1);
	
	goto_xy(38,0);
	printf("                               ");
	
	goto_xy(15,9);
	printf("The winner is %d",winner);
	goto_xy(15,10);
	printf("Black:%d White:%d",score.black,score.white);
	goto_xy(9,11);
	printf("结束请按:1 查看棋路请按:2");
	scanf("%d",&choice);
	if(choice==1){
		Init(1);
		goto_xy(19,9);
		printf("菜就多练!!!");
		goto_xy(0,19);
	}else if(choice==2){
		goto_xy(0,0);
		for(int i=0;i<maxsize;i++){
			for(int j=0;j<maxsize;j++){
				printf("%d ",array[i][j]);
			}
			printf("\n");
		}
	}
}
void Start(void){
	goto_xy(15,9);
	printf("请全屏游玩"); 
	goto_xy(13,10) ;
	printf("按任意键开始游戏");
	if(_kbhit()) {
		return;
	}
}
int main(void){
	int start;
	goto_xy(15,9);
	printf("请全屏游玩"); 
	goto_xy(13,10) ;
	printf("按任意键开始游戏");
	scanf("%d",&start);
	
	int times_black=0;
	int times_white=0; 
	
	int array[maxsize][maxsize]={0}; 
	
	Dot dot;
	
	Score score;
	score.black=0;
	score.white=0;
	 
	Init(0);
	
	int result=0; 
	
	while(1){
		if(GetAsyncKeyState(VK_RBUTTON)){
			get_mouse(&dot);
			Sleep(250);
				 
			if((score.black+score.white)%2==0){ 
				dot.tag=2;
				score.white++; 
			}else{
				dot.tag=1;
				score.black++; 
			
			} 
			array[dot.y][dot.x/2]=dot.tag;
		}
		goto_xy(38,0);
		printf("Black:%03d White:%03d",score.black,score.white);
		if(score.black+score.white>=9&&Win_or_Not(array,dot)){
			result=dot.tag;
			break;
		}
		New(dot);
	}
	
	The_End(result,1,array,score);
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值