c/c++语言开发共享C语言实现双人五子棋游戏

本文实例为大家分享了c语言实现双人五子棋游戏的具体代码,供大家参考,具体内容如下实现功能生成棋盘玩家1与玩家2对战,哪个玩家率先有连续5子连线,哪个玩家赢。如何实现组成:二维数组:board[row]

c/c++开发分享C语言实现双人五子棋游戏实例为大家分享了c语言实现双人五子棋游戏的具体代码,供大家参考,具体内容如下

实现功能

生成棋盘玩家1与玩家2对战,哪个玩家率先有连续5子连线,哪个玩家赢。

C语言实现双人五子棋游戏

如何实现

组成:

二维数组:board[row][col],定义一个row*col的棋盘。

主要逻辑:

显示棋盘,提示用户下子,下子后判断

1.显示棋盘很简单,慢慢凑棋盘就好
2. 用户下子,注意两个条件:棋子在棋盘里,下子位置未被占用。
3.判断是最难的,

方法:从下子位置的8个方向(上,下,左,右,右上,右下,左上,左下)计算相同棋子数目,然后将对角的棋子数相加,等于5说明有5子连线

主要函数中用到三个主要实现函数:

  showboard(board, row, col);//展示棋盘  playermove(board, row, col, cur);//玩家下注,cur表示哪个玩家下子  judge(board, row, col);//判断5子连线  getcount(board[][col], row, col, dir)//计算方向dir相同棋子数  

代码

头文件

  #ifndef __fivechree_h__  #define __fivechee_h__      #include<stdio.h>  #include<windows.h>  #pragma warning(disable:4996)    #define row 10//棋盘行数  #define col 10//棋盘列数  #define init '*'//棋盘初始化    #define player1 1  #define player2 2  #define next 3//继续往下下  #define draw 4//棋盘下满 平局    //8个方向  #define up 10  #define right_up 11  #define right 12  #define right_down 13  #define down 14  #define left_down 15  #define left 16  #define left_up 17    extern void menu();  extern void game();    #endif

main函数源文件

  #include"fivechree.h"  int main(){   int quit = 0;   while (!quit){    menu();    int select = 0;    scanf("%d", &select);    switch (select){    case 1:     game();     break;    case 2:     quit = 1;     break;    default:     printf("enter error!n");     break;         }     }   printf("byebyen");   system("pause");   return 0;  }

函数定义源文件

  #include"fivechree.h"    static int x = 0;  static int y = 0;    void menu(){   printf("+---------------------+n");   printf("+- 1.play    2.exit  -+n");   printf("+---------------------+n");   printf("please enter your select#");    }  static void showboard(int board[][col], int row, int col){//展示棋盘 o玩家1棋子,x玩家2棋子   system("cls");   for (int i = 0; i < row; i++){    for (int j = 0; j < col; j++){     switch (board[i][j]){     case player1:      board[i][j] = 'o';      break;     case player2:      board[i][j] = 'x';      break;     case 0:      board[i][j] = init;      break;     default:      break;     }    }   }   printf("  ");   for (int i =1; i <= row; i++){    printf("%2d ", i);   }   printf("n");   for (int i = 1; i <= row; i++){    printf("%-2d", i);    for (int j = 1; j <= col; j++){     printf(" %c ", board[i - 1][j - 1]);    }    printf("n");   }  }    static void playermove(int board[][col], int row, int col, int who){//玩家下子,who 为哪个玩家下子   while (1){    printf("please enter player%d postion<x,y>#", who);    scanf("%d %d", &x, &y);    if (x<1 || x>row || y<1 || y>col){  //超过棋盘范围     printf("postion is error!n");     continue;    }    if (board[x - 1][y - 1] == init){//判断位置是否已被下子     board[x - 1][y - 1] = who;     break;    }    printf("postion is not emptyn");   }    }    static int getcount(int board[][col], int row, int col, int dir){//判断8个方向相同棋子的数目   int _x = x;//_x,_y变化,后面与x,y棋子相比较   int _y = y;   int count = 0;   while (1){    switch (dir){    case up:     _x--;     break;    case down:     _x++;     break;    case left:     _y--;     break;    case right:     _y++;     break;    case right_up:     _x--, _y++;     break;    case right_down:     _x++, _y++;     break;    case left_down:     _x++, _y--;     break;    case left_up:     _x--, _y--;     break;    default:     break;    }    if (_x>=1 || _x<=row || _y>=1 || _y<=col){//棋子不能越界     if (board[x-1][y-1] == board[_x-1][_y-1]){      //printf("yesn");      count++;     }     else{      //printf("non");      break;     }    }    else{     return count;    }       }   return count;  }  //如何判断:从下子位置的8个方向(上,下,左,右,右上,右下,左上,左下)  //计算相同棋子数目,然后将对角的棋子数相加,等于5说明有5子连线  static int judge(int board[][col], int row, int col){   int count1 = getcount(board, row, col, up)    + getcount(board, row, col, down);   //printf("%dn", count1);   if (count1 >= 4){    return board[x-1][y-1];   }   count1 = getcount(board, row, col, right_up)    + getcount(board, row, col, left_down);   //printf("%dn", count1);   if (count1 >= 4){    return board[x-1][y-1];   }   count1 = getcount(board, row, col, right)    + getcount(board, row, col, left);   //printf("%dn", count1);   if (count1 >= 4){    return board[x-1][y-1];   }   count1 = getcount(board, row, col, right_down)    + getcount(board, row, col, left_up);   if (count1 >= 4){    return board[x-1][y-1];   }     for (int i = 0; i < row; i++){//判断棋盘是否下满    for (int j = 0; j < col; j++){     if (board[i][j] == init){      return next;     }    }   }   return draw;  }      void game(){   int board[row][col] = { 0 };   //memset(board, init, row*col);   int result = 0;   int cur = player1;   showboard(board, row, col);//先展示棋盘   while (1){    //showboard(board, row, col);    playermove(board, row, col, cur);    showboard(board, row, col);//棋盘将board数组变化,所以要在判断前将数组变化    result = judge(board, row, col);    if (result != next){     break;    }    cur = (cur == player1 ? player2 : player1);//三目表达式,注意不是 player1 ? player2 : player1   }     showboard(board, row, col);   switch (result){   case 'o':    printf("player1 win!n");    break;   case 'x':    printf("player2 win!n");    break;   case draw:    printf("tie game!n");    break;   default:    //printf("%cn", result);    printf("bugn");    break;   }  }

以上就是c/c++开发分享C语言实现双人五子棋游戏的全部内容,希望对大家的学习有所帮助,也希望大家多多支持<计算机技术网(www.ctvol.com)!!>。

需要了解更多c/c++开发分享C语言实现双人五子棋游戏,都可以关注C/C++技术分享栏目—计算机技术网(www.ctvol.com)!

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

ctvol管理联系方式QQ:251552304

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

(0)
上一篇 2021年6月7日
下一篇 2021年6月7日

精彩推荐