C#编程 井字游戏

一、需求分析

游戏规则:两人轮流下棋,谁先将3颗棋子摆成横竖斜一条直线即获胜。

界面温馨,支持人机对战、双人对战,电脑难度有简单和困难。


二、运行界面

C#编程 井字游戏_第1张图片


三、设计思路

1、界面

用基本的menuStrip、label、button即可完成,图中的线条为label,圈圈叉叉为OX。

2、基本模块

地图用二维数组存储,对相应的事件做出响应。

程序大致流程为:选择模式开始游戏->点击棋盘做出响应(存储的值发生变化,地图画OX)->计算机思考下棋->每一步棋判断输赢。

3、难点

计算机思考,我是这样处理的,用一个int表示棋盘现在每一个格子的状态(0-空格 1-自己棋子 2-对手棋子),dfs预处理出每个状态是否为可赢状态,计算机下棋时,如果当前状态为可赢状态则顺着赢的步骤走,如果当前不是可赢状态,则随意走一步使下一步人走时不是可赢状态。相当于思考了一步棋,因为这个游戏简单,这种思路就能保证计算机不输了,以后要写出计算机思考多步的程序像有些比较好的象棋人机对战等。


四、核心代码(计算机思考)

        // dfs 判断当前状态cur是否为可赢局面
        int dfs(int cur) // cur中每一位 0-未放 1-自己 2-对方
        {
            if (dp[cur] != -1) return dp[cur]; // 记忆化搜索
            dp[cur] = 0;
            int i,j;
            for(i=0;i<9;i++)
            {
                if((cur/fac[i])%3==0)
                {
                    int now = cur + fac[i];
                    if(isok(now))  // 自己走一步能赢
                    {
                        dp[cur] = 1;
                        nextstep[cur] = i;
                        break;
                    }
                    int tmp, flag = 1,inloop=0;  // inloop不可少 少了平局时状态会算错 debug好久
                    for (j = 0; j < 9;j++ )  // 对手任意走 自己仍是可赢局面则这个状态为可赢局面
                    {
                        if((now/fac[j])%3==0)
                        {
                            inloop = 1;
                            tmp = now;
                            tmp += 2 * fac[j];
                            if (isok1(tmp)||dfs(tmp) == 0) { flag = 0; break; }
                        }
                    }
                    if (inloop==1&&flag== 1)
                    {
                        dp[cur] = 1;
                        nextstep[cur] = i;
                        break;
                    }
                }
            }
            return dp[cur];
        }
        void DiffInit()
        {
            int i,j;
            fac[0] = 1;
            for (i = 1; i < 10; i++) fac[i] = fac[i - 1] * 3;
            for (i = 0; i < 19683; i++) dp[i] = -1;
            for(i=0;i<19683;i++)
            {
                if (dp[i] == -1)
                {
                    int cnt1, cnt2;
                    cnt1 = cnt2 = 0;
                    for (j = 0; j < 9;j++)
                    {
                        if ((i / fac[j]) % 3 == 1) cnt1++;
                        else if ((i / fac[j]) % 3 == 2) cnt2++;
                    }
                    if (cnt1 == cnt2 || cnt1 == cnt2 - 1) dfs(i);
                    else dp[i] = 0;
                }
            }
        }

五、EXE文件

http://pan.baidu.com/s/1o6tF6tk



你可能感兴趣的:(C#编程 井字游戏)