C++实现井字棋小游戏(写得不好,留作纪念!!!)

Posted Wecccccccc

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++实现井字棋小游戏(写得不好,留作纪念!!!)相关的知识,希望对你有一定的参考价值。

回宿舍路上,同学问起我能不能用C++写个五子棋游戏,我说应该挺简单的,但是我不会写,然后他说不用写五子棋,就写井字棋吧!!!我说试试吧!!!
(不过说实话,写得不是很好,留作纪念吧!!!)

代码如下:

#include <iostream>
using namespace std;
const int N = 5;
bool vis[N][N] = { false };
bool tttSon[N][N] = { false };
char tttDesk[N][N];
int dx[] = { 1,-1,1,-1,0,0,1,-1 };
int dy[] = { 0,0, 1,-1,1,-1,-1,1 };
bool isEnd = false;

void printError()
{
	cout << "无效输入,按任意键后,重新输入" << endl;
}

void initDesk()
{
	for (int i = 1; i <= 3; i++)
		for (int j = 1; j <= 3; j++)
			tttDesk[i][j] = '@';
}

void printInterface(char son)
{
	int flagX = 0, flagY = 0;
	for (int i = 1; i <= 3; i++)
	{
		for (int j = 1; j <= 3; j++)
		{
			cout << vis[i][j] << " ";
			if (vis[i][j])
			{
				flagX = i;
				flagY = j;
			}
		}
		cout << endl;
	}
	cout << "当前要落的子为:" << son << endl;
	cout << "当前光标的位置在第" << flagX << "行," << "第" << flagY << "列" << endl;
	cout << "-------------------------------------" << endl;

	for (int i = 1; i <= 3; i++)
	{
		for (int j = 1; j <= 3; j++)
		{
			cout << tttDesk[i][j] << " ";
		}
		cout << endl;
	}
}

void checkPos(int &sonX,int &sonY)
{
	for (int i  =1;i<=3;i++)
		for (int j = 1; j <= 3; j++)
		{
			if (!tttSon[i][j])
			{
				sonX = i;
				sonY = j;
				vis[sonX][sonY] = true;
				return;
			}
		}
}




bool checkWinOfDfs(int x, int y,int step,char me,int k)
{
	if (step == 3) return true;
	int xx = x + dx[k];
	int yy = y + dy[k];
	if (xx < 1 || xx > 3 || yy < 1 || yy > 3 || tttDesk[xx][yy] != me || tttDesk[xx][yy]=='@') return false;
	/*cout << xx << " " << yy << endl;*/
	checkWinOfDfs(xx, yy, step + 1, me, k);

}


void operatorDesk(int &sonX,int &sonY,char &son)
{
	char sonIng;
	bool flag = false;
	initDesk();
	int cnt = 0;
	while (true)
	{
		bool winFlag = false;
		if (cnt > 4 && tttDesk[sonX][sonY]!='@')
		{
			/*cout << sonX << " " << sonY << endl;*/
			for (int k = 0; k < 8; k++)
			{
				if (checkWinOfDfs(sonX, sonY, 1, tttDesk[sonX][sonY], k))
				{
					winFlag = true;
				}
				if (winFlag)
				{
					if (tttDesk[sonX][sonY]=='O')
					cout << "Winer is O" << endl;
					else cout << "Winer is X" << endl;
					isEnd = true;
					return;
				}
			}
			int cnt1 = 0;
			for (int i = 1;i<=3;i++)
				for (int j = 1; j <= 3; j++)
				{
					if (tttSon[i][j]) cnt1++;
				}
			if (cnt1 == 9) return;
		}
		if (!flag)
		checkPos(sonX,sonY);
		printInterface(son);
		cout << "请输入指令" << endl;
		cin >> sonIng;
		if (sonIng == 'w' || sonIng == 'W')
		{
			if (sonX - 1 < 1 )
			{
				printError();
				system("pause");
				system("cls");
				continue;
			}
			flag = true;
			vis[sonX][sonY] = false;
			sonX -= 1;
			vis[sonX][sonY] = true;
			system("cls");
		}
		else if (sonIng == 's' ||sonIng == 'S')
		{
			if (sonX + 1 > 3 )
			{
				printError();
				system("pause");
				system("cls");
				continue;
			}
			flag = true;
			vis[sonX][sonY] = false;
			sonX += 1;
			vis[sonX][sonY] = true;
			system("cls");
		}
		else if (sonIng == 'a'|| sonIng == 'A')
		{
			if (sonY - 1 < 1 )
			{
				printError();
				system("pause");
				system("cls");
				continue;
			}
			flag = true;
			vis[sonX][sonY] = false;
			sonY -= 1;
			vis[sonX][sonY] = true;
			system("cls");
		}
		else if (sonIng == 'd' || sonIng=='D')
		{
			if (sonY + 1 > 3 )
			{
				printError();
				system("pause");
				system("cls");
				continue;
			}
			flag = true;
			vis[sonX][sonY] = false;
			sonY += 1;
			vis[sonX][sonY] = true;
			system("cls");
		}
		else if (sonIng == 'g' || sonIng == 'G')
		{
			if (tttSon[sonX][sonY])
			{
				printError();
				system("pause");
				system("cls");
				continue;
			}
			cnt++;
			tttSon[sonX][sonY] = true;
			vis[sonX][sonY] = false;
			flag = false;
			tttDesk[sonX][sonY] = son;
			if (son == 'O') son = 'X';
			else son = 'O';
			system("cls");
		}
		else
		{
			printError();
			system("pause");
			system("cls");
			continue;
		}
	}
}

void PrintGame()
{
	cout << "----------------------" << endl;
	cout << "----简略井字棋游戏----" << endl;
	cout << "----------------------" << endl;
	cout << "------游戏说明--------" << endl;
	cout << "---按下G键开始游戏----" << endl;
	cout << "--通过W键控制光标上移-" << endl;
	cout << "-通过S键控制光标下移--" << endl;
	cout << "--通过A键控制光标左移-" << endl;
	cout << "--通过D键控制光标右移-" << endl;
	cout << "------通过G键落子-----" << endl;
	cout << "----------------------" << endl;
	cout << "----------------------" << endl;
}

int main()
{
	char son = 'O';
	int  sonX = 1, sonY = 1;
	while (true)
	{
		char gameStart;
		PrintGame();
		cin >> gameStart;
		if (gameStart == 'G' || gameStart == 'g')
		{
			system("cls");
			break;
		}
		else
		{
			cout << "输入错误!!!,请重新输入" << endl;
			system("pause");
			system("cls");
		}
	}

	operatorDesk(sonX, sonY,son);
	if (!isEnd)
	{
		cout << "平局!!!" << endl;
	}
	return 0 ;
}

以上是关于C++实现井字棋小游戏(写得不好,留作纪念!!!)的主要内容,如果未能解决你的问题,请参考以下文章

基于C++的井字棋小游戏(使用数组搭建)

C语言实现井字棋小游戏

关于三子棋(井字棋)小游戏

小时候玩过的三子棋(井字棋),你还记得吗?C语言实现简单的三子棋小游戏

C语言实现三子棋(井字棋)

C语言实现井字棋