C语言版五子棋游戏的实现代码

 更新时间:2021年07月29日 11:30:07   作者:泾箐  
这篇文章主要为大家详细介绍了C语言版五子棋游戏的实现代码,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

这次看了几位大佬的做法,我们也做了很多修改尝试。算是第一次尝试合作完成项目。

我认为学到的东西:

1、第一次尝试写项目,把函数分到不同的.c文件中后更好看了一些。
2、在研究过程中应该分清主次。代码正确运行才是基础要求,其他什么美化界面,调字体调颜色都并非重点。
3、从代码中学到的,①是采用落子数来判断该轮到黑方下还是白方下(落子数为2的倍数时黑方下,否则白方下),这样也能判断出是哪一方胜利,而且落子数还可以判断棋盘是否下满(==16*16时棋盘落满,平局) ②是胜利条件的判断,以中间子为参考,看两边的四个子是否和他颜色相同。

规则

在一个1616的棋盘上,黑白双方交替落子,每次落下子后如果棋盘上出现了五个同色棋子横向/竖向/斜向连接,则该方胜利。如果在棋盘下满后(即下了1616个子后)仍未分出胜负,则为平局。

逻辑

初始化棋盘,是一个16*16的二维数组(定义宏 N=16),一开始每一格都初始化为0。用一个不断++的落子数变量%2来判断本回合是黑方下还是白方下,;每次玩家输入横纵坐标,该处的变量值改变(黑子为1,白子为2)。每次落子判断全盘是否有五子连珠,如果有则结束游戏,如果没有则继续下。当落子数达到N*N即棋盘下满,还没有出现五子连珠时,则判断为平局,结束游戏。

五子棋胜负条件判断

判断原理:

胜负的判断是在每颗棋子落下之后进行,所以用这一子的坐标为基准前后左右斜各个方向来看是否取胜。

具体思想:

按照五子棋规则,当一方的棋子,在横向,纵向或斜向连续五个均为同一用户的棋子时,代表胜利。
另外,胜利判断只需要在一个新子落子时判断,且仅需要判断新子所在的四条线上(纵横加两个斜线)是否满足条件即可。
所以,可以以新子坐标为基准点,判断四次。
比如横向的,需要判断左侧和右侧连续的同类棋子个数,如果左侧+右侧+1(自身)总数>=5,则为胜利。
在判断胜利的时候,首先我们要排除空子的情况,然后当两个斜线的时候, 无胜情况下,判断直线,当为两斜线及直线无胜情况下,判断横线。

参考代码如下:

int win()
{
 extern int arr[100][100];
 int k = 0,l = 0;
 int flag = 0; 
 for(k=2;k<N-2;k++) 
  for(l=2;l<N-2;l++)
  {
   if(arr[k][l]!=0&&arr[k-2][l-2]==arr[k][l]&&arr[k-1][l-1]==arr[k][l]&&arr[k+1][l+1]==arr[k][l]&&arr[k+2][l+2]==arr[k][l])
   {
    flag=1;
    break;
   }
   if(arr[k][l]!=0&&arr[k+2][l-2]==arr[k][l]&&arr[k+1][l-1]==arr[k][l]&&arr[k-1][l+1]==arr[k][l]&&arr[k-2][l+2]==arr[k][l])
   {
    flag=1;
    break;
   }
  }
 if(flag==0) 
  for(k=0;k<N;k++)
   for(l=2;l<N-2;l++)
   {
    if(arr[k][l]!=0&&arr[k][l-2]==arr[k][l]&&arr[k][l-1]==arr[k][l]&&arr[k][l+1]==arr[k][l]&&arr[k][l+2]==arr[k][l])
    {
     flag=1;
     break;
    }
   }
 if(flag==0) 
  for(k=2;k<N-2;k++)
   for(l=0;l<N;l++)
   {
    if(arr[k][l]!=0&&arr[k+2][l]==arr[k][l]&&arr[k+1][l]==arr[k][l]&&arr[k-1][l]==arr[k][l]&&arr[k-2][l]==arr[k][l])
    {
     flag=1;
     break;
    }
   }
 return flag; 
}

注:

1.中的arr[k][l]!=0是排除空子的情况。
2.最后返回判断结果时, 有胜为1,无为0,谁胜无必要判断,因为,谁尾手了的一定是胜的。

演示

开始

输入坐标

第二回合

游戏结束

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

相关文章

  • C++中的内存分区介绍

    C++中的内存分区介绍

    这篇文章主要介绍了C++中的内存分区介绍,C++的内存划分为栈区、堆区、全局区/静态区、字符串常量和代码区,本文分别对他们一一说明,需要的朋友可以参考下
    2015-07-07
  • 轻松实现C/C++各种常见进制相互转换

    轻松实现C/C++各种常见进制相互转换

    这篇文章主要介绍了轻松实现C/C++各种常见进制相互转换,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-11-11
  • VC6.0常用快捷键大全

    VC6.0常用快捷键大全

    这篇文章主要介绍了VC6.0常用快捷键大全,非常实用,需要的朋友可以参考下
    2014-08-08
  • C++ Boost PropertyTree示例超详细讲解

    C++ Boost PropertyTree示例超详细讲解

    Boost是为C++语言标准库提供扩展的一些C++程序库的总称。Boost库是一个可移植、提供源代码的C++库,作为标准库的后备,是C++标准化进程的开发引擎之一,是为C++语言标准库提供扩展的一些C++程序库的总称
    2022-11-11
  • 关于C语言指针赋值的问题详解

    关于C语言指针赋值的问题详解

    本篇文章是对C语言指针赋值的问题进行了详细的分析介绍,需要的朋友参考下
    2013-05-05
  • C语言中#if的使用详解

    C语言中#if的使用详解

    #if和#endif是一组同时使用的,叫做条件编译指令。#if与#define、#include等指令一样是由预处理器这个强大的工具处理的,预处理器可以在编译前处理c程序,这篇文章主要介绍了C语言中#if的使用,需要的朋友可以参考下
    2022-11-11
  • C++相交链表和反转链表详解

    C++相交链表和反转链表详解

    这篇文章主要介绍了C++相交链表和反转链表,结合实例形式分析了C++相交链表和反转链表的原理、实现方法及相关注意事项,需要的朋友可以参考下
    2021-08-08
  • C++快速排序算法简明理解

    C++快速排序算法简明理解

    快速排序由于排序效率在同为O(N*logN)的几种排序方法中效率较高,因此经常被采用,再加上快速排序思想----分治法也确实实用,因此很多软件公司的笔试面试,包括像腾讯,微软等知名IT公司都喜欢考这个,还有大大小的程序方面的考试如软考,考研中也常常出现快速排序的身影
    2022-05-05
  • C++模板 index_sequence使用示例详解

    C++模板 index_sequence使用示例详解

    这篇文章主要为大家介绍了C++模板 index_sequence使用示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-12-12
  • C++中rapidjson将map转为json的方法

    C++中rapidjson将map转为json的方法

    今天小编就为大家分享一篇关于C++中rapidjson将map转为json的方法,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-04-04

最新评论