欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

小游戏二之---------------五子棋

程序员文章站 2022-11-22 10:47:34
1.五子棋是一比较容易写的小游戏,很适合用来练手,作为练手,不必弄太复杂,所以就不弄电脑AI了,只是玩家之间的对战(AI下次再写)。 2.五子棋的难点在于如何判断输赢,其实很简单。每次下棋,就判断该棋子的四个方向,横竖方向,还有两个对角线(分成四个部分,左上,左下,右上,右下)方向是否满足五个棋子。 ......

1.五子棋是一比较容易写的小游戏,很适合用来练手,作为练手,不必弄太复杂,所以就不弄电脑ai了,只是玩家之间的对战(ai下次再写)。

2.五子棋的难点在于如何判断输赢,其实很简单。每次下棋,就判断该棋子的四个方向,横竖方向,还有两个对角线(分成四个部分,左上,左下,右上,右下)方向是否满足五个棋子。

3.用一个二维数组来表示棋盘(chessboard[n][n]),值等于0,就表示该位置没有棋子,1表示该位置是玩家1的棋子,2则是玩家2的棋子。

4.运行结果如下:

小游戏二之---------------五子棋

 

 

代码如下(c++),有详细注释

  1 #include<iostream>
  2 #include<string>
  3 #include<stdlib.h> 
  4 #define n 11 //棋盘大小 
  5 using namespace std;
  6 
  7 //五子棋游戏 
  8 //人对战人 
  9 
 10 void printboard(int  chessboard[n][n]);//打印棋盘 
 11 //验证输入是否有效,不能超过 n,不能输入除了数字以外的东西 
 12 bool isvalid(string row,string col,int chessboard[n][n]);
 13 //玩游戏函数 
 14 void playgame(int chessboard[n][n],int player);
 15 //判断输赢情况 
 16 void judge(int chessboard[n][n],int row,int col,int player);
 17 //判断棋盘是否满了 
 18 bool isfull(int chessboard[n][n]);
 19 int main()
 20 {
 21     int chessboard[n][n]={0};//n*n 棋盘 
 22                           //0表示该位置还没有棋子 1表示玩家1的棋子 2玩家2的棋子 
 23     printboard(chessboard);
 24     int player;
 25     while(true)
 26     {    
 27         player=1;//1 表示玩家1,1先手 
 28         playgame(chessboard,player);
 29         player=2;//2 表示玩家2 
 30         playgame(chessboard,player);
 31     }
 32     return 0;
 33 }
 34 
 35 void printboard(int  chessboard[n][n])
 36 {    
 37 
 38     int i,j;
 39     for(i=0;i<n;i++)
 40         cout<<"  "<<i+1<<" ";
 41     cout<<endl;
 42     for(i=0;i<n;i++)
 43     {
 44         for(j=0;j<n;j++)
 45         {    
 46             if(chessboard[i][j]==1)
 47                 cout<<"|_o_"; //o表示玩家1棋子 
 48             else if(chessboard[i][j]==2)
 49                 cout<<"|_x_";//x表示玩家2棋子 
 50             else
 51                 cout<<"|___"; 
 52         }
 53         cout<<"|";
 54         cout<<" "<<i+1<<"  "<<endl<<endl;
 55     }
 56 }
 57 
 58 
 59 bool isvalid(string row,string col,int chessboard[n][n])
 60 {    
 61     int r=atoi(row.c_str());//字符串转int 
 62     int c=atoi(col.c_str());//如果不是纯数字字符串,则返回零,表示转换失败 
 63     if(r==0||c==0)//返回零,转换失败,输入不正确 
 64         return false;
 65     r--;//数组下标从零开始 
 66     c--;//而输入的行列是从1开始的,所以减一 
 67     
 68     //超过棋盘大小,输入无效 
 69     if(r<0||r>n||c<0||c>n)
 70         return false;
 71     //该位置不是空,输入无效 
 72     if(chessboard[r][c]!=0)
 73         return false;
 74     return true;
 75 }
 76 
 77 void playgame(int chessboard[n][n],int player)
 78 {    
 79     string row,col;
 80     cout<<"玩家 "<<player<<" 回合,输入下棋的位置(行 列): "; 
 81     cin>>row>>col;
 82     //直到输入有效则退出循环 
 83     while(isvalid(row,col,chessboard)==false)
 84     {
 85         cout<<"输入无效,棋盘的行或列不能超过棋盘大小 "; 
 86         cout<<"请再次输入"<<endl;
 87         cout<<"玩家 "<<player<<" 回合,输入下棋的位置(行 列): "; 
 88         cin>>row>>col;
 89     }
 90     int r=atoi(row.c_str());//sting 转 int 
 91     int c=atoi(col.c_str());
 92     r--;
 93     c--;
 94     if(player==1)//玩家1 
 95         chessboard[r][c]=1;
 96     else
 97         chessboard[r][c]=2;
 98         
 99     //打印本次棋盘 
100     printboard(chessboard);
101     //判断输赢 
102     judge(chessboard,r,c,player);
103 }
104 
105 void judge(int chessboard[n][n],int row,int col,int player)
106 {
107     int i;
108     int num[6]={0};
109     for(i=0;i<n;i++)
110     {    //判断行 
111         if(chessboard[row][i]==player)
112             num[0]++;
113         else 
114             num[0]=0; 
115         //等于5则赢    
116         if(num[0]==5)
117             break;
118             
119         //判断列 
120         if(chessboard[i][col]==player)
121             num[1]++;
122         else
123               num[1]=0;
124               
125         if(num[1]==5)
126             break;
127     }
128     //对角线,只需判断五个即可 
129     for(i=0;i<5;i++)
130     {    
131         //左上部分 
132         if(row-i>=0&&col-i>=0&&chessboard[row-i][col-i]==player)
133             num[2]++;
134         //右下部分 
135         if(row+i<n&&col+i<n&&chessboard[row+i][col+i]==player)
136             num[3]++;
137     }
138     
139     for(i=0;i<5;i++)
140     {    //右上部分 
141         if(row+i<n&&col-i>=0&&chessboard[row+i][col-i]==player)
142             num[4]++;
143         //左下部分 
144         if(row-i>=0&&col+i<n&&chessboard[row-i][col+i]==player)
145             num[5]++;
146     }
147     //这六个部分是否有连续相同5个棋子的 
148     for(i=0;i<6;i++)
149         if(num[i]==5)
150         {
151             cout<<"玩家 "<<player<<" 赢"<<endl;
152             exit(0);//退出程序 
153         }
154     //棋盘满,平局    
155     if(isfull(chessboard)==true)
156     {
157             cout<<"平局"<<endl;
158             exit(0);//退出程序 
159     }     
160 }
161 
162 bool isfull(int chessboard[n][n])
163 {    
164 
165     for(int i=0;i<n;i++)
166         for(int j=0;j<n;j++)
167             if(chessboard[i][j]==0)
168                 return false;
169     return true;
170 }