人输入坐标玩五子棋(与电脑对抗)

人输入坐标,与电脑对抗(电脑是随机下子的,没实现人工智能)

代码如下:

#include <iostream>
//设置随机数的头文件
#include <cstdlib>
#include <ctime>
using namespace std;

const int length = 7;   //全局变量,棋盘的长与宽,可调整
int function(char a[length][length],char letter);   //函数原型声明

int main()
{
	cout << "---Game of Chess---" << endl << endl;
	cout << "Human against the Computer" << endl;

	char a[length][length];
	int i, j, h1, h2, judge;
	char letter;

	//给二维数组赋*
	for (i = 0; i<length; ++i)
	{
		for (j = 0; j<length; ++j)
		{
			a[i][j] = '*';
		}
	}

	//输出棋盘
	for (i = 0; i<length; ++i)
	{
		for (j = 0; j<length; ++j)
		{
			cout << a[i][j] << '\t';
			if (j == 6) cout << endl << endl;
		}
	}

number1:
	cout << "Enter X,Y coordinates for your move:";
	
	//人下子
	cin >> h1 >> h2;
	a[h1 - 1][h2 - 1] = 'H';

	//注意,每下完一步就要判断是否赢
	
	//1.判断人是否赢
	letter = 'H';   //标识符,让函数知道判断的是谁
	judge = function(a, letter);   //注意传递数组时,不用写数组长宽,直接写数组名即可
	if (judge==1)
	{
		//若赢,打印出最终的棋盘
		for (i = 0; i<length; ++i)
		{
			for (j = 0; j<length; ++j)
			{
				cout << a[i][j] << '\t';
				if (j == 6) cout << endl << endl;
			}
		}
		cout << endl << "Human win!" << endl;
		system("pause");
		return 0;   //若赢,程序结束
	}
	
	//电脑下子
number0:
	srand((unsigned)time(NULL));
	h1 = rand() % length ;
	h2 = rand() % length ;   //因为不会写人工智能,所以用随机数下子
	
	cout << h1 << " " << h2 << endl;
	
	if (a[h1][h2] == 'H') goto number0;   //注意不能用a[i - 1][j - 1],因为若有0,则变成负数了
	else if (a[h1][h2] == 'C') goto number0;   //注意不能写成if (a[h1][h2] == 'H'|'C'),因为会短路求值
	else a[h1][h2] = 'C';

	//2.判断电脑是否赢
	letter = 'C';
	judge = function(a, letter);
	if (judge == 1)
	{
		for (i = 0; i<length; ++i)
		{
			for (j = 0; j<length; ++j)
			{
				cout << a[i][j] << '\t';
				if (j == 6) cout << endl << endl;
			}
		}
		cout << endl << "Computer win!" << endl;
		system("pause");
		return 0;  
	}
	
	//若未分出胜负,先打印这一次的棋盘结果,再goto回循环
	for (i = 0; i<length; ++i)
	{
		for (j = 0; j<length; ++j)
		{
			cout << a[i][j] << '\t';
			if (j == 6) cout << endl << endl;
		}
	}
	goto number1;

	return 0;
}

int function(char a[length][length], char letter)
{
	int i, j;
	const char character=letter;

	//情况1:横着
	for (i = 0; i<length; ++i)
	{
		for (j = 0; j<length; ++j)
		{
			if (a[i][j] == '*') break;   //没下过的地方不予考虑
			if (j > length - 5) break;   //那行剩下的不足以凑成5子,故跳出
			if ((a[i][j] == character)&(a[i][j + 1] == character)&(a[i][j + 2] == character)&(a[i][j + 3] == character)&(a[i][j + 4] == character)) return 1;
		}
	}

	//情况2:竖着
	for (j = 0; j<length; ++j)
	{
		for (i = 0; i<length; ++i)
		{
			if (a[i][j] == '*') break;   //没下过的地方不予考虑
			if (i > length - 5) break;   //那列剩下的不足以凑成5子,故跳出
			if ((a[i][j] == character)&(a[i + 1][j] == character)&(a[i + 2][j] == character)&(a[i + 3][j] == character)&(a[i + 4][j] == character)) return 1;
		}
	}
	
	//情况3:右下斜着
	for (i = 0; i<length; ++i)
	{
		for (j = 0; j<length; ++j)
		{
			if (a[i][j] == '*') break;   //没下过的地方不予考虑
			if ((i + 4 >= length)|(j + 4 >= length)) break;   //排除超出的情况
			if ((a[i][j] == character)&(a[i + 1][j + 1] == character)&(a[i + 2][j + 2] == character)&(a[i + 3][j + 3] == character)&(a[i + 4][j + 4] == character)) return 1;
		}
	}
	
	//情况4:左上斜着
	for (i = 6; i>=0; --i)
	{
		for (j = 0; j<length; ++j)
		{
			if (a[i][j] == '*') break;   //没下过的地方不予考虑
			if ((i - 4 <= 0) | (j + 4 >= length)) break;   //排除超出的情况
			if ((a[i][j] == character)&(a[i - 1][j + 1] == character)&(a[i - 2][j + 2] == character)&(a[i - 3][j + 3] == character)&(a[i - 4][j + 4] == character)) return 1;
		}
	}

	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
题目:五子棋对弈 对弈规则如下: 主要功能是实现两人之间的对弈,在画好的棋盘上,两个家轮流选择自己的落子坐标,然后由五子棋系统自动识别判断游戏的进展,知道一方的五子连成一条线或者棋盘已经无法落子时游戏结束。 选定五子棋的棋盘大小为19*19,家可以在这个棋盘上选择落子坐标位置,通过在棋盘上显示不同的符号来代替不同家所下的棋子,“o”代表A家,“*”代表B家。家每次落子之后游戏系统都会对落子位置进行检查,如果落子坐标输入有错应提示错误,并要求家继续输入。 当出现同一家五子连成一线时,无论是行、列或是对角线的五子连线,都表示家游戏胜利,退出游戏 任务:编程实现以下功能 1. 欢迎主界面 提示家选择游戏开始,结束,设置悔棋次数等。 2. 绘制棋盘 该模块要求的功能是实现棋盘的显示及棋子的显示,,“o”代表A家,“*”代表B家。在每次下棋后要对棋盘进行刷新,将棋盘的状态变化为当前最新状态,然后等待另一个家下棋。 3. 家交替下棋 家能在棋盘上下棋,家每次选择好下棋的行和列坐标,并在该位置落子。 要求:a.提示当前输入落子坐标 b.能判断用户输入坐标是否正确(坐标超出范围或该处已有棋子) 4. 悔棋功能 家选择悔棋后刷新棋盘,删除前一次的落子,悔棋次数有限制。 5. 输赢判断 判断输赢模块的作用是每次家落子后判断是否已分出胜负,如果是,则返回胜利者相关信息。 6. 设计丰富的用户界面,方便用户操作 设计要求: ① 根据以上功能需求,自己定义合适的数据结构,并说明原因; ② 每个功能能提供友好的用户界面,方便用户操作。
数据结构习题:已知两人分别执白棋和黑棋在一个围棋棋盘上下五子棋,若同一颜色的棋子在同一条横行、纵行或斜线上连成5个棋子,则执该颜色棋子的人获胜。编程序读入某一时刻下棋的状态,并判断是否有人即将获胜,即:同一颜色的棋子在同一条横行、纵列或斜线上连成4个棋子,且该4个棋子的两端至少有一端为空位置。 输入的棋盘大小是19×19,用数字0表示空位置(即没有棋子),用数字1表示该位置下了一白色棋子,用数字2表示该位置下了一黑色棋子。假设同一颜色的棋子在同一条横行、纵列或斜线上连成的棋子个数不会超过4个,并且最多有一人连成线的棋子个数为4。 【输入形式】 从控制台输入用来表示棋盘状态的数字0、1或2;每行输入19个数字,各数字之间以一个空格分隔,每行最后一个数字后没有空格;共输入19行表示棋盘状态的数字。 【输出形式】 若有人即将获胜,则先输出即将获胜人的棋子颜色(1表示白色棋子,2表示黑色棋子),然后输出英文冒号:,最后输出连成4个棋子连线的起始位置(棋盘横行自上往下、纵列自左往右从1开始计数,横行最小的棋子在棋盘上的横行数和纵列数作为连线的起始位置,若在同一行上,则纵列数最小的棋子位置作为起始位置,两数字之间以一个英文逗号,作为分隔符)。 若没有人获胜,则输出英文字符串:No。 无论输出什么结果,最后都要有回车换行符。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值