Easyx-----c++实现控制台井字棋简单人机对弈

 main.cpp

#include"TicTacToe.h"
int main() 
{
	Game game;
	game.getWinner();
	return 0;
	
}

 TicTacToe.h

#pragma once
#include<iostream>
using namespace std;
#include<array>
#include<ctime>
class Game
{
public:
	Game();
	void print();
	char getCurrentPlayer();
	void getWinner();
	bool isDone(int row,int col);
	void makeMove();
	void computer_move(int row, int col);
protected:

	array <array< char, 3 >, 3 > board;
	int row;
	int col;
};

TicTacToe.cpp

#include"TicTacToe.h"
Game::Game()
{
	for (int i = 0; i < 3; i++)
	{
		for (int j = 0; j < 3; j++)
		{
			board[i][j] = '-';
		}
	} 
	this->col = 3;
	this->row = 3;
}

void Game::print()
{
	cout << "\t1\t2\t3\n";
	for (int i = 0; i < 3; i++)
	{

		cout << i + 1;
		for (int j = 0; j < 3; j++)
		{
			cout << "\t";
			cout << board[i][j];
		}
		cout << endl;
	}
}


char Game::getCurrentPlayer()
{

	int i = 0;
	for (; i < 3; i++)//判断第i行是否全都相同
	{
		if (board[i][0] == board[i][1] && board[i][1] == board[i][2] && board[i][0] != '-')
			return board[i][0];//将第i行的内容返回
	}
	for (i = 0; i < 3; i++)//判断第i列是否全都相同
	{
		if (board[0][i] == board[1][i] && board[1][i] == board[2][i] && board[0][i] != '-')
			return board[0][i];//将第i列的内容返回
	}
	if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[0][0] != '-')//判断捺对角线(\)的内容是否全都相同
		return board[0][0];
	else if (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[0][2] != '-')//判断撇对角线(/)的内容是否全都相同
		return board[0][2];
	else if (isDone(row,col))//判断是否是平局,如果是平局返回‘q’
		return 'q';
	else //判断是否还未产生游戏结果,如果还未产生游戏结果返回‘-’
		return '-';
}

void Game::getWinner()
{
	char a;
		do
		{
			print();						//屏幕上打印一个棋盘
			makeMove();						//打印出棋盘之后,玩家开始下棋
			a = getCurrentPlayer();		    //玩家下完棋后,开始判断游戏结果
			if (a != '-')				    //  ‘-’:没人赢
			{
				break;						//如果已经分出胜负,跳出循环
			}
			computer_move(row,col);			//如果没有分出胜负,电脑下棋
			a = getCurrentPlayer();			//下完之后判断游戏结果
		} while (a == '-');
		if (a == 'X')						//判断玩家是否获胜:‘x’代表玩家获胜
			printf("Congratulations,you win!\n");
		else if (a == 'O')					//判断玩家是否获胜:‘o’代表电脑获胜
			printf("It's too bad,you lose!\n");
		else								//判断是否是平局
			printf("Draw!\n");
}

bool Game::isDone(int row,int col)
{

	//判断数组当中每一个元素是否有'-',如果有'-',说明没有满,返回0;否则返回1
	int i, j;
	for (i = 0; i < row; i++)
	{
		for (j = 0; j < col; j++)
			if (board[i][j] == '-')	//判断是否有'-'
				return 0;			//有'-'返回0
	}
	return 1;						//没有'-'返回1
}

void Game::makeMove()
{

		int x, y;//先定义两个变量,以便接收玩家下棋的坐标
		do
		{
			printf("Please input your coordinate:(x,y)!");//提示玩家下棋
			scanf("%d%d", &x, &y);						  //接收玩家所下的位置
			if (x >= 1 && x <= 3 && y >= 1 && y <= 3)	  //判断玩家输入坐标是否有误
				if (board[x - 1][y - 1] == '-')			  //判断玩家输入的位置是否已经被占
				{
					board[x - 1][y - 1] = 'X';			  //将玩家输入的位置用‘x’占用
					break;
				}
				else//玩家输入位置被占,提示玩家重新输入位置
					printf("Error!This place was be used!\n");
			else//玩家输入坐标有误,直接提示玩家error
				printf("Error!");
		} while (1);
	
}
void Game::computer_move(int row,int col)
{
	srand((unsigned long)time(NULL));//利用函数生成随机数
	do
	{
		int x = rand() % row;//控制随机数小于3并把结果赋给横坐标
		int y = rand() % col;//控制随机数小于3并把结果赋给纵坐标
		if (board[x][y] == '-')//判断电脑选择的位置是否被占
		{
			board[x][y] = 'O';//将电脑下棋的位置用‘O’占用
			break;
		}
	} while (1);
}
  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
Nicholl-Lee-Nicholl(NLN)算法是一种线段裁剪算法,用于在计算机图形学中将线段裁剪到指定的窗口或视口中。它是一种快速而有效的算法,通常用于实时应用程序。 以下是使用C++和EasyX图形库实现NLN算法的代码: ```cpp #include <graphics.h> #include <iostream> using namespace std; // 定义 NLN 算法所需的几个数据结构 struct Point { int x; int y; }; struct Edge { Point p1; Point p2; float dx; float dy; }; struct Window { int left; int top; int right; int bottom; }; // 定义 NLN 算法函数 void NLN(Edge edge, Window window) { float t1 = 0, t2 = 1; float dx = edge.dx; float dy = edge.dy; // 判断线段是否在窗口内 if (dx == 0) { if ((edge.p1.x < window.left) || (edge.p1.x > window.right)) return; } else { float m = dy / dx; float c = edge.p1.y - m * edge.p1.x; float tleft = (window.left - c) / m; float tright = (window.right - c) / m; if (dx > 0) { if (tleft > t1) t1 = tleft; if (tright < t2) t2 = tright; } else { if (tleft < t2) t2 = tleft; if (tright > t1) t1 = tright; } } if (dy == 0) { if ((edge.p1.y < window.top) || (edge.p1.y > window.bottom)) return; } else { float m = dx / dy; float c = edge.p1.x - m * edge.p1.y; float ttop = (window.top - c) / m; float tbottom = (window.bottom - c) / m; if (dy > 0) { if (ttop > t1) t1 = ttop; if (tbottom < t2) t2 = tbottom; } else { if (ttop < t2) t2 = ttop; if (tbottom > t1) t1 = tbottom; } } // 判断线段是否被裁剪 if (t1 <= t2) { Point new_p1, new_p2; new_p1.x = edge.p1.x + t1 * dx; new_p1.y = edge.p1.y + t1 * dy; new_p2.x = edge.p1.x + t2 * dx; new_p2.y = edge.p1.y + t2 * dy; // 绘制裁剪后的线段 line(new_p1.x, new_p1.y, new_p2.x, new_p2.y); } } int main() { // 创建图形窗口 initgraph(640, 480); // 绘制窗口边框 setcolor(WHITE); rectangle(100, 100, 500, 400); // 定义窗口和线段数据 Window window = {100, 100, 500, 400}; Edge edge = {{50, 200}, {600, 200}, 0, 0}; // 计算线段裁剪后的结果并绘制 NLN(edge, window); // 关闭图形窗口 getch(); closegraph(); return 0; } ``` 以上代码中,我们首先定义了三个数据结构:`Point` 代表点的坐标,`Edge` 代表线段的两个端点,以及 `Window` 代表窗口的大小。 然后,我们实现了 `NLN` 函数,该函数接受一个线段和一个窗口作为输入,并计算线段在窗口内的裁剪结果。该函数的实现基于 NLN 算法的基本原理,即通过计算线段与窗口之间的交点来裁剪线段。 最后,我们在 `main` 函数中使用 `NLN` 函数计算线段的裁剪结果,并绘制在图形窗口中。在绘制之前,我们还绘制了一个矩形边框来表示窗口的大小。 运行程序后,将看到裁剪后的线段仅在窗口内被绘制,而窗口外的部分被裁剪掉了。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

qiuqiuyaq

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

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

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

打赏作者

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

抵扣说明:

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

余额充值