井字棋小游戏代码(Visual Studio)

 

#include<graphics.h>
#include<conio.h>
#include<iostream>
#include "ImagePng.h"
#define W 500
#define H 600
using namespace std;

//一些全局变量
MOUSEMSG m;		// 定义鼠标消息
IMAGE hand;		//鼠标图案
int k = 0;		//控制一步一棋子//k = 0,a; // k = 1,b;
int mood = 0;   //mood = 1:单人模式;mood = 2:双人模式;
int w = 0;//判断胜负
int c = 0;//计算a下的次数
int wina = 0;// = 1:a赢了
int winb = 0; // = 2:b赢了
int winc = 0; // = 3: 平局
int v = 0;//堵截成功v = 1
int n = 0;//b胜利了n = 1
int g = 0;
int q = 1;//q = 0,则武器可下

void wordwin();
void wordawin();
void wordbwin();

char map[3][4] = {
	"www",
	"www",
	"www",
};

void draw()//绘制棋局函数 只适用于gamebegin()函数-----------目前适用于检测各种结点
{
	cleardevice();
	initgraph(600, 600);
	setbkcolor(RGB(250, 250, 250));//蓝红黄
	cleardevice();
	setlinecolor(RED);
	for (int i = 0; i < 3; i++)
	{
		for (int j = 0; j < 3; j++)
		{
			if (map[i][j] == 'w')
			{
				rectangle(j * 200, i * 200, (j + 1) * 200, (i + 1) * 200);
			}
		}
	}
}

void huizhijiemian()//绘制界面函数,只应用于gamebegin函数内
{
	IMAGE hand;
	loadimage(&hand, "hand.png", 50, 50);
	BeginBatchDraw();
	int x1, x2, y1, y2, y3, y4;//用来绘制界面的线框坐标
	int wid = 50;//线框宽度
	int len = 200;//线框长度
	x1 = 200; x2 = x1 + len;
	y1 = 250; y2 = y1 + wid;
	y3 = y1 + wid + 50; y4 = y3 + wid;
	setlinecolor(RED);
	rectangle(x1, y1, x2, y2);
	rectangle(x1, y2, x2, y3);
	rectangle(x1, y3, x2, y4);
	setbkmode(TRANSPARENT);//显示透明文字
	settextcolor(RED);
	settextstyle(70, 0, _T("隶书"));
	outtextxy(W / 2 - 100, 100, "井 字 棋");
	settextstyle(30, 0, _T("隶书"));
	outtextxy(x1 + 30, y1 + 5, "单人模式");
	settextstyle(30, 0, _T("隶书"));
	outtextxy(x1 + 30, y2 + 5, "双人模式");
	settextstyle(30, 0, _T("隶书"));
	outtextxy(x1 + 30, y3 + 5, "退出游戏");
	putimagePng(m.x, m.y, &hand);
	FlushBatchDraw();
	EndBatchDraw();
}
void huizhijiemian_1()//二次绘制界面函数,只应用于gamebegin函数内
{
	IMAGE hand;
	loadimage(&hand, "hand.png", 50, 50);
	BeginBatchDraw();
	int x1, x2, y1, y2, y3, y4;//用来绘制界面的线框坐标
	int wid = 50;//线框宽度
	int len = 200;//线框长度
	x1 = 200; x2 = x1 + len;
	y1 = 250; y2 = y1 + wid;
	y3 = y1 + wid + 50; y4 = y3 + wid;
	setlinecolor(YELLOW);
	rectangle(x1, y1, x2, y2);
	rectangle(x1, y2, x2, y3);
	rectangle(x1, y3, x2, y4);
	setbkmode(TRANSPARENT);//显示透明文字
	settextcolor(BLUE);
	settextstyle(50, 0, _T("隶书"));
	outtextxy(W / 4 - 75, 100, "欢迎来玩井字棋小游戏");
	outtextxy(W / 2 - 100, 150, "请在次确认模式");
	settextstyle(30, 0, _T("隶书"));
	outtextxy(x1 + 30, y1 + 5, "单人模式");
	settextstyle(30, 0, _T("隶书"));
	outtextxy(x1 + 30, y2 + 5, "双人模式");
	settextstyle(30, 0, _T("隶书"));
	outtextxy(x1 + 30, y3 + 5, "退出游戏");
	putimagePng(m.x, m.y, &hand);
	FlushBatchDraw();
	EndBatchDraw();
}
void gamebegin()  	// 游戏开始
{
	w = 0;
	q = 1;
	k = 0;
	if (w == 0)
	{
		int exit = 0;//循环出口
		int x1, x2, y1, y2, y3, y4;
		int wid = 50;//线框宽度
		int len = 200;//线框长度
		x1 = 200; x2 = x1 + len;
		y1 = 250; y2 = y1 + wid;
		y3 = y1 + wid + 50; y4 = y3 + wid;
		initgraph(600, 600);
		setfillcolor(GREEN);//鼠标点击颜色
		setbkcolor(RGB(250, 250, 250));//蓝红黄
		cleardevice();
		while (exit != 1)
		{
			huizhijiemian();//绘制界面函数
			// 获取一条鼠标消息
			m = GetMouseMsg();
			putimagePng(m.x, m.y, &hand);
			cleardevice();
			switch (m.uMsg)
			{
			case WM_MOUSEMOVE:
				// 鼠标移动的时候画红色的小点
				putimagePng(m.x, m.y, &hand);
				break;
			case WM_LBUTTONDOWN://点击左键
				if (m.x >= x1 && m.x <= x2 && m.y >= y1 && m.y <= y2)
				{//单人模式
					fillcircle(m.x, m.y, 10);
					Sleep(1);
					mood = 1;//单人模式
					exit = 1;//退出循环结束此函数
					closegraph();
				}
				else if (m.x >= x1 && m.x <= x2 && m.y >= y2 && m.y <= y3)
				{//双人模式
					fillcircle(m.x, m.y, 10);
					Sleep(1);
					mood = 2;//双人模式
					exit = 1;//退出循环结束此函数
					closegraph();
				}
				else if (m.x >= x1 && m.x <= x2 && m.y >= y3 && m.y <= y4)
				{
					fillcircle(m.x, m.y, 10);
					closegraph();
					break;
				}
				else {
					int step = 20;
					setlinestyle(PS_SOLID, 20);//设置线条宽度
					setlinecolor(RED);
					line(m.x - step, m.y - step, m.x + step, m.y + step);
					line(m.x + step, m.y - step, m.x - step, m.y + step);
					setlinestyle(PS_SOLID, 0);//还原线条宽度
				}
				break;
			case WM_RBUTTONUP:// 按鼠标右键退出程序
				setlinestyle(PS_SOLID, 20);//设置线条宽度
				setlinecolor(BLUE);
				circle(m.x, m.y, 20);
				setlinestyle(PS_SOLID, 0);//还原线条宽度
				break;
			}
		}
		draw();//展开新棋局
	}
	BeginBatchDraw();//开始第二次批量绘制
}
void gamebegin_1()  	// 二次游戏开始界面
{
	//所有全局变量全都重新初始化
	k = 0;		//控制一步一棋子//k = 0,a; // k = 1,b;
	mood = 0;   //mood = 1:单人模式;mood = 2:双人模式;
	w = 0;//判断胜负
	c = 0;//计算a下的次数
	wina = 0;// = 1:a赢了
	winb = 0; // = 2:b赢了
	winc = 0; // = 3: 平局
	v = 0;//堵截成功v = 1
	n = 0;//b胜利了n = 1
	g = 0;
	q = 1;//q = 0,则武器可下

	if (w == 0)
	{
		int exit = 0;//循环出口
		int x1, x2, y1, y2, y3, y4;
		int wid = 50;//线框宽度
		int len = 200;//线框长度
		x1 = 200; x2 = x1 + len;
		y1 = 250; y2 = y1 + wid;
		y3 = y1 + wid + 50; y4 = y3 + wid;
		initgraph(600, 600);
		setfillcolor(GREEN);//鼠标点击颜色
		setbkcolor(RGB(250, 250, 250));//蓝红黄
		cleardevice();
		while (exit != 1)
		{
			huizhijiemian_1();//二次绘制界面函数
			// 获取一条鼠标消息
			m = GetMouseMsg();
			putimagePng(m.x, m.y, &hand);
			cleardevice();
			switch (m.uMsg)
			{
			case WM_MOUSEMOVE:
				// 鼠标移动的时候画红色的小点
				putimagePng(m.x, m.y, &hand);
				break;
			case WM_LBUTTONDOWN://点击左键
				if (m.x >= x1 && m.x <= x2 && m.y >= y1 && m.y <= y2)
				{//单人模式
					fillcircle(m.x, m.y, 10);
					Sleep(1);
					mood = 1;//单人模式
					exit = 1;//退出循环结束此函数
					closegraph();
				}
				else if (m.x >= x1 && m.x <= x2 && m.y >= y2 && m.y <= y3)
				{//双人模式
					fillcircle(m.x, m.y, 10);
					Sleep(1);
					mood = 2;//双人模式
					exit = 1;//退出循环结束此函数
					closegraph();
				}
				else if (m.x >= x1 && m.x <= x2 && m.y >= y3 && m.y <= y4)
				{
					fillcircle(m.x, m.y, 10);
					closegraph();
					break;
				}
				else {
					int step = 20;
					setlinestyle(PS_SOLID, 20);//设置线条宽度
					setlinecolor(RED);
					line(m.x - step, m.y - step, m.x + step, m.y + step);
					line(m.x + step, m.y - step, m.x - step, m.y + step);
					setlinestyle(PS_SOLID, 0);//还原线条宽度
				}
				break;
			case WM_RBUTTONUP:// 按鼠标右键退出程序
				setlinestyle(PS_SOLID, 20);//设置线条宽度
				setlinecolor(BLUE);
				circle(m.x, m.y, 20);
				setlinestyle(PS_SOLID, 0);//还原线条宽度
				break;
			}
		}
		//重开一局
		map[0][0] = 'w';
		map[0][1] = 'w';
		map[0][2] = 'w';
		map[1][0] = 'w';
		map[1][1] = 'w';
		map[1][2] = 'w';
		map[2][0] = 'w';
		map[2][1] = 'w';
		map[2][2] = 'w';
		draw();
	}
	BeginBatchDraw();//开始第二次批量绘制
}
void gameshow()	// 显示
{
	cleardevice();
	setlinecolor(RED);
	int i, j;
	for (int i = 0; i < 3; i++)
	{
		for (int j = 0; j < 3; j++)
		{
			if (map[i][j] == 'w')
			{
				rectangle(j * 200, i * 200, (j + 1) * 200, (i + 1) * 200);
			}
			if (map[i][j] == 'a')
			{
				rectangle(j * 200, i * 200, (j + 1) * 200, (i + 1) * 200);
				setlinestyle(PS_SOLID, 20);//设置线条宽度
				setlinecolor(BLUE);
				circle((j * 200 + (j + 1) * 200) / 2, (i * 200 + (i + 1) * 200) / 2, 50);//在格子中心点画圆
				setlinestyle(PS_SOLID, 0);//还原线条宽度
			}
			if (map[i][j] == 'b')
			{
				rectangle(j * 200, i * 200, (j + 1) * 200, (i + 1) * 200);
				setlinestyle(PS_SOLID, 20);//设置线条宽度
				setlinecolor(RED);
				line((j * 200 + (j + 1) * 200) / 2 - 50, (i * 200 + (i + 1) * 200) / 2 - 50, (j * 200 + (j + 1) * 200) / 2 + 50, (i * 200 + (i + 1) * 200) / 2 + 50);
				line((j * 200 + (j + 1) * 200) / 2 + 50, (i * 200 + (i + 1) * 200) / 2 - 50, (j * 200 + (j + 1) * 200) / 2 - 50, (i * 200 + (i + 1) * 200) / 2 + 50);
				setlinestyle(PS_SOLID, 0);//还原线条宽度
			}
			if (map[0][0] != 'w' && map[0][1] != 'w' && map[0][2] != 'w' &&
				map[1][0] != 'w' && map[1][1] != 'w' && map[1][2] != 'w' &&
				map[2][0] != 'w' && map[2][1] != 'w' && map[2][2] != 'w')
			{
				q = 0;
			}
		}
	}
	FlushBatchDraw();
}

void updatenotautomation_1()		// 单人模式下的手动的更新
{
	int exit = 0;
	cleardevice();
	while (exit != 1)
	{
		// 获取一条鼠标消息
		m = GetMouseMsg();
		cleardevice();
		switch (m.uMsg)
		{
		case WM_LBUTTONDOWN://点击左键下棋将w变成a
			if (k == 0)//k = 0,轮到a下
			{
				if (m.y < 200 && m.y>0)//在第一排
				{
					if (m.x > 0 && m.x < 200 && map[0][0] == 'w')//在第1个格子
					{
						map[0][0] = 'a';
						exit = 1;//退出循环
					}
					else if (m.x > 200 && m.x < 400 && map[0][1] == 'w')//在第2个格子
					{
						map[0][1] = 'a';
						if (c == 2)
							g = 1;
						exit = 1;//退出循环
					}
					else if (m.x > 400 && m.x < 600 && map[0][2] == 'w')//在第3个格子
					{
						map[0][2] = 'a';
						exit = 1;//退出循环
					}
				}
				else if (m.y < 400 && m.y>200)//在第一排
				{
					if (m.x > 0 && m.x < 200 && map[1][0] == 'w')//在第4个格子
					{
						map[1][0] = 'a';
						if (c == 2)
							g = 1;
						exit = 1;//退出循环
					}
					else if (m.x > 200 && m.x < 400 && map[1][1] == 'w')//在第5个格子
					{
						map[1][1] = 'a';
						if (c == 2)
							g = 1;
						exit = 1;//退出循环
					}
					else if (m.x > 400 && m.x < 600 && map[1][2] == 'w')//在第6个格子
					{
						map[1][2] = 'a';
						exit = 1;//退出循环
					}
				}
				else if (m.y < 600 && m.y>400)//在第3排
				{
					if (m.x > 0 && m.x < 200 && map[2][0] == 'w')//在第7个格子
					{
						map[2][0] = 'a';
						exit = 1;//退出循环
					}
					else if (m.x > 200 && m.x < 400 && map[2][1] == 'w')//在第8个格子
					{
						map[2][1] = 'a';
						if (c == 2)
							g = 1;
						exit = 1;//退出循环
					}
					else if (m.x > 400 && m.x < 600 && map[2][2] == 'w')//在第9个格子
					{
						map[2][2] = 'a';
						exit = 1;//退出循环
					}
				}
				k = 1;//令k = 1,轮到b下。
				c++;//a下一次count++
			}
		}
	}
	k = 1;//方便重复玩
}
void AIbuding(int r)//随机情况
{
	if (r == 1 && map[0][0] == 'w') {
		map[0][0] = 'b';
	}
	else if (r == 2 && map[0][1] == 'w') {
		map[0][1] = 'b';
	}
	else if (r == 3 && map[0][2] == 'w') {
		map[0][2] = 'b';
	}
	else if (r == 4 && map[1][0] == 'w') {
		map[1][0] = 'b';
	}
	else if (r == 5 && map[1][1] == 'w') {
		map[1][1] = 'b';
	}
	else if (r == 6 && map[1][2] == 'w') {
		map[1][2] = 'b';
	}
	else if (r == 7 && map[2][0] == 'w') {
		map[2][0] = 'b';
	}
	else if (r == 8 && map[2][1] == 'w') {
		map[2][1] = 'b';
	}
	else if (r == 9 && map[2][2] == 'w') {
		map[2][2] = 'b';
	}
}
void AIbuding_2()//所有围堵情况
{
	if (map[0][0] == 'w' && map[0][1] == 'a' && map[0][2] == 'a' ||
		map[0][0] == 'w' && map[1][1] == 'a' && map[2][2] == 'a' ||
		map[0][0] == 'w' && map[1][0] == 'a' && map[2][0] == 'a')
	{
		map[0][0] = 'b';
		v = 1;
	}
	else if (map[0][1] == 'w' && map[0][0] == 'a' && map[0][2] == 'a' ||
		map[0][1] == 'w' && map[1][1] == 'a' && map[2][1] == 'a')
	{
		map[0][1] = 'b';
		v = 1;
	}
	else if (map[0][2] == 'w' && map[0][0] == 'a' && map[0][1] == 'a' ||
		map[0][2] == 'w' && map[1][1] == 'a' && map[2][0] == 'a' ||
		map[0][2] == 'w' && map[1][2] == 'a' && map[2][2] == 'a')
	{
		map[0][2] = 'b';
		v = 1;
	}
	else if (map[1][0] == 'w' && map[0][0] == 'a' && map[2][0] == 'a' ||
		map[1][0] == 'w' && map[1][1] == 'a' && map[1][2] == 'a')
	{
		map[1][0] = 'b';
		v = 1;
	}
	else if (map[1][1] == 'w' && map[1][0] == 'a' && map[1][2] == 'a' ||
		map[1][1] == 'w' && map[0][1] == 'a' && map[2][1] == 'a' ||
		map[1][1] == 'w' && map[0][0] == 'a' && map[2][2] == 'a' ||
		map[1][1] == 'w' && map[0][2] == 'a' && map[2][0] == 'a')
	{
		map[1][1] = 'b';
		v = 1;
	}
	else if (map[1][2] == 'w' && map[0][2] == 'a' && map[2][2] == 'a' ||
		map[1][2] == 'w' && map[1][0] == 'a' && map[1][1] == 'a')
	{
		map[1][2] = 'b';
		v = 1;
	}
	else if (map[2][0] == 'w' && map[0][0] == 'a' && map[1][0] == 'a' ||
		map[2][0] == 'w' && map[1][1] == 'a' && map[0][2] == 'a' ||
		map[2][0] == 'w' && map[2][1] == 'a' && map[2][2] == 'a')
	{
		map[2][0] = 'b';
		v = 1;
	}
	else if (map[2][1] == 'w' && map[2][0] == 'a' && map[2][2] == 'a' ||
		map[2][1] == 'w' && map[1][1] == 'a' && map[0][1] == 'a')
	{
		map[2][1] = 'b';
		v = 1;
	}
	else if (map[2][2] == 'w' && map[2][0] == 'a' && map[2][1] == 'a' ||
		map[2][2] == 'w' && map[0][2] == 'a' && map[1][2] == 'a' ||
		map[2][2] == 'w' && map[0][0] == 'a' && map[1][1] == 'a')
	{
		map[2][2] = 'b';
		v = 1;
	}
}
void AIbuding_3()//必胜
{
	if (map[0][0] == 'w' && map[0][1] == 'b' && map[0][2] == 'b' ||
		map[0][0] == 'w' && map[1][1] == 'b' && map[2][2] == 'b' ||
		map[0][0] == 'w' && map[1][0] == 'b' && map[2][0] == 'b')
	{
		map[0][0] = 'b';
		n = 1;
	}
	else if (map[0][1] == 'w' && map[0][0] == 'b' && map[0][2] == 'b' ||
		map[0][1] == 'w' && map[1][1] == 'b' && map[2][1] == 'b')
	{
		map[0][1] = 'b';
		n = 1;
	}
	else if (map[0][2] == 'w' && map[0][0] == 'b' && map[0][1] == 'b' ||
		map[0][2] == 'w' && map[1][1] == 'b' && map[2][0] == 'b' ||
		map[0][2] == 'w' && map[1][2] == 'b' && map[2][2] == 'b')
	{
		map[0][2] = 'b';
		n = 1;
	}
	else if (map[1][0] == 'w' && map[0][0] == 'b' && map[2][0] == 'b' ||
		map[1][0] == 'w' && map[1][1] == 'b' && map[1][2] == 'b')
	{
		map[1][0] = 'b';
		n = 1;
	}
	else if (map[1][1] == 'w' && map[1][0] == 'b' && map[1][2] == 'b' ||
		map[1][1] == 'w' && map[0][1] == 'b' && map[2][1] == 'b' ||
		map[1][1] == 'w' && map[0][0] == 'b' && map[2][2] == 'b' ||
		map[1][1] == 'w' && map[0][2] == 'b' && map[2][0] == 'b')
	{
		map[1][1] = 'b';
		n = 1;
	}
	else if (map[1][2] == 'w' && map[0][2] == 'b' && map[2][2] == 'b' ||
		map[1][2] == 'w' && map[1][0] == 'b' && map[1][1] == 'b')
	{
		map[1][2] = 'b';
		n = 1;
	}
	else if (map[2][0] == 'w' && map[0][0] == 'b' && map[1][0] == 'b' ||
		map[2][0] == 'w' && map[1][1] == 'b' && map[0][2] == 'b' ||
		map[2][0] == 'w' && map[2][1] == 'b' && map[2][2] == 'b')
	{
		map[2][0] = 'b';
		n = 1;
	}
	else if (map[2][1] == 'w' && map[2][0] == 'b' && map[2][2] == 'b' ||
		map[2][1] == 'w' && map[1][1] == 'b' && map[0][1] == 'b')
	{
		map[2][1] = 'b';
		n = 1;
	}
	else if (map[2][2] == 'w' && map[2][0] == 'b' && map[2][1] == 'b' ||
		map[2][2] == 'w' && map[0][2] == 'b' && map[1][2] == 'b' ||
		map[2][2] == 'w' && map[0][0] == 'b' && map[1][1] == 'b')
	{
		map[2][2] = 'b';
		n = 1;
	}
}
void jiexue()//解穴函数--疗伤函数
{
	if (map[0][0] == 'w') {
		map[0][0] = 'b';
	}
	else if (map[0][1] == 'w') {
		map[0][1] = 'b';
	}
	else if (map[0][2] == 'w') {
		map[0][2] = 'b';
	}
	else if (map[1][0] == 'w') {
		map[1][0] = 'b';
	}
	else if (map[1][1] == 'w') {
		map[1][1] = 'b';
	}
	else if (map[1][2] == 'w') {
		map[1][2] = 'b';
	}
	else if (map[2][0] == 'w') {
		map[2][0] = 'b';
	}
	else if (map[2][1] == 'w') {
		map[2][1] = 'b';
	}
	else if (map[2][2] == 'w') {
		map[2][2] = 'b';
	}
}

void Artificial_Intelligence()			//人工智能函数——让ai与自己对弈,实现b堵截功能
{
	int r = rand() % 9 + 1;//生成1~9的随机数
	if (k == 1)//轮到AI下棋了
	{
		if (c == 1)//第一轮:随机
		{
			if (map[1][2] == 'a')
			{
				AIbuding(5);
			}
			else if (map[0][1] == 'a')
			{
				AIbuding(5);
			}
			else if (map[1][0] == 'a')
			{
				AIbuding(5);
			}
			else if (map[2][1] == 'a')
			{
				AIbuding(5);
			}
			else if (map[1][1] == 'a')//破解三角阵
			{
				map[0][0] = 'b';//map[0][2] = 'b'    map[2][0] = 'b'      map[2][2] = 'b'
			}
			else if (map[0][0] == 'a')//破解三角阵
			{
				map[1][1] = 'b';//以点破面
			}
			else if (map[0][2] == 'a')//破解三角阵
			{
				map[1][1] = 'b';//以点破面
			}
			else if (map[2][0] == 'a')//破解三角阵
			{
				map[1][1] = 'b';//以点破面
			}
			else if (map[2][2] == 'a')//破解三角阵
			{
				map[1][1] = 'b';//以点破面
			}
		}
		else if (c == 2)//第二轮:要么堵,要么随机
		{
			if (map[1][0] == 'a' && map[0][1] == 'a' && map[1][1] == 'b')
			{
				AIbuding(1);//1 3 7 9  6
			}
			else if (map[1][0] == 'a' && map[2][1] == 'a' && map[1][1] == 'b')
			{
				AIbuding(7);//1 3 7 9  6
			}
			else if (map[1][2] == 'a' && map[2][1] == 'a' && map[1][1] == 'b')
			{
				AIbuding(9);//1 3 7 9  4
			}
			else if (map[1][2] == 'a' && map[0][1] == 'a' && map[1][1] == 'b')
			{
				AIbuding(3);//1 3 7 9  6
			}
			else if (map[2][0] == 'a' && map[0][1] == 'a' && map[1][1] == 'b')
			{
				AIbuding(1);//
			}
			else if (map[2][1] == 'a' && map[0][0] == 'a' && map[1][1] == 'b')
			{
				AIbuding(3);//
			}
			else if (map[2][2] == 'a' && map[0][1] == 'a' && map[1][1] == 'b')
			{
				AIbuding(3);//
			}
			else if (map[0][2] == 'a' && map[2][1] == 'a' && map[1][1] == 'b')
			{
				AIbuding(1);//
			}
			else if (map[0][0] == 'a' && map[1][2] == 'a' && map[1][1] == 'b')
			{
				AIbuding(7);//
			}
			else if (map[0][2] == 'a' && map[1][0] == 'a' && map[1][1] == 'b')
			{
				AIbuding(9);//
			}
			else if (map[2][0] == 'a' && map[1][2] == 'a' && map[1][1] == 'b')
			{
				AIbuding(1);//
			}
			else if (map[2][2] == 'a' && map[1][0] == 'a' && map[1][1] == 'b')
			{
				AIbuding(3);//
			}
			//包夹
			else if (map[2][2] == 'a' && map[0][0] == 'a' && map[1][1] == 'b')
			{
				AIbuding(6);//
			}
			else if (map[2][0] == 'a' && map[0][2] == 'a' && map[1][1] == 'b')
			{
				AIbuding(4);//
			}
			else if (map[1][0] == 'a' && map[1][2] == 'a' && map[1][1] == 'b')
			{
				AIbuding(1);//
			}
			else if (map[2][1] == 'a' && map[0][1] == 'a' && map[1][1] == 'b')
			{
				AIbuding(3);//
			}
			else if (map[2][2] == 'a' && map[1][1] == 'a' && map[0][0] == 'b')
			{
				AIbuding(3);//
			}
			else if (v == 0)
			{
				AIbuding_2();
			}
		}
		else if (c == 3)//第三轮:要么堵,要么随机
		{
			int q = 1;
			if (map[1][0] == 'a' && map[0][1] == 'a' && map[1][1] == 'a' && map[1][2] == 'b' && map[2][1] == 'b')//双毒性
			{
				AIbuding(9);
				q = 0;
			}
			else if (map[1][0] == 'a' && map[0][1] == 'a' && map[1][1] == 'a' && map[1][2] == 'b' && map[0][0] == 'b')//双毒性
			{
				AIbuding(8);
				q = 0;
			}
			else if (map[1][0] == 'a' && map[0][1] == 'a' && map[1][1] == 'a' && map[2][1] == 'b' && map[0][0] == 'b')//双毒性
			{
				AIbuding(6);
				q = 0;
			}
			//
			else if (map[1][0] == 'a' && map[2][1] == 'a' && map[1][1] == 'a' && map[1][2] == 'b' && map[0][1] == 'b')//双毒性
			{
				AIbuding(3);
				q = 0;
			}
			//
			else if (map[1][0] == 'a' && map[2][1] == 'a' && map[0][1] == 'a' && map[1][2] == 'b' && map[1][1] == 'b')//双毒性
			{
				AIbuding(3);
				q = 0;
			}
			else if (map[1][0] == 'a' && map[2][1] == 'a' && map[0][1] == 'a' && map[0][2] == 'b' && map[1][1] == 'b')//双毒性
			{
				AIbuding(9);
				q = 0;
			}
			else if (map[1][0] == 'a' && map[2][1] == 'a' && map[0][1] == 'a' && map[0][0] == 'b' && map[1][1] == 'b')//双毒性
			{
				AIbuding(9);
				q = 0;
			}
			//
			else if (map[1][0] == 'a' && map[1][2] == 'a' && map[0][1] == 'a' && map[0][2] == 'b' && map[1][1] == 'b')//双毒性
			{
				AIbuding(1);
				q = 0;
			}
			else if (map[1][0] == 'a' && map[1][2] == 'a' && map[0][1] == 'a' && map[2][0] == 'b' && map[1][1] == 'b')//双毒性
			{
				AIbuding(1);
				q = 0;
			}
			else if (map[1][0] == 'a' && map[1][2] == 'a' && map[0][1] == 'a' && map[0][0] == 'b' && map[1][1] == 'b')//双毒性
			{
				AIbuding(3);
				q = 0;
			}
			//
			else if (map[2][1] == 'a' && map[1][2] == 'a' && map[0][1] == 'a' && map[2][0] == 'b' && map[1][1] == 'b')//双毒性
			{
				AIbuding(1);
				q = 0;
			}
			else if (map[2][1] == 'a' && map[1][2] == 'a' && map[0][1] == 'a' && map[0][2] == 'b' && map[1][1] == 'b')//双毒性
			{
				AIbuding(9);
			}
			else if (map[2][1] == 'a' && map[1][2] == 'a' && map[0][1] == 'a' && map[0][0] == 'b' && map[1][1] == 'b')//双毒性
			{
				AIbuding(3);
				q = 0;
			}
			//
			else if (map[2][1] == 'a' && map[1][0] == 'a' && map[1][2] == 'a' && map[0][0] == 'b' && map[1][1] == 'b')//双毒性
			{
				AIbuding(3);
				q = 0;
			}
			else if (map[2][1] == 'a' && map[1][0] == 'a' && map[1][2] == 'a' && map[0][0] == 'b' && map[1][1] == 'b')//双毒性
			{
				AIbuding(3);
				q = 0;
			}
			//
			else if (map[2][1] == 'a' && map[1][0] == 'a' && map[0][2] == 'a' && map[2][0] == 'b' && map[1][1] == 'b')
			{
				AIbuding(9);
				q = 0;
			}
			else if (map[2][2] == 'a' && map[1][0] == 'a' && map[0][1] == 'a' && map[0][0] == 'b' && map[1][1] == 'b')
			{
				AIbuding(7);
				q = 0;
			}
			else if (map[2][1] == 'a' && map[0][0] == 'a' && map[1][2] == 'a' && map[2][2] == 'b' && map[1][1] == 'b')
			{
				AIbuding(7);
				q = 0;
			}
			else if (map[0][1] == 'a' && map[1][2] == 'a' && map[2][0] == 'a' && map[0][2] == 'b' && map[1][1] == 'b')
			{
				AIbuding(9);
				q = 0;
			}
			else if (map[2][0] == 'a' && map[1][2] == 'a' && map[0][0] == 'a' && map[1][0] == 'b' && map[1][1] == 'b')//大三角
			{
				AIbuding(2);//8 3 9
				q = 0;
			}
			else if (map[2][1] == 'a' && map[0][2] == 'a' && map[0][0] == 'a' && map[1][1] == 'b' && map[0][1] == 'b')//大三角
			{
				AIbuding(4);//4 6 7 9
				q = 0;
			}
			else if (map[2][2] == 'a' && map[0][2] == 'a' && map[1][0] == 'a' && map[1][1] == 'b' && map[1][2] == 'b')//大三角
			{
				AIbuding(2);//1 2 7 8
				q = 0;
			}
			else if (map[2][0] == 'a' && map[0][1] == 'a' && map[2][2] == 'a' && map[1][1] == 'b' && map[2][1] == 'b')//大三角
			{
				AIbuding(1);//1   3    4   6
				q = 0;
			}
			//
			else if (map[0][1] == 'a' && map[1][1] == 'a' && map[2][0] == 'a' && map[0][0] == 'b' && map[0][2] == 'b')//插缝
			{
				AIbuding(8);
				q = 0;
			}
			else if (map[0][1] == 'a' && map[1][1] == 'a' && map[2][2] == 'a' && map[0][0] == 'b' && map[0][2] == 'b')//插缝
			{
				AIbuding(8);
				q = 0;
			}
			else if (q == 1)
			{
				AIbuding_3();
			}
			if (n == 0)
			{
				AIbuding_2();
			}
		}
		else if (c == 4)//第4轮://赢,堵,随机
		{
			int q = 1;
			if (map[1][0] == 'a' && map[0][1] == 'a' && map[1][1] == 'a' && map[2][2] == 'a' && map[1][2] == 'b' && map[2][1] == 'b' && map[0][0] == 'b')//三毒性
			{
				AIbuding(3);//7
				q = 0;
			}
			else if (map[1][0] == 'a' && map[2][1] == 'a' && map[1][1] == 'a' && map[0][2] == 'a' && map[1][2] == 'b' && map[2][0] == 'b' && map[0][1] == 'b')//三毒性
			{
				AIbuding(0);//9
				q = 0;
			}
			else if (map[1][0] == 'a' && map[2][1] == 'a' && map[1][1] == 'a' && map[0][2] == 'a' && map[1][2] == 'b' && map[2][0] == 'b' && map[0][1] == 'b')//三毒性
			{
				AIbuding(0);//9
				q = 0;
			}
			else if (map[1][0] == 'a' && map[2][2] == 'a' && map[1][1] == 'a' && map[0][2] == 'a' && map[1][2] == 'b' && map[2][0] == 'b' && map[0][0] == 'b')//三毒性
			{
				AIbuding(2);//8
				q = 0;
			}
			else if (map[2][0] == 'a' && map[2][2] == 'a' && map[1][1] == 'a' && map[0][1] == 'a' && map[0][2] == 'b' && map[2][1] == 'b' && map[0][0] == 'b')//三毒性
			{
				AIbuding(4);//6
				q = 0;
			}
			else if (map[2][1] == 'a' && map[2][2] == 'a' && map[1][0] == 'a' && map[1][2] == 'a' && map[0][1] == 'b' && map[1][1] == 'b' && map[1][2] == 'b')//三毒性
			{
				AIbuding(7);//6
				q = 0;
			}
			else if (q == 1)
			{
				AIbuding_3();
			}
			if (n == 0)
			{
				AIbuding_2();
			}
		}
		k = 0;//b下完让k等于0,a才能继续下
	}
}

void updatenotautomation_2()	    // 双人模式下的手动的更新
{
	int exit = 0;
	cleardevice();
	while (exit != 1)
	{
		// 获取一条鼠标消息
		m = GetMouseMsg();
		cleardevice();
		switch (m.uMsg)
		{
		case WM_LBUTTONDOWN://点击左键下棋将w变成a
			if (k == 0)//k = 0,轮到a下
			{
				if (m.y < 200 && m.y>0)//在第一排
				{
					if (m.x > 0 && m.x < 200 && map[0][0] == 'w')//在第1个格子
					{
						map[0][0] = 'a';
						exit = 1;//退出循环
					}
					else if (m.x > 200 && m.x < 400 && map[0][1] == 'w')//在第2个格子
					{
						map[0][1] = 'a';
						exit = 1;//退出循环
					}
					else if (m.x > 400 && m.x < 600 && map[0][2] == 'w')//在第3个格子
					{
						map[0][2] = 'a';
						exit = 1;//退出循环
					}
				}
				else if (m.y < 400 && m.y>200)//在第2排
				{
					if (m.x > 0 && m.x < 200 && map[1][0] == 'w')//在第4个格子
					{
						map[1][0] = 'a';
						exit = 1;//退出循环
					}
					else if (m.x > 200 && m.x < 400 && map[1][1] == 'w')//在第5个格子
					{
						map[1][1] = 'a';
						exit = 1;//退出循环
					}
					else if (m.x > 400 && m.x < 600 && map[1][2] == 'w')//在第6个格子
					{
						map[1][2] = 'a';
						exit = 1;//退出循环
					}
				}
				else if (m.y < 600 && m.y>400)//在第3排
				{
					if (m.x > 0 && m.x < 200 && map[2][0] == 'w')//在第7个格子
					{
						map[2][0] = 'a';
						exit = 1;//退出循环
					}
					else if (m.x > 200 && m.x < 400 && map[2][1] == 'w')//在第8个格子
					{
						map[2][1] = 'a';
						exit = 1;//退出循环
					}
					else if (m.x > 400 && m.x < 600 && map[2][2] == 'w')//在第9个格子
					{
						map[2][2] = 'a';
						exit = 1;//退出循环
					}
				}
				k = 1;//令k = 1,轮到b下。
			}
			else if (k == 1)//k = 0,轮到 b 下
			{
				if (m.y < 200 && m.y > 0)//在第1排
				{
					if (m.x > 0 && m.x < 200 && map[0][0] == 'w')//在第1个格子
					{
						map[0][0] = 'b';
						exit = 1;//退出循环
					}
					else if (m.x > 200 && m.x < 400 && map[0][1] == 'w')//在第2个格子
					{
						map[0][1] = 'b';
						exit = 1;//退出循环
					}
					else if (m.x > 400 && m.x < 600 && map[0][2] == 'w')//在第3个格子
					{
						map[0][2] = 'b';
						exit = 1;//退出循环
					}
				}
				else if (m.y < 400 && m.y > 200)//在第2排
				{
					if (m.x > 0 && m.x < 200 && map[1][0] == 'w')//在第4个格子
					{
						map[1][0] = 'b';
						exit = 1;//退出循环
					}
					else if (m.x > 200 && m.x < 400 && map[1][1] == 'w')//在第5个格子
					{
						map[1][1] = 'b';
						exit = 1;//退出循环
					}
					else if (m.x > 400 && m.x < 600 && map[1][2] == 'w')//在第6个格子
					{
						map[1][2] = 'b';
						exit = 1;//退出循环
					}
				}
				else if (m.y < 600 && m.y>400)//在第3排
				{
					if (m.x > 0 && m.x < 200 && map[2][0] == 'w')//在第7个格子
					{
						map[2][0] = 'b';
						exit = 1;//退出循环
					}
					else if (m.x > 200 && m.x < 400 && map[2][1] == 'w')//在第8个格子
					{
						map[2][1] = 'b';
						exit = 1;//退出循环
					}
					else if (m.x > 400 && m.x < 600 && map[2][2] == 'w')//在第9个格子
					{
						map[2][2] = 'b';
						exit = 1;//退出循环
					}
				}
				k = 0;
			}
			break;
		case WM_RBUTTONUP:// 按鼠标右键撤回将a变成w
			break;
		}
	}
}
void wordawin()//显示a赢文字存放于判断胜负函数
{
	setbkmode(TRANSPARENT);//显示透明文字
	settextcolor(BLUE);//设置字体颜色
	settextstyle(80, 0, _T("宋体"));
	outtextxy(80, 200, _T("蓝棋胜利"));
	w = 1;
	FlushBatchDraw();
}
void wordbwin()//显示b赢文字存放于判断胜负函数
{
	setbkmode(TRANSPARENT);//显示透明文字
	settextcolor(RED);//设置字体颜色
	settextstyle(80, 0, _T("宋体"));
	outtextxy(80, 200, _T("红棋胜利"));
	w = 1;
	FlushBatchDraw();
}
void wordwin()//显示
{
	setbkmode(TRANSPARENT);//显示透明文字
	settextcolor(GREEN);//设置字体颜色
	settextstyle(80, 0, _T("宋体"));
	outtextxy(80, 200, _T("平局"));
	FlushBatchDraw();
	Sleep(2000);
}
void panduanshengfu_a()//判断a的胜负函数存放于自动更新函数内
{
	if (map[0][0] == 'a' && map[0][1] == 'a' && map[0][2] == 'a')//1排a胜
	{
		wina = 1;
		wordawin();
		w = 1;
	}
	else if (map[1][0] == 'a' && map[1][1] == 'a' && map[1][2] == 'a')//2排a胜
	{
		wina = 1;
		wordawin();
		w = 1;
	}
	else if (map[2][0] == 'a' && map[2][1] == 'a' && map[2][2] == 'a')//3排a胜
	{
		wina = 1;
		wordawin();
		w = 1;
	}
	else if (map[0][0] == 'a' && map[1][0] == 'a' && map[2][0] == 'a')//1列a胜
	{
		wina = 1;
		wordawin();
		w = 1;
	}
	else if (map[0][1] == 'a' && map[1][1] == 'a' && map[2][1] == 'a')//2列a胜
	{
		wina = 1;
		wordawin();
		w = 1;
	}
	else if (map[0][2] == 'a' && map[1][2] == 'a' && map[2][2] == 'a')//3列a胜
	{
		wina = 1;
		wordawin();
		w = 1;
	}
	else if (map[0][0] == 'a' && map[1][1] == 'a' && map[2][2] == 'a')//左斜a胜
	{
		wina = 1;
		wordawin();
		w = 1;
	}
	else if (map[0][2] == 'a' && map[1][1] == 'a' && map[2][0] == 'a')//右斜a胜
	{
		wina = 1;
		wordawin();
		w = 1;
	}
}
void panduanshengfu_b()//判断b的胜负函数存放于自动更新函数内
{
	if (map[0][0] == 'b' && map[0][1] == 'b' && map[0][2] == 'b')//1排b胜
	{
		winb = 1;
		wordbwin();
		w = 1;
	}
	else if (map[1][0] == 'b' && map[1][1] == 'b' && map[1][2] == 'b')//2排b胜
	{
		winb = 1;
		wordbwin();
		w = 1;
	}
	else if (map[2][0] == 'b' && map[2][1] == 'b' && map[2][2] == 'b')//3排b胜
	{
		winb = 1;
		wordbwin();
		w = 1;
	}
	else if (map[0][0] == 'b' && map[1][0] == 'b' && map[2][0] == 'b')//1列b胜
	{
		winb = 1;
		wordbwin();
		w = 1;
	}
	else if (map[0][1] == 'b' && map[1][1] == 'b' && map[2][1] == 'b')//2列b胜
	{
		winb = 1;
		wordbwin();
		w = 1;
	}
	else if (map[0][2] == 'b' && map[1][2] == 'b' && map[2][2] == 'b')//3列b胜
	{
		winb = 1;
		wordbwin();
		w = 1;
	}
	else if (map[0][0] == 'b' && map[1][1] == 'b' && map[2][2] == 'b')//左斜b胜
	{
		winb = 1;
		wordbwin();
		w = 1;
	}
	else if (map[0][2] == 'b' && map[1][1] == 'b' && map[2][0] == 'b')//右斜b胜
	{
		winb = 1;
		wordbwin();
		w = 1;
	}
}
void updateautomation()	 // 自动更新
{
	panduanshengfu_a();//判断a赢的所有可能性
	panduanshengfu_b();//判断b赢的所有可能性
}
void gameover()		//游戏结束
{
	closegraph();
}
int main() // 主函数
{
	gamebegin();  	// 初始化
	if (mood == 1)//单人模式+++++++
	{
		while (true)       // 一直循环
		{
			gamebegin_1();  	// 二次初始化
			if (mood == 1)
			{
				while (1)
				{
					updateautomation(); // 与输入无关的更新(单双人都可目前的功能只负责判断胜负)
					if (w == 1) { Sleep(2000); break; }
					gameshow();  // 显示(单双人都可)
					if (q == 0) { wordwin(); break; }
					updatenotautomation_1();    // 与输入有关的更新_1代表单人模式
					Artificial_Intelligence();//人工智能函数——让ai与自己对弈,实现b堵截功能
				}
			}
			if (mood == 2)
			{
				while (1)
				{
					updateautomation(); // 与输入无关的更新(单双人都可目前的功能只负责判断胜负)
					if (w == 1) { Sleep(2000); break; }
					gameshow();  // 显示(单双人都可)
					if (q == 0) { Sleep(1000); break; }
					updatenotautomation_2();    // 与输入有关的更新_2代表双人
				}

			}
		}
	}
	else if (mood == 2)//双人模式++++++++
	{
		while (true)       // 一直循环
		{
			gamebegin_1();  	// 二次初始化
			if (mood == 2)
			{
				while (1)
				{
					updateautomation(); // 与输入无关的更新(单双人都可目前的功能只负责判断胜负)
					if (w == 1) { Sleep(2000); break; }
					gameshow();  // 显示(单双人都可)
					if (q == 0) { Sleep(1000); break; }
					updatenotautomation_2();    // 与输入有关的更新_2代表双人
				}

			}
			if (mood == 1)
			{
				while (1)
				{
					updateautomation(); // 与输入无关的更新(单双人都可目前的功能只负责判断胜负)
					if (w == 1) { Sleep(2000); break; }
					gameshow();  // 显示(单双人都可)
					if (q == 0) { wordwin(); break; }
					updatenotautomation_1();    // 与输入有关的更新_1代表单人模式
					Artificial_Intelligence();//人工智能函数——让ai与自己对弈,实现b堵截功能
				}
			}
		}
	}
	gameover();
	return 0;
}

  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论
以下是一个简单的 Java 井字棋小游戏代码示例: ```java import java.util.Scanner; public class TicTacToeGame { // 棋盘数组 private static char[][] board = new char[3][3]; // 当前玩家 private static char currentPlayer = 'X'; public static void main(String[] args) { initializeBoard(); displayBoard(); playGame(); } // 初始化棋盘 private static void initializeBoard() { for (int i = 0; i < 3; i++) { for (int j = 0; j < 3; j++) { board[i][j] = '-'; } } } // 显示棋盘 private static void displayBoard() { System.out.println("-------------"); for (int i = 0; i < 3; i++) { System.out.print("| "); for (int j = 0; j < 3; j++) { System.out.print(board[i][j] + " | "); } System.out.println(); System.out.println("-------------"); } } // 玩游戏 private static void playGame() { boolean gameFinished = false; while (!gameFinished) { System.out.println("当前玩家:" + currentPlayer); int row = getRow(); int column = getColumn(); if (board[row][column] != '-') { System.out.println("该位置已被占用,请重新输入!"); continue; } board[row][column] = currentPlayer; displayBoard(); if (checkWin()) { System.out.println("玩家 " + currentPlayer + " 获胜!"); gameFinished = true; } else if (checkTie()) { System.out.println("平局!"); gameFinished = true; } else { currentPlayer = (currentPlayer == 'X') ? 'O' : 'X'; } } } // 获取行数 private static int getRow() { Scanner scanner = new Scanner(System.in); System.out.print("请输入行数(0-2):"); int row = scanner.nextInt(); while (row < 0 || row > 2) { System.out.println("无效的输入,请重新输入!"); System.out.print("请输入行数(0-2):"); row = scanner.nextInt(); } return row; } // 获取列数 private static int getColumn() { Scanner scanner = new Scanner(System.in); System.out.print("请输入列数(0-2):"); int column = scanner.nextInt(); while (column < 0 || column > 2) { System.out.println("无效的输入,请重新输入!"); System.out.print("请输入列数(0-2):"); column = scanner.nextInt(); } return column; } // 检查是否获胜 private static boolean checkWin() { // 检查行 for (int i = 0; i < 3; i++) { if (board[i][0] == currentPlayer && board[i][1] == currentPlayer && board[i][2] == currentPlayer) { return true; } } // 检查列 for (int j = 0; j < 3; j++) { if (board[0][j] == currentPlayer && board[1][j] == currentPlayer && board[2][j] == currentPlayer) { return true; } } // 检查对角线 if (board[0][0] == currentPlayer && board[1][1] == currentPlayer && board[2][2] == currentPlayer) { return true; } if (board[0][2] == currentPlayer && board[1][1] == currentPlayer && board[2][0] == currentPlayer) { return true; } return false; } // 检查是否平局 private static boolean checkTie() { for (int i = 0; i < 3; i++) { for (int j = 0; j < 3; j++) { if (board[i][j] == '-') { return false; } } } return true; } } ``` 该代码使用一个二维字符数组 `board` 来存储棋盘,`X` 和 `O` 分别代表两个玩家。`initializeBoard` 方法用于初始化棋盘,`displayBoard` 方法用于显示当前棋盘状态,`playGame` 方法用于处理游戏逻辑,`getRow` 和 `getColumn` 方法用于获取玩家输入的行数和列数,`checkWin` 方法用于检查是否有玩家获胜,`checkTie` 方法用于检查是否平局。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

代码骑士

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值