砺心书剑 發表於 2025-8-17 15:51:00

井字棋

<p>该游戏为c语言写的练手小游戏</p>
<p>大致分为两部分:</p>
<ul>
<li>菜单显示</li>
<li>游戏部分</li>
</ul>
<h1>主程序</h1>
<p>首先加载菜单</p>
<p><img src="https://img2024.cnblogs.com/blog/3512406/202508/3512406-20250817152653026-1007402787.png"></p>
<p>用户选择人机或者双人,进入游戏函数</p>
<p>选择退出时,退出程序</p>
<p>选择不合法选项时,再次加载菜单供用户选择</p>
<h2>菜单代码</h2>
<pre class="language-c highlighter-hljs"><code>/**
* @brief 菜单函数
*
* @return 无返回值
*
* @code
* Menu();
* @endcode
*/
void Menu()
{
        printf("******************************\n");
        printf("******      井字棋      ******\n");
        printf(" 1.人机练习 2.双人对弈 3.退出 \n");
        printf("******************************\n\n\n");
}</code></pre>
<h2>主程序代码</h2>
<pre class="language-c highlighter-hljs"><code>/**
* @brief 程序入口
*
* @return 返回0
*
*/
int main(void)
{
        int chChoose = 0;//存储用户选项
        char isError = 0;//提示类别:0常规提示,1错误提示,默认值为0

        srand((unsigned)time(NULL));

        while (1)
        {
                memcpy(m_ChessboardArr, m_ChessboardArr_ori, sizeof(m_ChessboardArr));
                Menu();//显示菜单

                if (!isError)
                        printf("请输入你的选择:");
                else
                        printf("输入错误,请重新输入:");

                isError = 0;//在用户重新输入选项时,该值恢复默认值
                scanf("%d", &amp;chChoose);//用户输入选项

                switch (chChoose)
                {
                case 1://人机练习
                        Game(1);
                        break;
                case 2://双人对弈
                        Game(2);
                        break;
                case 3://退出
                        printf("即将退出游戏");
                        Sleep(500);
                        return 0;
                default:
                        isError = 1;
                }
        }
       
        return 0;
}</code></pre>
<h1>游戏部分</h1>
<p>首先加载棋盘</p>
<p>然后让用户输入位置坐标</p>
<p>判断坐标合法性</p>
<p>判断游戏状态:输赢及继续状态</p>
<h2>加载棋盘</h2>
<p>棋盘设置如下:</p>
<p><img src="https://img2024.cnblogs.com/blog/3512406/202508/3512406-20250817153833250-2064389434.png"></p>
<p>此处我设置了一个全局变量<code>m_ChessboardArr</code>来作为棋盘数组,其默认值为<code>{ { ' ', ' ', ' ' }, { '_', '_', '_' }, { '_', '_', '_' } };</code></p>
<p>加载棋盘时,我是一行一行的加载</p>
<h3>加载棋盘的代码</h3>
<pre class="language-c highlighter-hljs"><code>void ShowChessboard()
{
        for (int i = 2; i &gt;= 0; --i)
                printf("%c|%c|%c\n", m_ChessboardArr, m_ChessboardArr, m_ChessboardArr);//一次加载一行
}</code></pre>
<h2>提示用户输入位置坐标</h2>
<p>此处直接用<code>printf</code>以及<code>scanf</code>函数来提示用户输入</p>
<h2>判断坐标合法性</h2>
<ul>
<li>坐标不超过棋盘大小</li>
<li>坐标是默认值,即没有玩家在此处下棋</li>
</ul>
<p>满足以上两点,则坐标合法</p>
<h3>坐标不超过棋盘大小</h3>
<pre class="language-c highlighter-hljs"><code>if ((x &gt; 3) || (y &gt; 3))
{
        isError = 1;
        continue;
}</code></pre>
<h3>坐标是默认值</h3>
<pre class="language-c highlighter-hljs"><code>if (('*' == m_ChessboardArr) || ('O' == m_ChessboardArr))
{
        isError = 2;
        continue;
}</code></pre>
<h2>判断游戏状态</h2>
<ul>
<li>判断每行是否一致</li>
<li>判断每列是否一致</li>
<li>判断对角线是否一致</li>
</ul>
<p>如若有一个是一致的,且不是默认值,则有玩家赢得游戏</p>
<p>还需判断棋盘是否下满,如若下满则是平局</p>
<p>如若以上情况都不满足,则继续游戏</p>
<h3>代码</h3>
<pre class="language-c highlighter-hljs"><code>/**
* @brief 判断棋盘情况
*
*
* @param m_ChessboardArr 棋盘数组
* @return 返回1是玩家1赢;返回2是玩家2赢;返回3是未分胜负,继续游戏;返回0是棋盘下满,两人平局,游戏结束
*
* @code
* int iResult = Judge();
* @endcode
*/
int Judge()
{
        //判断每行每列情况
        for (int i = 0; i &lt; 3; ++i)
        {
                if ((m_ChessboardArr == m_ChessboardArr) &amp;&amp; (m_ChessboardArr == m_ChessboardArr))//判断每一行是否一致
                {
                        if ('*' == m_ChessboardArr)//为*则是一号玩家获胜
                                return 1;

                        if ('O' == m_ChessboardArr)//为O则是二号玩家获胜
                                return 2;
                        //否则就是默认值,代表没有玩家在该处下棋
                }

                if ((m_ChessboardArr == m_ChessboardArr) &amp;&amp; (m_ChessboardArr == m_ChessboardArr))//判断每一列是否一致
                {
                        if ('*' == m_ChessboardArr)//为*则是一号玩家获胜
                                return 1;

                        if ('O' == m_ChessboardArr)//为O则是二号玩家获胜
                                return 2;
                        //否则就是默认值,代表没有玩家在该处下棋
                }
        }

        //判断对角线情况
        if (((m_ChessboardArr == m_ChessboardArr) &amp;&amp; (m_ChessboardArr == m_ChessboardArr)) ||
                ((m_ChessboardArr == m_ChessboardArr) &amp;&amp; (m_ChessboardArr == m_ChessboardArr)))//判断对角线是否一致
        {
                if ('*' == m_ChessboardArr)//为*则是一号玩家获胜
                        return 1;

                if ('O' == m_ChessboardArr)//为O则是二号玩家获胜
                        return 2;
                //否则就是默认值,代表没有玩家在该处下棋
        }

        //判断棋盘是否下满
        for (int i = 0; i &lt; 3; ++i)
        {
                for (int j = 0; j &lt; 3; ++j)
                {
                        if ((m_ChessboardArr != '*') &amp;&amp; (m_ChessboardArr != 'O'))//棋盘不为玩家值,即棋盘为默认值,则代表没有下满,还需继续游戏
                                return 3;
                }
        }

        return 0;//棋盘下满,退出游戏
}</code></pre>
<p>以上就是该小游戏的主要程序了,仅供分享学习用</p>
<h1>游戏源码</h1>
<p>https://gitee.com/EricsT/game/tree/master/Tic-Tac-Toe</p>

</div>
<div id="MySignature" role="contentinfo">
    <p>本文来自博客园,作者:EricsT,转载请注明原文链接:https://www.cnblogs.com/EricsT/p/19043321</p><br><br>
来源:https://www.cnblogs.com/EricsT/p/19043321
頁: [1]
查看完整版本: 井字棋