zoukankan      html  css  js  c++  java
  • 井字棋人机

    井字棋人机对弈的实现

        以3*3的二维数组存放棋盘,输入两个数字表示要下的位置,然后人机对弈;

    1.划分模块

            (1). 输出模块

                            输出棋盘:不断的清屏、打印、清屏、打印以实现动画式的效果( 一般都会把清除光标带上的 )。
                            输出结果:谁输谁赢。

           (2).判断模块

                          此处分为两个模块
                             其一用来判断所选位置是否可以下(即是否已经存在棋子),
                             其二是判断当前棋面是否有输赢,或平局。

           (3).电脑下棋模块

                         此模块最为重要,要考虑到各种情况的应对措施,思路下面具体说;

           (4).主函数

                        把问题分小了,划分为各个模块,用子函数实现,主函数相对来说就简单了。
     

    2.简单思路介绍

                输出棋盘的操作都带着清屏 打印 (cls、print);

                判断就返回两个值表示是否即可,这些都不是重点;

                重点是这里,人机博弈:首先有个优先度,

                        第一: 要赢;

                        第二:在实在不能赢的情况下,不能输,最多为平局;

                        第三:如果以上都没有,就随机下;

    3.代码实现及详细思路

            就按源代码中的顺序写了,思路自己对应一下吧。

            1.去光标
            
    1 //    去光标 
    2 void qgb ( )    
    3 {
    4     HANDLE handle = GetStdHandle ( STD_OUTPUT_HANDLE );  
    5     CONSOLE_CURSOR_INFO CursorInfo;  
    6     GetConsoleCursorInfo ( handle, &CursorInfo );
    7     CursorInfo.bVisible = false; 
    8     SetConsoleCursorInfo ( handle, &CursorInfo );
    9 }


        2.判断所选位置是否可以下子
    1 //    判断所选位置是否可下 不可下返回-1 可以下返回0 
    2 int IsNULL ( int array[3][3], int x, int y )
    3 {
    4     if ( array[x][y] == 0 ) return 0;
    5     return -1;
    6 }
        3.打印棋盘
                不断的清屏 打印 清屏 打印;
     1 //    打印棋盘 
     2 void Print ( int array[3][3] )
     3 {
     4     system( "cls" );
     5     int i, j;
     6     printf ( "
    
    	井 字 棋
    " );
     7     for ( i = 0; i < 3; i ++ )
     8     {                  
     9         printf ( "
    	+-+-+-+
    	|" );
    10         for ( j = 0; j < 3; j ++ )
    11         {
    12             if ( array[i][j] == 0 ) printf( " " );
    13             if ( array[i][j] == 1 ) printf( "X" );
    14             if ( array[i][j] == -1 ) printf( "O" );
    15             printf( "|" );
    16         }
    17     }
    18     printf ( "
    	+-+-+-+
    
    " );
    19 }
        4.电脑下棋部分

            其一考虑赢,即有一线有两个自己的棋子,则优先放在第三个的位置。

            其二考虑不输,即不然对方赢,一条线上有两个对方棋子,则下在第三个位置堵住。

            其三随机下。

            重点:一定要按该思路的顺序 先考虑赢,再考虑不输,最后考虑随机,即使你分 横竖撇捺的位置来实现的,最后也得等赢的情况全部考虑完在考虑其他情况,我刚开始就傻逼了。

        代码:

      1 //    电脑下子 
      2 int GO ( int array[3][3] )
      3 {
      4     int i, t;
      5     int k;
      6     for ( i = 0; i < 3; i ++ )
      7     {
      8         t = array[i][0] + array[i][1] + array[i][2];
      9         if ( t == -2 )
     10         {
     11             for ( k = 0; k < 3; k ++ )
     12             {
     13                 if ( array[i][k] == 0 )
     14                 {
     15                     array[i][k] = -1;
     16                     return 0;
     17                 } 
     18                 
     19             }
     20         } 
     21     }
     22     for ( i = 0; i < 3; i ++ )
     23     {
     24         t = array[0][i] + array[1][i] + array[2][i];
     25         if ( t == -2 )
     26         {
     27             for ( k = 0; k < 3; k ++ )
     28             {
     29                 if ( array[k][i] == 0 )
     30                 {
     31                     array[k][i] = -1;
     32                     return 0;
     33                 }
     34             }
     35         } 
     36     }
     37     int j = 0; t = 0;
     38     for ( i = 0; i < 3; i ++ )
     39     {
     40         j += array[i][i];
     41         t += array[i][2-i];
     42     }
     43     if ( t == -2 )
     44     {
     45         for ( k = 0; k < 3; k ++ )
     46         {
     47             if ( array[k][2-k] == 0 )
     48             {
     49                 array[k][2-k] = -1;
     50                 return 0;
     51             } 
     52         }
     53     }
     54     if ( j == -2 )
     55     {
     56         for ( k = 0; k < 3; k ++ )
     57         {
     58             if ( array[k][k] == 0 ) 
     59             {
     60                 array[k][k] = -1;
     61                 return 0;
     62             }
     63         }
     64     }
     65     
     66     
     67     
     68     for ( i = 0; i < 3; i ++ )
     69     {
     70         t = array[i][0] + array[i][1] + array[i][2];
     71         if ( t == 2 )
     72         {
     73             for ( k = 0; k < 3; k ++ )
     74             {
     75                 if ( array[i][k] == 0 )
     76                 {
     77                     array[i][k] = -1;
     78                     return 0;
     79                 } 
     80                 
     81             }
     82         } 
     83     }
     84     for ( i = 0; i < 3; i ++ )
     85     {
     86         t = array[0][i] + array[1][i] + array[2][i];
     87         if ( t == 2 )
     88         {
     89             for ( k = 0; k < 3; k ++ )
     90             {
     91                 if ( array[k][i] == 0 )
     92                 {
     93                     array[k][i] = -1;
     94                     return 0;
     95                 }
     96             }
     97         } 
     98     }
     99     j = 0; t = 0;
    100     for ( i = 0; i < 3; i ++ )
    101     {
    102         j += array[i][i];
    103         t += array[i][2-i];
    104     }
    105     if ( t == 2 )
    106     {
    107         for ( k = 0; k < 3; k ++ )
    108         {
    109             if ( array[k][2-k] == 0 )
    110             {
    111                 array[k][2-k] = -1;
    112                 return 0;
    113             } 
    114         }
    115     }
    116     if ( j == 2 )
    117     {
    118         for ( k = 0; k < 3; k ++ )
    119         {
    120             if ( array[k][k] == 0 ) 
    121             {
    122                 array[k][k] = -1;
    123                 return 0;
    124             }
    125         }
    126     }
    127     
    128     
    129     while ( 1 )
    130     {
    131         srand ( time ( 0 ) );
    132         i = rand ( ) % 3;
    133         j = rand ( ) % 3;
    134         if ( IsNULL ( array, i, j ) == 0 )
    135         {
    136             array[i][j] = -1;
    137             break;
    138         }
    139     }
    140     return 0;
    141 }
        5.检查胜负情况

        代码:

     1 //    平局返回0;正方胜返回1;负反胜利返回-1;否则返回6; 
     2 int Check ( int array[3][3] )
     3 {
     4     int i, t;
     5     for ( i = 0; i < 3; i ++ )
     6     {
     7         t = array[i][0] + array[i][1] + array[i][2];
     8         if ( t == -3 ) return -1;
     9         if ( t == 3 ) return 1;
    10     }
    11     for ( i = 0; i < 3; i ++ )
    12     {
    13         t = array[0][i] + array[1][i] + array[2][i];
    14         if ( t == -3 ) return -1;
    15         if ( t == 3 ) return 1;
    16     }
    17     int j = 0; t = 0;
    18     for ( i = 0; i < 3; i ++ )
    19     {
    20         j += array[i][i];
    21         t += array[i][2-i];
    22     }
    23     if ( t == -3 || j == -3 ) return -1;
    24     if ( t == 3 || j == 3 ) return 1;
    25     for ( i = 0; i < 3; i ++ )
    26     {
    27         for ( j = 0; j < 3; j ++ )
    28         {
    29             if ( array[i][j] == 0 ) return 6;
    30         }
    31     }
    32     return 0;
    33 }    
        6.我另外加的一个 集Check 和Print 一起的函数,用来输出结果;

        代码:

     1 int CP ( int array[3][3] )
     2 {
     3     int t = Check ( array );
     4     Print ( array );
     5     if ( t == 0 )
     6     {
     7         printf ( "	 平局!");
     8         system ( "pause" );
     9         return 0; 
    10     }
    11     if ( t == 1 )
    12     {
    13         printf ( "	 恭喜你 赢了! ");
    14         system ( "pause" );
    15         return 0; 
    16     }
    17     if ( t == -1 )
    18     {
    19         printf ( "	 很抱歉 输了! ");
    20         system ( "pause" );
    21         return 0; 
    22     }
    23     return -1;
    24 } 
        7.主函数

        代码:

     1 int main ( )
     2 {
     3     system ( "title 井字棋小游戏--BY:nanshao_zz" ); 
     4     qgb ( );
     5     int array[3][3];
     6     memset ( array, 0, sizeof ( array ) );
     7     Print ( array );
     8     int x, y, t;
     9     while ( 1 )
    10     {
    11         scanf ( "%d %d", &x, &y );
    12         x --;
    13         y --;
    14         if ( x > 2 || y > 2 || x < 0 || y < 0 )
    15         {
    16             printf( "	输入范围: 1-3! " );
    17             continue;
    18         }
    19         if ( IsNULL ( array, x, y ) == -1 )
    20         {
    21             printf ( "所选位置已存在! " );
    22             continue; 
    23         }
    24         array[x][y] = 1;
    25         t = CP ( array );
    26         if ( t == 0 ) return 0;
    27         GO ( array );
    28         t = CP ( array );
    29         if ( t == 0 ) return 0;
    30     }
    31     return 0;
    32 } 

    全部代码:

      1 #include "algorithm"
      2 #include "windows.h"
      3 #include "iostream"
      4 #include "stdlib.h"
      5 #include "string.h"
      6 #include "stdio.h"
      7 #include "vector"
      8 #include "math.h"
      9 #include "time.h"
     10 #include "string"
     11 #include "map" 
     12 
     13 using namespace std;
     14 
     15 //    去光标 
     16 void qgb ( )    
     17 {
     18     HANDLE handle = GetStdHandle ( STD_OUTPUT_HANDLE );  
     19     CONSOLE_CURSOR_INFO CursorInfo;  
     20     GetConsoleCursorInfo ( handle, &CursorInfo );
     21     CursorInfo.bVisible = false; 
     22     SetConsoleCursorInfo ( handle, &CursorInfo );
     23 }
     24 
     25 //    判断所选位置是否可下 不可下返回-1 可以下返回0 
     26 int IsNULL ( int array[3][3], int x, int y )
     27 {
     28     if ( array[x][y] == 0 ) return 0;
     29     return -1;
     30 }
     31 
     32 //    打印棋盘 
     33 void Print ( int array[3][3] )
     34 {
     35     system( "cls" );
     36     int i, j;
     37     printf ( "
    
    	井 字 棋
    " );
     38     for ( i = 0; i < 3; i ++ )
     39     {                  
     40         printf ( "
    	+-+-+-+
    	|" );
     41         for ( j = 0; j < 3; j ++ )
     42         {
     43             if ( array[i][j] == 0 ) printf( " " );
     44             if ( array[i][j] == 1 ) printf( "X" );
     45             if ( array[i][j] == -1 ) printf( "O" );
     46             printf( "|" );
     47         }
     48     }
     49     printf ( "
    	+-+-+-+
    
    " );
     50 }
     51 
     52 //    电脑下子 
     53 int GO ( int array[3][3] )
     54 {
     55     int i, t;
     56     int k;
     57     for ( i = 0; i < 3; i ++ )
     58     {
     59         t = array[i][0] + array[i][1] + array[i][2];
     60         if ( t == -2 )
     61         {
     62             for ( k = 0; k < 3; k ++ )
     63             {
     64                 if ( array[i][k] == 0 )
     65                 {
     66                     array[i][k] = -1;
     67                     return 0;
     68                 } 
     69                 
     70             }
     71         } 
     72     }
     73     for ( i = 0; i < 3; i ++ )
     74     {
     75         t = array[0][i] + array[1][i] + array[2][i];
     76         if ( t == -2 )
     77         {
     78             for ( k = 0; k < 3; k ++ )
     79             {
     80                 if ( array[k][i] == 0 )
     81                 {
     82                     array[k][i] = -1;
     83                     return 0;
     84                 }
     85             }
     86         } 
     87     }
     88     int j = 0; t = 0;
     89     for ( i = 0; i < 3; i ++ )
     90     {
     91         j += array[i][i];
     92         t += array[i][2-i];
     93     }
     94     if ( t == -2 )
     95     {
     96         for ( k = 0; k < 3; k ++ )
     97         {
     98             if ( array[k][2-k] == 0 )
     99             {
    100                 array[k][2-k] = -1;
    101                 return 0;
    102             } 
    103         }
    104     }
    105     if ( j == -2 )
    106     {
    107         for ( k = 0; k < 3; k ++ )
    108         {
    109             if ( array[k][k] == 0 ) 
    110             {
    111                 array[k][k] = -1;
    112                 return 0;
    113             }
    114         }
    115     }
    116     
    117     
    118     
    119     for ( i = 0; i < 3; i ++ )
    120     {
    121         t = array[i][0] + array[i][1] + array[i][2];
    122         if ( t == 2 )
    123         {
    124             for ( k = 0; k < 3; k ++ )
    125             {
    126                 if ( array[i][k] == 0 )
    127                 {
    128                     array[i][k] = -1;
    129                     return 0;
    130                 } 
    131                 
    132             }
    133         } 
    134     }
    135     for ( i = 0; i < 3; i ++ )
    136     {
    137         t = array[0][i] + array[1][i] + array[2][i];
    138         if ( t == 2 )
    139         {
    140             for ( k = 0; k < 3; k ++ )
    141             {
    142                 if ( array[k][i] == 0 )
    143                 {
    144                     array[k][i] = -1;
    145                     return 0;
    146                 }
    147             }
    148         } 
    149     }
    150     j = 0; t = 0;
    151     for ( i = 0; i < 3; i ++ )
    152     {
    153         j += array[i][i];
    154         t += array[i][2-i];
    155     }
    156     if ( t == 2 )
    157     {
    158         for ( k = 0; k < 3; k ++ )
    159         {
    160             if ( array[k][2-k] == 0 )
    161             {
    162                 array[k][2-k] = -1;
    163                 return 0;
    164             } 
    165         }
    166     }
    167     if ( j == 2 )
    168     {
    169         for ( k = 0; k < 3; k ++ )
    170         {
    171             if ( array[k][k] == 0 ) 
    172             {
    173                 array[k][k] = -1;
    174                 return 0;
    175             }
    176         }
    177     }
    178     
    179     
    180     while ( 1 )
    181     {
    182         srand ( time ( 0 ) );
    183         i = rand ( ) % 3;
    184         j = rand ( ) % 3;
    185         if ( IsNULL ( array, i, j ) == 0 )
    186         {
    187             array[i][j] = -1;
    188             break;
    189         }
    190     }
    191     return 0;
    192 }
    193 
    194 //    平局返回0;正方胜返回1;负反胜利返回-1;否则返回6; 
    195 int Check ( int array[3][3] )
    196 {
    197     int i, t;
    198     for ( i = 0; i < 3; i ++ )
    199     {
    200         t = array[i][0] + array[i][1] + array[i][2];
    201         if ( t == -3 ) return -1;
    202         if ( t == 3 ) return 1;
    203     }
    204     for ( i = 0; i < 3; i ++ )
    205     {
    206         t = array[0][i] + array[1][i] + array[2][i];
    207         if ( t == -3 ) return -1;
    208         if ( t == 3 ) return 1;
    209     }
    210     int j = 0; t = 0;
    211     for ( i = 0; i < 3; i ++ )
    212     {
    213         j += array[i][i];
    214         t += array[i][2-i];
    215     }
    216     if ( t == -3 || j == -3 ) return -1;
    217     if ( t == 3 || j == 3 ) return 1;
    218     for ( i = 0; i < 3; i ++ )
    219     {
    220         for ( j = 0; j < 3; j ++ )
    221         {
    222             if ( array[i][j] == 0 ) return 6;
    223         }
    224     }
    225     return 0;
    226 }
    227 
    228 
    229 int CP ( int array[3][3] )
    230 {
    231     int t = Check ( array );
    232     Print ( array );
    233     if ( t == 0 )
    234     {
    235         printf ( "	 平局!");
    236         system ( "pause" );
    237         return 0; 
    238     }
    239     if ( t == 1 )
    240     {
    241         printf ( "	 恭喜你 赢了! ");
    242         system ( "pause" );
    243         return 0; 
    244     }
    245     if ( t == -1 )
    246     {
    247         printf ( "	 很抱歉 输了! ");
    248         system ( "pause" );
    249         return 0; 
    250     }
    251     return -1;
    252 } 
    253 
    254 int main ( )
    255 {
    256     system ( "title 井字棋小游戏--BY:nanshao_zz" ); 
    257     qgb ( );
    258     int array[3][3];
    259     memset ( array, 0, sizeof ( array ) );
    260     Print ( array );
    261     int x, y, t;
    262     while ( 1 )
    263     {
    264         scanf ( "%d %d", &x, &y );
    265         x --;
    266         y --;
    267         if ( x > 2 || y > 2 || x < 0 || y < 0 )
    268         {
    269             printf( "	输入范围: 1-3! " );
    270             continue;
    271         }
    272         if ( IsNULL ( array, x, y ) == -1 )
    273         {
    274             printf ( "所选位置已存在! " );
    275             continue; 
    276         }
    277         array[x][y] = 1;
    278         t = CP ( array );
    279         if ( t == 0 ) return 0;
    280         GO ( array );
    281         t = CP ( array );
    282         if ( t == 0 ) return 0;
    283     }
    284     return 0;
    285 } 
    View Code

    希望可以帮到正在学这个的你,欢迎批评指正!

  • 相关阅读:
    js中的原生Ajax和JQuery中的Ajax
    this的用法
    static的特性
    时政20180807
    java compiler没有1.8怎么办
    Description Resource Path Location Type Java compiler level does not match the version of the installed Java project facet Unknown Faceted Project Problem (Java Version Mismatch)
    分词器
    [数算]有一个工程甲、乙、丙单独做,分别要48天、72天、96天完成
    一点感想
    解析Excel文件 Apache POI框架使用
  • 原文地址:https://www.cnblogs.com/nanshaobit/p/12464641.html
Copyright © 2011-2022 走看看