c/c++语言开发共享小游戏二之—————五子棋

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 }

 

本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

ctvol管理联系方式QQ:251552304

本文章地址:https://www.ctvol.com/c-cdevelopment/600097.html

(0)
上一篇 2021年5月9日
下一篇 2021年5月9日

精彩推荐