﻿#----------------------------------------------------------------------------
# Purpose: To demonstrate programming in natural language.
# Version: Thinknowlogy 2018r4 (New Science)
#----------------------------------------------------------------------------
# Copyright (C) 2009-2018, Menno Mafait. Your suggestions, modifications,
# corrections and bug reports are welcome at http://mafait.org/contact/
#----------------------------------------------------------------------------

#----------------------------------------------------------------------------
# 屏風式四子棋（Connect Four），簡稱四子棋，是Howard Wexler在1974年推出的連棋類遊戲。
# 兩人在對弈屏風式四子棋
#----------------------------------------------------------------------------
# 棋具
#
#     棋盤採用豎立的扁長方體盒子，內部分有七隔，上面有七個開口，可供棋子落入。
#     棋盤兩面有六行七列四十二個圓形透孔，可供玩家觀察棋子位置。
#     棋子扁圓狀，直徑略大於透孔，以兩色區分敵我，各二十一枚。
#
# 棋規則
#
#     雙方必須輪流把一枚己棋投入開口，讓棋子因地心引力落下在底部或其他棋子上。
#
#     當己方四枚棋子以縱、橫、斜方向連成一線時獲勝。
#
#     棋盤滿棋時，無任何連成四子，則平手。
#----------------------------------------------------------------------------
# 请参阅全文: https://zh.wikipedia.org/wiki/%E5%B1%8F%E9%A2%A8%E5%BC%8F%E5%9B%9B%E5%AD%90%E6%A3%8B
#----------------------------------------------------------------------------

# Initial definitions.
每个轮到都是你的或我的。
每个选择都是A、B、C、D、E、F或G。
每个解决方案水平都是低或高。

# Solve the problem.
如果该选择是已分配和该轮到是已分配那么如果该解决方案的方法不是忙、该解决方案的方法不是完成了和该游戏不是平局的那么该选择是空的和解决该游戏否该选择是空的和该解决方案的方法不是完成了。

# Invert the solve method.
如果该选择是已分配和该轮到是已分配那么如果该解决方案的方法不是忙或该解决方案的方法不是完成了那么如果该解决方案的方法是倒那么该解决方案的方法不是倒否该解决方案的方法是倒。

# Display the turn.
如果该轮到是已分配那么如果该解决方案的方法不是完成了或该解决方案的方法是完成了、该游戏是已分配和该游戏不是无效那么如果该轮到是你的那么呈现"\n轮到你了。\n\n"。

# Alternate the turn.
如果该选择是已分配、该轮到是已分配和该游戏不是已分配那么如果该解决方案的方法不是忙或该解决方案的方法不是完成了那么如果该轮到是你的那么该轮到是我的否呈现"\n我选择了: ~+'选择'<a>`~.\n"和该轮到是你的。

# Check for a draw game.
如果该选择不是已分配、该游戏不是已分配、A6是已分配、B6是已分配、C6是已分配、D6是已分配、E6是已分配、F6是已分配和G6是已分配那么该游戏是平局的、该轮到是空的和呈现"这场比赛是平局。\n\n"。

# Game over...
如果该选择是已分配、该游戏是已分配、该游戏不是平局的和该游戏不是无效那么如果该轮到是我的那么呈现"\n我赢得的选择: ~+'选择'<a>`~.\n"、该选择是空的和该轮到是空的否呈现"\n恭喜！\n"、该选择是空的和该轮到是空的。

# Reset an invalid set.
如果该选择是无效那么该选择是空的。

# Display the playing board.
如果该轮到是已分配、该选择不是无效、该游戏不是你的和该解决方案的方法不是完成了那么呈现"\n\t|~+1'A6'<a>`~|~+1'B6'<a>`~|~+1'C6'<a>`~|~+1'D6'<a>`~|~+1'E6'<a>`~|~+1'F6'<a>`~|~+1'G6'<a>`~|\n\t|~+1'A5'<a>`~|~+1'B5'<a>`~|~+1'C5'<a>`~|~+1'D5'<a>`~|~+1'E5'<a>`~|~+1'F5'<a>`~|~+1'G5'<a>`~|\n\t|~+1'A4'<a>`~|~+1'B4'<a>`~|~+1'C4'<a>`~|~+1'D4'<a>`~|~+1'E4'<a>`~|~+1'F4'<a>`~|~+1'G4'<a>`~|\n\t|~+1'A3'<a>`~|~+1'B3'<a>`~|~+1'C3'<a>`~|~+1'D3'<a>`~|~+1'E3'<a>`~|~+1'F3'<a>`~|~+1'G3'<a>`~|\n\t|~+1'A2'<a>`~|~+1'B2'<a>`~|~+1'C2'<a>`~|~+1'D2'<a>`~|~+1'E2'<a>`~|~+1'F2'<a>`~|~+1'G2'<a>`~|\n\t|~+1'A1'<a>`~|~+1'B1'<a>`~|~+1'C1'<a>`~|~+1'D1'<a>`~|~+1'E1'<a>`~|~+1'F1'<a>`~|~+1'G1'<a>`~|\n选择->\t-A-B-C-D-E-F-G-\n"。
如果该轮到不是已分配、该选择不是已分配、该游戏是已分配和该游戏不是无效那么呈现"\n\t|~+1'A6'<a>`~|~+1'B6'<a>`~|~+1'C6'<a>`~|~+1'D6'<a>`~|~+1'E6'<a>`~|~+1'F6'<a>`~|~+1'G6'<a>`~|\n\t|~+1'A5'<a>`~|~+1'B5'<a>`~|~+1'C5'<a>`~|~+1'D5'<a>`~|~+1'E5'<a>`~|~+1'F5'<a>`~|~+1'G5'<a>`~|\n\t|~+1'A4'<a>`~|~+1'B4'<a>`~|~+1'C4'<a>`~|~+1'D4'<a>`~|~+1'E4'<a>`~|~+1'F4'<a>`~|~+1'G4'<a>`~|\n\t|~+1'A3'<a>`~|~+1'B3'<a>`~|~+1'C3'<a>`~|~+1'D3'<a>`~|~+1'E3'<a>`~|~+1'F3'<a>`~|~+1'G3'<a>`~|\n\t|~+1'A2'<a>`~|~+1'B2'<a>`~|~+1'C2'<a>`~|~+1'D2'<a>`~|~+1'E2'<a>`~|~+1'F2'<a>`~|~+1'G2'<a>`~|\n\t|~+1'A1'<a>`~|~+1'B1'<a>`~|~+1'C1'<a>`~|~+1'D1'<a>`~|~+1'E1'<a>`~|~+1'F1'<a>`~|~+1'G1'<a>`~|\n选择->\t-A-B-C-D-E-F-G-\n\n这场比赛是~+'游戏'<a>`~。\n\nTo play again, click button «清除你的想法» and then «阅读文档\"中文/程序设计/屏風式四子棋\"。».\n\n"、该选择是空的和该轮到是空的。

# The definition of horizontal possibilities to win the game.
# (In the future a stronger grammar will be implemented to reduce the next sentences to only one sentence that describes a horizontal winning game.)

如果该轮到是已分配和该游戏不是已分配那么如果A1是该轮到的值、B1是该轮到的值、C1是该轮到的值和D1是该轮到的值或B1是该轮到的值、C1是该轮到的值、D1是该轮到的值和E1是该轮到的值或C1是该轮到的值、D1是该轮到的值、E1是该轮到的值和F1是该轮到的值或D1是该轮到的值、E1是该轮到的值、F1是该轮到的值和G1是该轮到的值那么该游戏是该轮到的值。
如果该轮到是已分配和该游戏不是已分配那么如果A2是该轮到的值、B2是该轮到的值、C2是该轮到的值和D2是该轮到的值或B2是该轮到的值、C2是该轮到的值、D2是该轮到的值和E2是该轮到的值或C2是该轮到的值、D2是该轮到的值、E2是该轮到的值和F2是该轮到的值或D2是该轮到的值、E2是该轮到的值、F2是该轮到的值和G2是该轮到的值那么该游戏是该轮到的值。
如果该轮到是已分配和该游戏不是已分配那么如果A3是该轮到的值、B3是该轮到的值、C3是该轮到的值和D3是该轮到的值或B3是该轮到的值、C3是该轮到的值、D3是该轮到的值和E3是该轮到的值或C3是该轮到的值、D3是该轮到的值、E3是该轮到的值和F3是该轮到的值或D3是该轮到的值、E3是该轮到的值、F3是该轮到的值和G3是该轮到的值那么该游戏是该轮到的值。
如果该轮到是已分配和该游戏不是已分配那么如果A4是该轮到的值、B4是该轮到的值、C4是该轮到的值和D4是该轮到的值或B4是该轮到的值、C4是该轮到的值、D4是该轮到的值和E4是该轮到的值或C4是该轮到的值、D4是该轮到的值、E4是该轮到的值和F4是该轮到的值或D4是该轮到的值、E4是该轮到的值、F4是该轮到的值和G4是该轮到的值那么该游戏是该轮到的值。
如果该轮到是已分配和该游戏不是已分配那么如果A5是该轮到的值、B5是该轮到的值、C5是该轮到的值和D5是该轮到的值或B5是该轮到的值、C5是该轮到的值、D5是该轮到的值和E5是该轮到的值或C5是该轮到的值、D5是该轮到的值、E5是该轮到的值和F5是该轮到的值或D5是该轮到的值、E5是该轮到的值、F5是该轮到的值和G5是该轮到的值那么该游戏是该轮到的值。
如果该轮到是已分配和该游戏不是已分配那么如果A6是该轮到的值、B6是该轮到的值、C6是该轮到的值和D6是该轮到的值或B6是该轮到的值、C6是该轮到的值、D6是该轮到的值和E6是该轮到的值或C6是该轮到的值、D6是该轮到的值、E6是该轮到的值和F6是该轮到的值或D6是该轮到的值、E6是该轮到的值、F6是该轮到的值和G6是该轮到的值那么该游戏是该轮到的值。

# The definition of vertical possibilities to win the game.
# (In the future a stronger grammar will be implemented to reduce the next sentences to only one sentence that describes a vertical winning game.)

如果该轮到是已分配和该游戏不是已分配那么如果A1是该轮到的值、A2是该轮到的值、A3是该轮到的值和A4是该轮到的值或A2是该轮到的值、A3是该轮到的值、A4是该轮到的值和A5是该轮到的值或A3是该轮到的值、A4是该轮到的值、A5是该轮到的值和A6是该轮到的值那么该游戏是该轮到的值。
如果该轮到是已分配和该游戏不是已分配那么如果B1是该轮到的值、B2是该轮到的值、B3是该轮到的值和B4是该轮到的值或B2是该轮到的值、B3是该轮到的值、B4是该轮到的值和B5是该轮到的值或B3是该轮到的值、B4是该轮到的值、B5是该轮到的值和B6是该轮到的值那么该游戏是该轮到的值。
如果该轮到是已分配和该游戏不是已分配那么如果C1是该轮到的值、C2是该轮到的值、C3是该轮到的值和C4是该轮到的值或C2是该轮到的值、C3是该轮到的值、C4是该轮到的值和C5是该轮到的值或C3是该轮到的值、C4是该轮到的值、C5是该轮到的值和C6是该轮到的值那么该游戏是该轮到的值。
如果该轮到是已分配和该游戏不是已分配那么如果D1是该轮到的值、D2是该轮到的值、D3是该轮到的值和D4是该轮到的值或D2是该轮到的值、D3是该轮到的值、D4是该轮到的值和D5是该轮到的值或D3是该轮到的值、D4是该轮到的值、D5是该轮到的值和D6是该轮到的值那么该游戏是该轮到的值。
如果该轮到是已分配和该游戏不是已分配那么如果E1是该轮到的值、E2是该轮到的值、E3是该轮到的值和E4是该轮到的值或E2是该轮到的值、E3是该轮到的值、E4是该轮到的值和E5是该轮到的值或E3是该轮到的值、E4是该轮到的值、E5是该轮到的值和E6是该轮到的值那么该游戏是该轮到的值。
如果该轮到是已分配和该游戏不是已分配那么如果F1是该轮到的值、F2是该轮到的值、F3是该轮到的值和F4是该轮到的值或F2是该轮到的值、F3是该轮到的值、F4是该轮到的值和F5是该轮到的值或F3是该轮到的值、F4是该轮到的值、F5是该轮到的值和F6是该轮到的值那么该游戏是该轮到的值。
如果该轮到是已分配和该游戏不是已分配那么如果G1是该轮到的值、G2是该轮到的值、G3是该轮到的值和G4是该轮到的值或G2是该轮到的值、G3是该轮到的值、G4是该轮到的值和G5是该轮到的值或G3是该轮到的值、G4是该轮到的值、G5是该轮到的值和G6是该轮到的值那么该游戏是该轮到的值。

# The definition of diagonal possibilities to win the game.
# (In the future a stronger grammar will be implemented to reduce the next sentences to only one sentence that describes a diagonal winning game.)

如果该轮到是已分配和该游戏不是已分配那么如果A1是该轮到的值、B2是该轮到的值、C3是该轮到的值和D4是该轮到的值或B1是该轮到的值、C2是该轮到的值、D3是该轮到的值和E4是该轮到的值或C1是该轮到的值、D2是该轮到的值、E3是该轮到的值和F4是该轮到的值或D1是该轮到的值、E2是该轮到的值、F3是该轮到的值和G4是该轮到的值那么该游戏是该轮到的值。
如果该轮到是已分配和该游戏不是已分配那么如果A2是该轮到的值、B3是该轮到的值、C4是该轮到的值和D5是该轮到的值或B2是该轮到的值、C3是该轮到的值、D4是该轮到的值和E5是该轮到的值或C2是该轮到的值、D3是该轮到的值、E4是该轮到的值和F5是该轮到的值或D2是该轮到的值、E3是该轮到的值、F4是该轮到的值和G5是该轮到的值那么该游戏是该轮到的值。
如果该轮到是已分配和该游戏不是已分配那么如果A3是该轮到的值、B4是该轮到的值、C5是该轮到的值和D6是该轮到的值或B3是该轮到的值、C4是该轮到的值、D5是该轮到的值和E6是该轮到的值或C3是该轮到的值、D4是该轮到的值、E5是该轮到的值和F6是该轮到的值或D3是该轮到的值、E4是该轮到的值、F5是该轮到的值和G6是该轮到的值那么该游戏是该轮到的值。
如果该轮到是已分配和该游戏不是已分配那么如果A4是该轮到的值、B3是该轮到的值、C2是该轮到的值和D1是该轮到的值或B4是该轮到的值、C3是该轮到的值、D2是该轮到的值和E1是该轮到的值或C4是该轮到的值、D3是该轮到的值、E2是该轮到的值和F1是该轮到的值或D4是该轮到的值、E3是该轮到的值、F2是该轮到的值和G1是该轮到的值那么该游戏是该轮到的值。
如果该轮到是已分配和该游戏不是已分配那么如果A5是该轮到的值、B4是该轮到的值、C3是该轮到的值和D2是该轮到的值或B5是该轮到的值、C4是该轮到的值、D3是该轮到的值和E2是该轮到的值或C5是该轮到的值、D4是该轮到的值、E3是该轮到的值和F2是该轮到的值或D5是该轮到的值、E4是该轮到的值、F3是该轮到的值和G2是该轮到的值那么该游戏是该轮到的值。
如果该轮到是已分配和该游戏不是已分配那么如果A6是该轮到的值、B5是该轮到的值、C4是该轮到的值和D3是该轮到的值或B6是该轮到的值、C5是该轮到的值、D4是该轮到的值和E3是该轮到的值或C6是该轮到的值、D5是该轮到的值、E4是该轮到的值和F3是该轮到的值或D6是该轮到的值、E5是该轮到的值、F4是该轮到的值和G3是该轮到的值那么该游戏是该轮到的值。

# The chip will be put into the chosen column and will fall into the lowest free cell.
如果该选择是A和该游戏不是已分配那么如果A1不是已分配那么A1是该轮到的值否如果A2不是已分配那么A2是该轮到的值否如果A3不是已分配那么A3是该轮到的值否如果A4不是已分配那么A4是该轮到的值否如果A5不是已分配那么A5是该轮到的值否如果A6不是已分配那么A6是该轮到的值否呈现"\n对不起，第~+'选择'<a>`~列已满。.\n"和该选择是无效。
如果该选择是B和该游戏不是已分配那么如果B1不是已分配那么B1是该轮到的值否如果B2不是已分配那么B2是该轮到的值否如果B3不是已分配那么B3是该轮到的值否如果B4不是已分配那么B4是该轮到的值否如果B5不是已分配那么B5是该轮到的值否如果B6不是已分配那么B6是该轮到的值否呈现"\n对不起，第~+'选择'<a>`~列已满。.\n"和该选择是无效。
如果该选择是C和该游戏不是已分配那么如果C1不是已分配那么C1是该轮到的值否如果C2不是已分配那么C2是该轮到的值否如果C3不是已分配那么C3是该轮到的值否如果C4不是已分配那么C4是该轮到的值否如果C5不是已分配那么C5是该轮到的值否如果C6不是已分配那么C6是该轮到的值否呈现"\n对不起，第~+'选择'<a>`~列已满。.\n"和该选择是无效。
如果该选择是D和该游戏不是已分配那么如果D1不是已分配那么D1是该轮到的值否如果D2不是已分配那么D2是该轮到的值否如果D3不是已分配那么D3是该轮到的值否如果D4不是已分配那么D4是该轮到的值否如果D5不是已分配那么D5是该轮到的值否如果D6不是已分配那么D6是该轮到的值否呈现"\n对不起，第~+'选择'<a>`~列已满。.\n"和该选择是无效。
如果该选择是E和该游戏不是已分配那么如果E1不是已分配那么E1是该轮到的值否如果E2不是已分配那么E2是该轮到的值否如果E3不是已分配那么E3是该轮到的值否如果E4不是已分配那么E4是该轮到的值否如果E5不是已分配那么E5是该轮到的值否如果E6不是已分配那么E6是该轮到的值否呈现"\n对不起，第~+'选择'<a>`~列已满。.\n"和该选择是无效。
如果该选择是F和该游戏不是已分配那么如果F1不是已分配那么F1是该轮到的值否如果F2不是已分配那么F2是该轮到的值否如果F3不是已分配那么F3是该轮到的值否如果F4不是已分配那么F4是该轮到的值否如果F5不是已分配那么F5是该轮到的值否如果F6不是已分配那么F6是该轮到的值否呈现"\n对不起，第~+'选择'<a>`~列已满。.\n"和该选择是无效。
如果该选择是G和该游戏不是已分配那么如果G1不是已分配那么G1是该轮到的值否如果G2不是已分配那么G2是该轮到的值否如果G3不是已分配那么G3是该轮到的值否如果G4不是已分配那么G4是该轮到的值否如果G5不是已分配那么G5是该轮到的值否如果G6不是已分配那么G6是该轮到的值否呈现"\n对不起，第~+'选择'<a>`~列已满。.\n"和该选择是无效。

# Check for game over.
如果该游戏是已分配、该游戏不是无效和该选择是已分配那么呈现"\nSorry, the game is already over.\n\nTo play again, click button «清除你的想法» and then «阅读文档\"中文/程序设计/屏風式四子棋\"。».\n\n"、该选择是空的、该轮到是空的和该游戏是无效。

# Warning: No solve level.
如果该解决方案水平不是已分配和该轮到是已分配那么呈现"警告：解决方案水平没有价值。 请分配解决方案水平。\n"、该选择是无效和该轮到是空的。

# Game configuration.
#该解决方案的方法不是忙。
#该解决方案的方法不是完成了。
该解决方案的方法是倒。
该解决方案战略是独家。
该解决方案水平是低。

# Actual start of the game.
该轮到是你的。
#C++## Type for a set for example:	我的选择是A。
#C++## Type for an advanced game:	该解决方案水平是高。
#C++## Return to beginners level:	该解决方案水平是低。
#C++## Info about the set:			呈现选择的信息。
#Java## Note: The font is adjusted to display the playing board is a correct way.