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

 更新时间:2021年06月06日 09:49:34   作者:两片空白  
这篇文章主要为大家详细介绍了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 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("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++ 构造函数的初始化列表

    c++ 构造函数的初始化列表

    构造函数的初始化列表仅仅指定用于初始化成员的值,并不指定这些初始化执行的次序。成员初始化的次序就是定义成员的次序,第一个成员首先被初始化,然后是第二个,依次类推
    2013-07-07
  • 基于VC中使用ForceInclude来强制包含stdafx.h的解决方法

    基于VC中使用ForceInclude来强制包含stdafx.h的解决方法

    本篇文章是对VC中使用ForceInclude来强制包含stdafx.h的解决方法进行了详细的分析介绍,需要的朋友参考下
    2013-05-05
  • C语言结构体成员赋值的深拷贝与浅拷贝详解

    C语言结构体成员赋值的深拷贝与浅拷贝详解

    C语言中的浅拷贝是指在拷贝过程中,对于指针型成员变量只拷贝指针本身,而不拷贝指针所指向的目标,它按字节复制的。深拷贝除了拷贝其成员本身的值之外,还拷贝成员指向的动态内存区域内容。本文将通过示例和大家详细说说C语言的深拷贝与浅拷贝,希望对你有所帮助
    2022-09-09
  • C++虚函数及虚函数表简析

    C++虚函数及虚函数表简析

    这篇文章主要介绍了C++虚函数及虚函数表,内容非常详细,思路清晰,需要的朋友可以参考下
    2015-08-08
  • 使用emacs编写C语言教程

    使用emacs编写C语言教程

    这篇文章主要介绍了使用emacs编写C语言教程,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-07-07
  • C++实现雷霆战机可视化小游戏

    C++实现雷霆战机可视化小游戏

    这篇文章主要为大家详细介绍了C++实现雷霆战机可视化小游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-11-11
  • C++图论之Bellman-Ford算法和SPFA算法的实现

    C++图论之Bellman-Ford算法和SPFA算法的实现

    贝尔曼-福特算法(Bellman-Ford)是由理查德·贝尔曼和莱斯特·福特创立的,求解单源最短路径问题的一种算法。SPFA 算法是 Bellman-Ford算法 的队列优化算法的别称,通常用于求含负权边的单源最短路径。本文将详解两个算法的实现,需要的可以参考一下
    2022-06-06
  • C语言中获取和改变目录的相关函数总结

    C语言中获取和改变目录的相关函数总结

    这篇文章主要介绍了C语言中获取和改变目录的相关函数总结,包括getcwd()函数和chdir()函数以及chroot()函数的使用方法,需要的朋友可以参考下
    2015-09-09
  • COLORREF,COLOR,RGB,CString的转化总结分析

    COLORREF,COLOR,RGB,CString的转化总结分析

    实际的软件开发过程中,常需要用到非.net平台的代码。这时候就可能碰到ColorRef(也就是以int类型代表的颜色值或是以DWORD值表示的颜色)。这跟.net平台下的颜色的相互转换MS并没有直接实现
    2013-09-09
  • 使用Libmicrohttpd搭建内嵌(本地)服务器的方法

    使用Libmicrohttpd搭建内嵌(本地)服务器的方法

    下面小编就为大家带来一篇使用Libmicrohttpd搭建内嵌(本地)服务器的方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-08-08

最新评论