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

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

实现功能

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

如何实现

组成:

二维数组: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 17extern 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("Byebye\n"); 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 empty\n"); }}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("yes\n");    count++;   }   else{    //printf("no\n");    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("%d\n", count1); if (count1 >= 4){  return board[x-1][y-1]; } count1 = Getcount(board, row, col, RIGHT_UP)\  + Getcount(board, row, col, LEFT_DOWN); //printf("%d\n", count1); if (count1 >= 4){  return board[x-1][y-1]; } count1 = Getcount(board, row, col, RIGHT)\  + Getcount(board, row, col, LEFT); //printf("%d\n", 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("%c\n", result);  printf("BUG\n");  break; }}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。

旅行要学会随遇而安,淡然一点,走走停停,

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

相关文章:

你感兴趣的文章:

标签云: