C/C++ 井字棋 (三子棋)

目录

井字棋

一、实现思路

函数

二、代码

        play函数

game函数

        InitChessBoard 函数 

        printChessBoard函数

        playerChess函数

        comChess函数

        isOver函数

        is_full函数

三、结果

WIN

LOSE 

DRAW


井字棋

        本文用C/C++,杠杠单单地实现下井字棋。

一、实现思路

规则:玩家先手下棋,电脑随机下棋。每下一步棋进行判断是否结束。

函数

InitChessBoard 函数 :初始化棋盘,棋盘数组每个元素都初始化为0。

printChessBoard函数:打印棋盘。

playerChess函数:玩家下棋,获取下棋坐标。

comChess函数:电脑下棋,生成随机数,下在合法的地方。

isOver函数:判断是否结束,可能赢可能输可能平局。

is_full函数:判断棋盘是否满了,用来判断平局。

二、代码

        1、头文件

                这里把表示空白,X棋,O棋进行了宏定义,方便需要时修改。

#include <iostream>
using namespace  std;
#define ROW 3
#define COL 3
#define BLANK '_'
#define PLAYER 'O'
#define COMPUTER 'X'
void InitChessBoard(int ChessBoard[ROW][COL]);

void printChessBoard(int ChessBoard[ROW][COL]);

void playerChess(int ChessBoard[ROW][COL]);

void comChess(int ChessBoard[ROW][COL]);

int isOver(int ChessBoard[ROW][COL]);

int is_full(int ChessBoard[ROW][COL]);


play函数

        主菜单

void play() {
    srand(time(NULL));
    int input;
    do {
        cout << "1.game" << endl << "0.quit" << endl;
        cin >> input;
        switch (input)
        {
        case 1:
            game();
            break;
        case 0:
            cout << "退出";
            break;
        default:
            break;
        }
    } while (input);
}

game函数

        整体逻辑

void game() {
    int ChessBoard[3][3] = { 0 };
    int ret=0;
    //初始化打印
    printChessBoard(ChessBoard);
    while (1) {
        //玩家下棋
        playerChess(ChessBoard);
        printChessBoard(ChessBoard);
        ret = isOver(ChessBoard);
        if (ret) break;
        //电脑下棋
        comChess(ChessBoard);
        printChessBoard(ChessBoard);
        ret = isOver(ChessBoard);
        if (ret) break;
    }
    switch (ret)
    {
    case 1:
        cout << "YOU WIN !"<<endl;
        break;
    case 2:
        cout << "COM WIN !"<<endl;
        break;
    case 3:
        cout << "平局";
        break;
    default:
        break;
    }
}

InitChessBoard 函数 

        初始化二维数组全为0,表示全空。1为玩家棋子,2为电脑棋子。

//初始化
void InitChessBoard(int ChessBoard[ROW][COL]) {
	for (int i = 0; i < ROW; i++) {
		for (int j = 0; j < COL; j++) {
			ChessBoard[i][j] = 0;
		}
	}
}

printChessBoard函数

        打印数组对应状态的格子

        也可以一开始用char 存每个字符,而不是用int数组来判断。

//打印
void printChessBoard(int ChessBoard[ROW][COL]) {
	system("cls");
	//根据棋子种类决定打印什么
	char chess;
	for (int i = 0; i < ROW; i++) {
		for (int j = 0; j < COL; j++) {
			chess = ChessBoard[i][j]==0? BLANK: (ChessBoard[i][j]==1?PLAYER:COMPUTER);
			cout << chess<<' ';
		}
		cout << endl;
	}
}

playerChess函数

        获取玩家输入x y 坐标,判断是否合法。

//玩家下棋
void playerChess(int ChessBoard[ROW][COL]) {
	int x, y;
	do {
		cin >> y >> x;//倒置
		x--, y--;//为了让玩家从(1,1)开始

        //判断是否合法
		if (x >=ROW || x < 0 || y < 0 || y>=COL) {
			cout << "非法坐标"<<endl;
			continue;
		}
		if (ChessBoard[x][y]) {
			cout << "重复"<<endl;
			continue;
		}
		break;
	} while (1);//重新

	ChessBoard[x][y] = 1;

}

comChess函数

        生成x,y  随机数(0-2)直到合法(不重复)

//电脑下棋
void comChess(int ChessBoard[ROW][COL]) {
	int x, y;
	do {
		x = rand() % ROW;  //%ROW 取从0到ROW的数
		y = rand() % COL;
		if (ChessBoard[x][y])	continue;
		break;
	} while (1);
	ChessBoard[x][y] = 2;

}

isOver函数

        横竖判断,斜着判断3个是否相同:第一个是否等于第二个,第二个是否等于第三个,且不等于0。相同时返回对应的值,表示是谁赢。

//赢局判断
int isOver(int ChessBoard[ROW][COL]) {
	//横竖判断
	for (int i = 0; i < ROW; i++) {
		if (ChessBoard[i][0] == ChessBoard[i][1] && ChessBoard[i][1] == ChessBoard[i][2] && ChessBoard[i][0] != 0)
			return ChessBoard[i][0];
	}
	for (int i = 0; i < COL; i++) {
		if (ChessBoard[0][i] == ChessBoard[1][i] && ChessBoard[1][i] == ChessBoard[2][i] && ChessBoard[0][i] != 0)
			return ChessBoard[0][i];
	}
	//斜着判断
	if (ChessBoard[0][0] == ChessBoard[1][1] && ChessBoard[2][2] == ChessBoard[1][1] && ChessBoard[1][1] != 0)
		return ChessBoard[1][1];
	if (ChessBoard[2][0] == ChessBoard[1][1] && ChessBoard[0][2] == ChessBoard[1][1] && ChessBoard[1][1] != 0)
		return ChessBoard[1][1];

	//平局判断
	if (is_full(ChessBoard))
		return 3;

	//都不满足
	return 0;
}

is_full函数

        遍历棋盘,遇到空白说明没满。

//判断是否满了
int is_full(int ChessBoard[ROW][COL]) {
	for (int i = 0; i < ROW; i++) {
		for (int j = 0; j < COL; j++) {
			if (!ChessBoard[i][j])  //遇到0返回0,说明还有空白
				return 0;
		}
	}
	//满了,返回1
	return 1;
}

三、结果

WIN

LOSE 

        

DRAW

  • 5
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值