TIC TAC TOE 井字游戏

C++ Tic Tac Toe Game Project is developed in C++ for class XI CBSE board students. Read the source code carefully to understand the working of this program.

函数checkwin();负责:判断游戏的进度 一方获胜、平局、对局仍在进行中。

函数board(); 负责绘制棋盘,和在每次玩家下定棋子之后,清一次屏幕 【system("cls"); 来实现】,然后重新显示更新过的。

知识点盲区:

1.c++ 中EOF的含义:

  1. EOF是end of file的缩写,表示”文字流”(stream)的结尾。这里的”文字流”,可以是文件(file),也可以是标准输入(stdin);

  2. EOF不是特殊字符,而是一个定义在头文件stdio.h的常量,一般等于-1。#define EOF (-1);

  3. 除了表示文件结尾,EOF还可以表示标准输入的结尾。但是,标准输入与文件不一样,无法事先知道输入的长度,必须手动输入一个字符,表示到达EOF。

2.cin.ignore() 无参数时:

  1. cin.ignore()函数是C++标准输入流(cin)中的一个方法。cin.ignore()函数中有两个参数,分别为数值型的a字符型的 ch ,即cin.ignore( a, ch )。 它表示从输入流 cin 中提取字符,提取的字符被忽略,不被使用。而每抛弃一个字符,它都要进行计数和比较字符:如果计数值达到 a 或者被抛弃的字符是 ch ,则cin.ignore() 函数执行终止;否则,它继续等待。

  2. 它的一个常用功能就是用来清除以回车结束的输入缓冲区的内容,消除上一次输入对下一次输入的影响。例如可以这么用,cin.ignore(1024, '\n'),通常把第一个参数设置得足够大,这样实际上是为了只有第二个参数 '\n' 起作用,所以这一句就是把回车(包括回车)之前的所以字符从输入缓冲流中清除出去。

  3. 如果默认不给参数的话,默认参数为cin.ignore(1, EOF),即把EOF前的1个字符清掉,没有遇到EOF就清掉一个字符然后结束。

3.cin.get():

[参考]  http://c.biancheng.net/view/1346.html 

1、与字符串输入一样,有时候使用 cin>> 读取字符也不会按我们想要的结果行事。 例如,因为它会忽略掉所有前导白色空格,所以使用 cin>> 就不可能仅输入一个空格或回车符。除非用户输入了空格键、制表符之外的其他字符,否则程序将不可能通过 cin 语句继续执行(一旦输入了这样的字符,在程序可以继续下一个语句之前,仍然需要按回车键)。因此,要求用户“按回车键继续”的程序,不能使用 >> 运算符只读取按回车键的行为。

在这些情况下,cin 对象有一个名为 get 的内置函数很有帮助。因为 get 函数是内置在 cin 对象中的,所以可称之为 cin 的一个成员函数。get 成员函数读取单个字符,包括任何白色空格字符。如果程序需要存储正在读取的字符,则可以通过以下任意一种方式调用 get 成员函数。

2、 在这两个例子中,假设 cin 是正被读入字符的 char 变量的名称:

 cin.get (ch);
ch = cin.get(); 

如果程序正在使用 get 函数简单地暂停屏幕直到按回车键,并且不需要存储字符,则该函数也可以这样调用:

 cin.get(); 
/*TIC TAC TOE 井字游戏*/

//知识盲区:
//1.  cin.get(无参数)没有参数主要是用于舍弃输入流中的不需要的字符,或者舍弃回车,
//    弥补cin.get(字符数组名,接收字符数目)的不足(因为cin.get()把换行符保留在输入缓冲区,可以用cin.get()来舍弃换行符)
//2.  如果cin.ignore()不给参数,则默认参数为cin.ignore(1,EOF),即把EOF前的1个字符清掉.


#include<iostream>
using namespace std;
//定义一个全局char类型的变量
char square[10] = { '0','1', '2', '3', '4', '5', '6', '7', '8', '9' };

int checkwin();
void board();

int main()
{
    int player = 1, i, choice;
    char mark;
    do 
    {
        board();
        player = (player % 2) ? 1 : 2;//判断该玩家1走;还是玩家2走。

        cout << "player" << player << ",enter a number:" ; //棋子放下的位置
        cin >> choice;

        mark = (player == 1) ? 'x' : 'o'; //玩家1的棋子用x表示;玩家二棋子用o表示

        //接下来,玩家1,2开始下棋。棋子落下时,该位置就变成响应玩家棋子的代表符号
        if (choice == 1 && square[1] == '1')
            square[1] = mark;
        else if (choice == 2 && square[2] == '2')
            square[2] = mark;
        else if (choice == 3 && square[3] == '3')
            square[3] = mark;
        else if (choice == 4 && square[4] == '4')
            square[4] = mark;
        else if (choice == 5 && square[5] == '5')
            square[5] = mark;
        else if (choice == 6 && square[6] == '6')
            square[6] = mark;
        else if (choice == 7 && square[7] == '7')
            square[7] = mark;
        else if (choice == 8 && square[8] == '8')
            square[8] = mark;
        else if (choice == 9 && square[9] == '9')
            square[9] = mark;
        
        else //如果某个位置有其他玩家下落过棋子,则当前玩家不能下在这里 
        {
            cout << "Invalid move,please choice the right postion!" << endl;
            player--; //因为要让该玩家重新输入,所以这里先减1,下面还要执行 player++;在加1.这样就相当于没加没减,还是原来的玩家。
            cin.ignore(); //忽略掉此次输入的数choice。
            cin.get();  //当键入enter键时,才会运行下面的代码

        }

        player++;
        i = checkwin();
       

    } while (i==-1); //不要写成i=-1,这里是一个条件,而不是赋值。


    board();
    if (i == 1)

        cout << "==>\aPlayer " << --player << " win ";
    else
        cout << "==>\aGame draw";

   
    cin.ignore();
    cin.get();
    return 0;

}



int checkwin()  //返回1,表示游戏结束,有一方赢了;返回0,表示两人平局;返汇-1,表示游戏正在进行
{
    if (square[1] == square[2] && square[2] == square[3])
        return 1;
    else if (square[4] == square[5] && square[5] == square[6])
        return 1;
    else if (square[7] == square[8] && square[8] == square[9])
        return 1;
    else if (square[1] == square[4] && square[4] == square[7])
        return 1;
    else if (square[2] == square[5] && square[5] == square[8])
        return 1;
    else if (square[3] == square[6] && square[6] == square[9])
        return 1;
    else if (square[1] == square[5] && square[5] == square[9])
        return 1;
    else if (square[3] == square[5] && square[5] == square[7])
        return 1;

    else if (square[1] != '1' && square[2] != '2' && square[3] != '3'
        && square[4] != '4' && square[5] != '5' && square[6] != '6'
        && square[7] != '7' && square[8] != '8' && square[9] != '9')
        return 0;
    else
        return -1;

}



/*绘制棋盘功能*/
void board()
{
    //执行控制台命令cls,就是CMD下面的cls,功能是清屏,清除所有显示的信息。
    system("cls"); 

    cout << "\n\n\tTic Tac Toe\n\n" << endl;

    cout << "player 1(x) - player 2 (o)" << endl << endl;
    cout << endl;

    //制作井字格
    cout << "     |     |     " << endl;
    cout << "  " << square[1] << "  |  " << square[2] << "  |  " << square[3] << "  " << endl;
    cout << "_____|_____|_____" << endl;
    cout << "     |     |     " << endl;
    cout << "  " << square[4] << "  |  " << square[5] << "  |  " << square[6] << "  " << endl;
    cout << "_____|_____|_____" << endl;
    cout << "     |     |     " << endl;
    cout << "  " << square[7] << "  |  " << square[8] << "  |  " << square[9] << "  " << endl;
    cout << "     |     |     " << endl;


}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值