三子棋 人机对战(人机难度选择) 好友对战

主函数代码;

#define _CRT_SECURE_NO_WARNINGS
#include "game.h"
 

int main()
{
	int a = 0;
	int b = 0;//计数下了多少手
	int jiziqi = 0;
	srand((unsigned int)time(NULL));
	do
	{
	kaishi();
	scanf("%d", &a);
	
    switch (a)
		{
		case 1:
			do
			{
				printf("\n请选择玩几子棋:");
				scanf("%d", &jiziqi);
				if (jiziqi != 3)
				{
					printf("\n目前仅支持三子棋 嘿嘿::\n请重新选择\n");
				}
				else
					break;
			} while (1);
		//选择模式  人机对战   好友对战
			int mo= model1();
			if (mo == 1)
			{
				int nandu = model2();
				if (nandu == 1)
				{
					char qipan[X][Y];
					chushihua(qipan, X, Y);
					dayin(qipan, X, Y);
					int panduan = 0;
					do
					{
						zuobiao(X, Y);
						printf("你的棋为X\n");
						player(qipan, X, Y);
						b++;
						dayin(qipan, X, Y);
						panduan = whowin(qipan, X, Y, b, jiziqi);
						if (panduan == 1)
						{
							b = 0; break;
						}

						AI(qipan, b);
						/*computer(qipan, X, Y);*/
						b++;
						dayin(qipan, X, Y);
						panduan = whowin(qipan, X, Y, b, jiziqi);
						if (panduan == 1)
						{
							b = 0; break;
						}
					} while (1);
				}
				
				else
				{
					char qipan[X][Y];
					chushihua(qipan, X, Y);
					dayin(qipan, X, Y);
					int panduan = 0;
					do
					{
						zuobiao(X, Y);
						printf("你的棋为X\n");
						player(qipan, X, Y);
						b++;
						dayin(qipan, X, Y);
						panduan = whowin(qipan, X, Y, b, jiziqi);
						if (panduan == 1)
						{
							b = 0; break;
						}

						/*AI(qipan, b);*/
						computer(qipan, X, Y);
						b++;
						dayin(qipan, X, Y);
						panduan = whowin(qipan, X, Y, b, jiziqi);
						if (panduan == 1)
						{
							b = 0; break;
						}
					} while (1);

				}
			}
			
	//玩家对战		
			else
			{
				char qipan[X][Y];
				chushihua(qipan, X, Y);
				dayin(qipan, X, Y);
				int panduan = 0;
				do
				{
					zuobiao(X, Y);
					printf("先手的棋为X\n");
					player1(qipan, X, Y);
					b++;
					dayin(qipan, X, Y);
					panduan = whowin2(qipan, X, Y, b, jiziqi);
					if (panduan == 1)
					{
						b = 0; break;
					}

					zuobiao(X, Y);
					printf("后手的棋为O\n");
					player2(qipan, X, Y);
					b++;
					dayin(qipan, X, Y);
					panduan = whowin2(qipan, X, Y, b, jiziqi);
					if (panduan == 1)
					{
						b = 0; break;
					}
				} while (1);
			
			}
	
	printf("\n****** 1继续游戏  2退出游戏 ******\n");
	printf("\n是否继续游戏嘛:");
	int linshi = 0;
	scanf("%d", &linshi);
		if(linshi==1)
		{
			printf("\n\n");
			break;
		}
		
		
		
		case 2:  printf("\n游戏结束\n"); a = 2; break;

		
		
		default: printf("\n输入有误,请重新选择:\n"); break;
	    }
	} while (a != 2);

	return 0;
}





自建函数库:



#define _CRT_SECURE_NO_WARNINGS 
#include "game.h"

//游戏开头
void kaishi()
{
	printf("********* 佰木BM learning ********\n");
    printf("**********************************\n");
	printf("**********************************\n");
	printf("****** 1开始游戏  2退出游戏 ******\n");
	printf("**********************************\n");
	printf("**********************************\n");
	printf("请输入你的选择:");
}



//模式1      人机对战返回1    好友对战返回2
int model1()
{
		printf("**********************************\n");
		printf("**********************************\n");
		printf("**********************************\n");
		printf("**** 1人机对战  or  2好友对战 ****\n");
		printf("**********************************\n");
		printf("**********************************\n");
		printf("**********************************\n");
		int a = 0;
do {
		printf("请输入你的选择:");;
		scanf("%d", &a);
        if(a==1)
			return 1;
		else 
		{
			if (a==2)
				return 2;
			else
				printf("\n输入有误,请重新选择\n");
		}
	} while(1);

}


int model2()
{
	printf("\n\n**********************************\n");
	printf("**** 1人工智能  or  2人工智障 ****\n");
	printf("**********************************\n");
	printf("\n请选择人机难度:");
	int nandu = 0;
	do {
		scanf("%d", &nandu);
		if(nandu==1)
			return nandu;
		else
		{
			if (nandu == 2)
				return nandu;
			else
				printf("\n输入错误请重新输入;");
		}
	   } while (1);	  
}




//棋盘初始化
void chushihua(char qipan[X][Y], int x, int y)
{
	int i = 0;
	int j = 0;
	for (i = 0; i <= x - 1; ++i)
	{
		for (j = 0; j <= y - 1; ++j)
			qipan[i][j] = ' ';
	}
}



//棋盘坐标对应表
void zuobiao(int x, int y)
{
	int i = 0;
	int j = 0;
	for (i = 0; i <= x - 1; ++i)
	{
		for (j = 0; j <= y - 1; ++j)
		{
			printf(" (%d,%d) ", i + 1, j + 1);
			if (j < y - 1)
				printf("|");
		}
		printf("\n");
		for (j = 0; j <= y - 1; ++j)
		{
			if (i < x - 1)
				printf("------- ");
		}
		printf("\n");
	}
	return 0;

}


//打印当前棋盘情况
void dayin(char qipan[X][Y], int x, int y)
{
	printf("\n");
	int i = 0;
	int j = 0;
	for (i = 0; i <= x - 1; ++i)
	{
		for (j = 0; j <= y - 1; ++j)
		{
			printf(" %c ", qipan[i][j]);
			if (j < y-1)
				printf("|");
      	}
		printf("\n");
		for (j = 0; j <= y - 1; ++j)
		{
			if (i < x - 1)
				printf("--- ");
		}
		printf("\n");
	}
	printf("\n");
}



//玩家下 (X号棋)  人机对战
void player(char qipan[X][Y], int x, int y)
{
	int a = 0, b = 0;
	printf("到你(X)下棋了:");
	do
	{
		scanf("%d %d", &a, &b);
		if ((qipan[a - 1][b - 1] != ' ') || (a <= 0) || (a > x) || (b <= 0) || (b > y))
			printf("\n此位置无效,请重新输入:");
		else
		{
			qipan[a - 1][b - 1] = 'X';
			break;
		}
	} while (1);
}


//玩家1下 (X号棋)  好友对战
void player1(char qipan[X][Y], int x, int y)
{
	int a = 0, b = 0;
	printf("到先手(X)下棋了:");
	do
	{
		scanf("%d %d", &a, &b);
		if ((qipan[a - 1][b - 1] != ' ') || (a <= 0) || (a > x) || (b <= 0) || (b > y))
			printf("\n此位置无效,请重新输入:");
		else
		{
			qipan[a - 1][b - 1] = 'X';
			break;
		}
	} while (1);
}
//玩家2下 O号棋)
void player2(char qipan[X][Y], int x, int y)
{
	int a = 0, b = 0;
	printf("到后手(O)下棋了:");
	do
	{
		scanf("%d %d", &a, &b);
		if ((qipan[a - 1][b - 1] != ' ') || (a <= 0) || (a > x) || (b <= 0) || (b > y))
			printf("\n此位置无效,请重新输入:");
		else
		{
			qipan[a - 1][b - 1] = 'O';
			break;
		}
	} while (1);
}






//电脑下 (O号棋)   (初级难度)
void computer(char qipan[X][Y], int x, int y)
{
	int a = 0, b = 0;
	printf("到人工智障下棋了:");
	do
	{
		a = rand()% x;
		b = rand()% y;
		if (qipan[a][b] == ' ')
		{
			qipan[a][b] = 'O';
			printf("(%d,%d)", a+1, b+1);
			break;
		}
	} while (1);
}




// AI电脑 后手 下棋 (三子棋) (O号棋)
void AI(char qipan[X][Y], int b)
{

	printf("到AI棋圣下棋了:");
	int i = 0, j = 0;


	//找自己的两颗棋
	for (i = 0; i <= 2; ++i)
	{
		if ((qipan[i][0] == qipan[i][1]) && (qipan[i][1] == 'O') && (qipan[i][2] == ' '))
		{
			qipan[i][2] = 'O';
			printf("(%d,3)\n", i + 1);
			return 0;
		}
		if ((qipan[i][1] == qipan[i][2]) && (qipan[i][1] == 'O') && (qipan[i][0] == ' '))
		{
			qipan[i][0] = 'O';
			printf("(%d,1)\n", i + 1);
			return 0;
		}
		if ((qipan[i][0] == qipan[i][2]) && (qipan[i][0] == 'O') && (qipan[i][1] == ' '))
		{
			qipan[i][1] = 'O';
			printf("(%d,2)\n", i + 1);
			return 0;
		}

	}

	for (j = 0; j <= 2; ++j)
	{
		if ((qipan[0][j] == qipan[1][j]) && (qipan[0][j] == 'O') && (qipan[2][j] == ' '))
		{
			qipan[2][j] = 'O';
			printf("(3,%d)\n", j + 1);
			return 0;

		}
		if ((qipan[1][j] == qipan[2][j]) && (qipan[1][j] == 'O') && (qipan[0][j] == ' '))
		{
			qipan[0][j] = 'O';
			printf("(1,%d)\n", j + 1);
			return 0;
		}
		if ((qipan[0][j] == qipan[2][j]) && (qipan[0][j] == 'O') && (qipan[1][j] == ' '))
		{
			qipan[1][j] = 'O';
			printf("(2,%d)\n", j + 1);
			return 0;
		}

	}

	if ((qipan[0][0] == qipan[1][1]) && (qipan[1][1] == 'O') && (qipan[2][2] == ' '))
	{
		qipan[2][2] = 'O';
		printf("(3,3)\n");
		return 0;
	}
	if ((qipan[0][0] == qipan[2][2]) && (qipan[0][0] == 'O') && (qipan[1][1] == ' '))
	{
		qipan[1][1] = 'O';
		printf("(2, 2)\n");
		return 0;
	}
	if ((qipan[1][1] == qipan[2][2]) && (qipan[1][1] == 'O') && (qipan[0][0] == ' '))
	{
		qipan[0][0] = 'O';
		printf("(1, 1)\n");
		return 0;
	}
	if ((qipan[0][2] == qipan[1][1]) && (qipan[1][1] == 'O') && (qipan[2][0] == ' '))
	{
		qipan[2][0] = 'O';
		printf("(3, 1)\n");
		return 0;
	}
	if ((qipan[0][2] == qipan[2][0]) && (qipan[0][2] == 'O') && (qipan[1][1] == ' '))
	{
		qipan[1][1] = 'O';
		printf("(2, 2)\n");
		return 0;
	}
	if ((qipan[2][0] == qipan[1][1]) && (qipan[1][1] == 'O') && (qipan[0][2] == ' '))
	{
		qipan[0][2] = 'O';
		printf("(1, 3)\n");
		return 0;
	}



	//堵对手的两个棋
	for (i = 0; i <= 2; ++i)
	{
		if ((qipan[i][0] == qipan[i][1]) && (qipan[i][1] == 'X') && (qipan[i][2] == ' '))
		{
			qipan[i][2] = 'O';
			printf("(%d,3)\n", i + 1);
			return 0;
		}
		if ((qipan[i][1] == qipan[i][2]) && (qipan[i][1] == 'X') && (qipan[i][0] == ' '))
		{
			qipan[i][0] = 'O';
			printf("(%d,1)\n", i + 1);
			return 0;
		}
		if ((qipan[i][0] == qipan[i][2]) && (qipan[i][0] == 'X') && (qipan[i][1] == ' '))
		{
			qipan[i][1] = 'O';
			printf("(%d,2)\n", i + 1);
			return 0;
		}

	}

	for (j = 0; j <= 2; ++j)
	{
		if ((qipan[0][j] == qipan[1][j]) && (qipan[0][j] == 'X') && (qipan[2][j] == ' '))
		{
			qipan[2][j] = 'O';
			printf("(3,%d)\n", j + 1);
			return 0;

		}
		if ((qipan[1][j] == qipan[2][j]) && (qipan[1][j] == 'X') && (qipan[0][j] == ' '))
		{
			qipan[0][j] = 'O';
			printf("(1,%d)\n", j + 1);
			return 0;
		}
		if ((qipan[0][j] == qipan[2][j]) && (qipan[0][j] == 'X') && (qipan[1][j] == ' '))
		{
			qipan[1][j] = 'O';
			printf("(2,%d)\n", j + 1);
			return 0;
		}

	}

	if ((qipan[0][0] == qipan[1][1]) && (qipan[1][1] == 'X') && (qipan[2][2] == ' '))
	{
		qipan[2][2] = 'O';
		printf("(3,3)\n");
		return 0;
	}
	if ((qipan[0][0] == qipan[2][2]) && (qipan[0][0] == 'X') && (qipan[1][1] == ' '))
	{
		qipan[1][1] = 'O';
		printf("(2, 2)\n");
		return 0;
	}
	if ((qipan[1][1] == qipan[2][2]) && (qipan[1][1] == 'X') && (qipan[0][0] == ' '))
	{
		qipan[0][0] = 'O';
		printf("(1, 1)\n");
		return 0;
	}
	if ((qipan[0][2] == qipan[1][1]) && (qipan[1][1] == 'X') && (qipan[2][0] == ' '))
	{
		qipan[2][0] = 'O';
		printf("(3, 1)\n");
		return 0;
	}
	if ((qipan[0][2] == qipan[2][0]) && (qipan[0][2] == 'X') && (qipan[1][1] == ' '))
	{
		qipan[1][1] = 'O';
		printf("(2, 2)\n");
		return 0;
	}
	if ((qipan[2][0] == qipan[1][1]) && (qipan[1][1] == 'X') && (qipan[0][2] == ' '))
	{
		qipan[0][2] = 'O';
		printf("(1, 3)\n");
		return 0;
	}






	//上述情况都没有的话 抢占中间位置
	if (qipan[1][1] == ' ')
	{
		qipan[1][1] = 'O';
		printf("(2, 2)\n");
		return 0;
	}
	
	
	if (b == 1)  //AI第一手无中间位置 就抢占四个角
 {
	switch ((rand() % 4 + 1))
	{
	case 1: qipan[0][0] = 'O'; printf("(1,1)"); return 0;
	case 2: qipan[2][2] = 'O'; printf("(3,3)"); return 0;
	case 3: qipan[2][0] = 'O'; printf("(3,1)"); return 0;
	case 4: qipan[0][2] = 'O'; printf("(1,3)"); return 0;
	}
	
  }
	if (b == 3)   //AI第二手.防止玩家偷鸡,抢四个角的位置
	{

		if (qipan[0][0] == ' ')
		{
			qipan[0][0] = 'O';return 0;
		}
		else
		{
				
			if (qipan[2][2] == ' ')
					{
					qipan[2][3] = 'O'; return 0;
					}
				else
				{
					if (qipan[0][2] == ' ')
					{
						qipan[0][2] = 'O'; return 0;
					}

					else 
					{
						if (qipan[2][0] == ' ')
						{
							qipan[2][0] = 'O'; return 0;
						}
					}
				}


		}
	}
	
	
	if (b > 1)// 除了上面的情况 随机下
	{
		int xx = 0, yy = 0;
		do
		{
			xx = rand() % 3;
			yy = rand() % 3;
			if (qipan[xx][yy] == ' ')
			{
				qipan[xx][yy] = 'O';
				printf("(%d,%d)", xx + 1, yy + 1);
				break;
			}
		} while (1);
	}

}




//判断是否取胜 (人机对战)  (针对三子棋的判断方法)    //出结果了返回1   继续下返回0
int whowin(char qipan[X][Y], int x, int y,int b,int jiziqi)
{
	if (b >= (jiziqi * 2 - 1))
	{
		int win = whowin1(qipan, x, y, b, jiziqi);
		if(win!=4)
		{
			if (win ==3)
			{
				printf("平局\n\n\n"); return 1;
			}

			else
			{
				if (win ==2)
				{
					printf("很遗憾,你输了,电脑获胜\n 再接再厉\n\n\n"); return 1;
				}
				else
				{
					printf("恭喜你获得了胜利\n\n\n"); return 1;
				}
			}
		}
		
	}
	return 0;
}

//判断是否取胜  (好友对战) (针对三子棋的判断方法)    //出结果了返回1   继续下返回0
int whowin2(char qipan[X][Y], int x, int y, int b, int jiziqi)
{
	if (b >= (jiziqi * 2 - 1))
	{
		int win = whowin1(qipan, x, y, b, jiziqi);
		if (win != 4)
		{
			if (win == 3)
			{
				printf("平局\n\n\n"); return 1;
			}

			else
			{
				if (win == 2)
				{
					printf("恭喜后手玩家2(O形棋)获胜\n\n\n"); return 1;
				}
				else
				{
					printf("恭喜先手玩家1(X形棋)获胜\n\n\n"); return 1;
				}
			}
		}

	}
	return 0;
}







int whowin1(char qipan[X][Y], int x, int y, int b, int jiziqi)  //返回     1玩家赢   2电脑赢(玩家2赢)   3平局   4继续游戏
{
	int i = 0, j = 0;

	//判断玩家赢
	for (i = 0; i <= x - 1; ++i)
	{
		if ((qipan[i][0] == qipan[i][1]) && (qipan[i][1] == qipan[i][2]) && (qipan[i][0] == 'X'))
			return 1;
	}
	for (j = 0; j <= y - 1; ++j)
	{
		if ((qipan[0][j] == qipan[1][j]) && (qipan[1][j] == qipan[2][j]) && (qipan[0][j] == 'X'))
			return 1;
	}
	if((qipan[0][0]==qipan[1][1])&&(qipan[1][1] == qipan[2][2])&&(qipan[1][1] =='X'))
		return 1;
	if ((qipan[0][2] == qipan[1][1]) && (qipan[1][1] == qipan[2][0]) && (qipan[1][1] == 'X'))
		return 1;


	//判断电脑赢
	for (i = 0; i <= x - 1; ++i)
	{
		if ((qipan[i][0] == qipan[i][1]) && (qipan[i][1] == qipan[i][2]) && (qipan[i][0] == 'O'))
			return 2;
	}
	for (j = 0; j <= y - 1; ++j)
	{
		if ((qipan[0][j] == qipan[1][j]) && (qipan[1][j] == qipan[2][j]) && (qipan[0][j] == 'O'))
			return 2;
	}
	if ((qipan[0][0] == qipan[1][1]) && (qipan[1][1] == qipan[2][2]) && (qipan[1][1] == 'O'))
		return 2;
	if ((qipan[0][2] == qipan[1][1]) && (qipan[1][1] == qipan[2][0]) && (qipan[1][1] == 'O'))
		return 2;

	
	
	//其他情况
	if (b ==( x * y))
		return 3;
	else
		return 4;


}








头文件 函数声明文件:

#pragma once
#include<stdio.h>
#include<time.h>
#include<stdlib.h>

//棋盘大小
#define X 3
#define Y 3

void kaishi();//游戏开头

void chushihua(char qipan[X][Y], int x, int y);// 棋盘初始化  每个都为空格打印出来及什么都不显示


int model1();//模式1      人机对战返回1    好友对战返回2
int model2();//模式2   确定人机难度 1人工智能  2人工智障


void zuobiao(int x, int y);//棋盘坐标对应表

void dayin(char qipan[X][Y], int x, int y);//打印当前棋盘情况


void player(char qipan[X][Y], int x, int y);  //玩家下 (X号棋)  人机对战

void player2(char qipan[X][Y], int x, int y);//玩家2下 好友对战 (O号棋)

void player(char qipan[X][Y], int x, int y);//玩家1下 (X号棋)  好友对战

void computer(char qipan[X][Y], int x, int y); //电脑下 (O号棋)()初级难度
void AI(char qipan[X][Y],int b);//AI下棋



int whowin(char qipan[X][Y], int x, int y, int b, int jiziqi);   //判断是否取胜  (针对三子棋的判断方法)
int whowin1(char qipan[X][Y], int x, int y, int b, int jiziqi);//  确定什么棋三连了   返回     1玩家赢   2电脑赢 3平局   4继续游戏


int whowin2(char qipan[X][Y], int x, int y, int b, int jiziqi);//判断是否取胜  (好友对战) (针对三子棋的判断方法)    //出结果了返回1   继续下返回0

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值