纯C语言实现五子棋

正在考虑增加一个MFC界面。不是人机对战的。

五子棋.c

//date 2014年7月7日09:53:24
//willows
//五子棋

#define _CRT_SECURE_NO_WARNINGS

#include <stdio.h>
#include <stdlib.h>
#include <assert.h>

//棋盘初始化函数
//Chessboard棋盘数组,ln=棋盘大小,成功返回Chessboard,不成功NULL
void init_Chessboard(char Chessboard[][7], int ln)
{
  if ((Chessboard != NULL) && (ln>0)){
    int i = 0, j = 0;
    for (i = 0; i<ln; ++i){
      for (j = 0; j<ln; ++j){
        Chessboard[i][j] = '\t';
      }
    }
  // return Chessboard;
  }
// return NULL;
}

//显示棋盘函数
void show_Chessboard(char Chessboard[][7], int ln)
{
  assert((Chessboard != NULL) && (ln > 0));

  int i = 0, j = 0;
  for (i = 0; i<ln; ++i){
    putchar('\t');
    putchar(i + '0');
  }//end for1
  putchar('\n');
  putchar('\n');

  for (i = 0; i<ln; ++i){
    putchar(i + '0');
    for (j = 0; j<ln; ++j){
      if ('\t' == Chessboard[i][j]){
        putchar(Chessboard[i][j]);
      }
      else
      {
        putchar('\t');
        putchar(Chessboard[i][j]);
      }

    }
    putchar('\n');
    putchar('\n');
  }//end for2
}

//棋子下子函数
//下子成功返回1,不成功返回0
int play(char Chessboard[][7], int ln, int x, int y, char ChessPieces)
{
  assert(Chessboard); //ChessPieces=NULL跳出
  if ((x<ln) && (y<ln) && (x >= 0) && (y >= 0)){
    if ('\t' == Chessboard[x][y]){

      Chessboard[x][y] = ChessPieces;
      return 1;  //成功
    }
    else
    {
      return 0;
    }//end if2
  }//end if1
  return 0;
}

//满盘判断
//棋盘满了判断//满了就返回-1
int full_Chess(char Chessboard[][7], int ln)
{
  int i = 0, j = 0;
  for (i = 0; i<ln; ++i){
    for (j = 0; j<ln; ++j){
      if ('\t' == Chessboard[i][j]){
        return 0;  //棋盘未满
      }//end if
    }//end for j
  }//end for i

  return 1;//棋盘满了

}

//是否连成五子线判断函数
//Chessboard=棋盘数组,ln=棋盘宽度,(XS,YS)方向判断起点坐标,(dx,dy)方向增量标记
//连成线返回1,没有返回0
int judga_line(char Chessboard[][7], int ln, int XS, int YS, int dx, int dy)
{
  assert((Chessboard != NULL) && (ln > 0));
  if((XS <ln) && (YS<ln)  //起点坐标在棋盘内
    && (XS >=0) && (YS >=0)
    && (dx != 0 || dy != 0))        //坐标增量不为同时0
  {

    if (((XS + dx * 4) > ln) || ((XS + dx * 4)<0) || //判断终点坐标
      ((YS + dy * 4)>ln) || ((YS + dy * 4) < 0) || //在棋盘外
      ('\t' == Chessboard[XS][YS]))
    {
        return 0;  //不在棋盘内,或者起点是没下子
    }
    else
    {
      int i = 0;
      for (i = 1; i < 5; ++i){
        if (Chessboard[XS][YS] != Chessboard[XS + (dx * i)][YS + (dy * i)])
        {
          return 0;  //如果不是连续5个一样的
        }//end if3
      }//end for1
      return 1;  //五个都一样,且都在棋盘内
    }//end if 2
  }
  return 0;  //其他情况
}

//裁判函数
//Chessboard 棋盘数组,ln=棋盘宽度
//赢了返回1,否则返回0
int judga(char Chessboard[][7], int ln)
{
  assert((NULL != Chessboard) && (ln>0));
  int i = 0, j = 0;
  //纵向成五子连线判断
  for (i = 0; i<(ln - 4); ++i){
    for (j = 0; j<ln; ++j){
      if (judga_line(Chessboard, ln, i, j, 1, 0)){
        return 1;
      }
    }//end for_j
  }//end for_i

    //横向成五子连线判断
  for (i = 0; i<ln; ++i){
    for (j = 0; j<(ln - 4); ++j){
      if (judga_line(Chessboard, ln, i, j, 0, 1)){
        return 1;
      }
    }//end for_j
  }//end for_i

    //左上到右下成五子连线判断
  for (i = 0; i<(ln - 4); ++i){
    for (j = 0; j<(ln - 4); ++j){
      if (judga_line(Chessboard, ln, i, j, 1, 1)){
        return 1;
      }
    }//end for_j
  }//end for_i

    //左下到右上成五子连线判断
  for (i = ln-1; i>(ln-4); --i){
    for (j = 0; j <(ln - 4); ++j){
      if (judga_line(Chessboard, ln, i, j, -1, 1)){
        return 1;
      }
    }//end for_j
  }//end for_i

  return 0;  //没能赢
}

//主函数

int main()
{
  char CB[7][7];
  char nameA[50] = "玩家A";
  char nameB[50] = "玩家B";
  int x = -1, y = -1;
  //初始化
  init_Chessboard(CB, 7);

  printf("请输入玩家A的名字:");
  scanf("%s", nameA);

  printf("请输入玩家B的名字:");
  scanf("%s", nameB);

  //显示棋盘
  show_Chessboard(CB, 7);

  while (1){
    //判断是否棋盘已满
    if (full_Chess(CB, 7)){
      puts("\n棋盘已满,下次再战!");
      break; //跳出最外层while
    }//end if

    //玩家A下子
    while (1){
      printf("\n请玩家 %s 下子 @\n", nameA);
      printf("棋子行坐标X=");
      scanf("%d", &x);
      printf("棋子列坐标Y=");
      scanf("%d", &y);

      if (play(CB, 7, x, y, '@')){  //@ ascii=64
        break;   //下子成功
      }
      else
      {
        puts("下子失败,请重新选定位置下子");
        continue;  //下子不成功,重新下子
      }//end if
    }//end while A

    //显示棋盘
    show_Chessboard(CB, 7);

    //判断玩家A是否胜利
    if (judga(CB, 7)){
      printf("\n恭喜玩家 %s 成功取得胜利!!鲜花\n", nameA);
      getchar();
      getchar();
      break; //跳出最外层while
    }//不用下了

    //玩家B下子
    while (1){
      printf("\n请玩家 %s 下子 O\n", nameB);
      printf("棋子行坐标X=");
      scanf("%d", &x);
      printf("棋子列坐标Y=");
      scanf("%d", &y);

      if ((play(CB, 7, x, y, 'O'))){ //O ascii=79
        break;   //下子成功
      }
      else
      {
        puts("下子失败,请重新选定位置下子");
        continue;  //下子不成功,重新下子
      }//end if

    }//end while B

    //显示棋盘
    show_Chessboard(CB, 7);

    //判断玩家B是否胜利
    if (judga(CB, 7)){
      printf("\n恭喜玩家 %s 成功取得胜利!! 鲜花\n", nameA);
      getchar();
      getchar();
      break; //跳出最外层while
    }//不用下了

  }

  return 0;

}

以上所述就是本文的全部内容了,希望大家能够喜欢。

(0)

相关推荐

  • C++面向对象实现五子棋小游戏

    尽量将面向对象的思想融入进程序中 ChessBoard.h //ChessBoard.h #pragma once #define ROW 15 #define COL 15 #include<iostream> using namespace std; class ChessBoard//棋盘类 { public: char m_cSquare[ROW][COL]; public: ChessBoard(); void show(); }; ChessBoard.cpp //ChessBoa

  • C++程序设计-五子棋

    前言:很多刚刚接触编程的人都不知道怎么下手编写程序,特别是学习了新的知识点,不知道有什么用,那么本文将以简单的存储结构及简单的运算,条件语句,分支语句,循环语句结合,带来一个双人对战版五子棋,这是一个简单的模型,实现了五子棋最最基本的功能,还有好多地方需要补全,如边界问题,设计问题,游戏逻辑问题,希望读者阅读后能够注意,通过自己的努力来完善它,还能扩展各种功能,如悔棋,网络对战等,有时候写程序和小生命一样,慢慢会成长,而我们作为"父母"的看到自己的小宝宝成为有用之才,过程之欣喜特别棒!

  • 基于C++和MFC开发象棋程序

    这是我要和大家分享的基于C++和MFC开发的一个象棋程序,目的是练习编程实践和大家分享同时希望大家能给出指教. 进入主题 一.棋盘分析 这是我绘制的棋盘,棋盘的组成由9条竖线和10条横线构成.这儿我们设置每条线间的间隔是50. 二.绘制过程 1.在vs中新建MFC程序,去除环境自动生成的按钮和文字. 2.打开***Dlg.cpp文件,在void CChessDlg::OnPaint()中定义一个棋盘间隔值和绘图设备CDC *cd = CWnd::GetDC(); int nWid = 50; C

  • C语言实现五子棋小游戏

    首先我们先来看一个稍微简单些的实现方式: #include <stdio.h> #include <stdlib.h> #define N 15 int chessboard[N + 1][N + 1] = { 0 }; int whoseTurn = 0; void initGame(void); void printChessboard(void); void playChess(void); int judge(int, int); int main(void) { init

  • 基于C语言实现五子棋游戏完整实例代码

    本文实例讲述了基于C语言实现五子棋游戏的方法,代码备有比较完整的注释,可以帮助读者更好的加以理解. 五子棋游戏代码如下: /* * 使用键盘的上下左右键移动棋盘,空格键表示下棋,ESC键退出程序 */ #include <stdio.h> #include <stdlib.h> #include <bios.h> #include <graphics.h> #include<malloc.h> /* * 对应键盘键的十六进制数字 */ #defi

  • 纯C语言实现五子棋

    正在考虑增加一个MFC界面.不是人机对战的. 五子棋.c //date 2014年7月7日09:53:24 //willows //五子棋 #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> #include <assert.h> //棋盘初始化函数 //Chessboard棋盘数组,ln=棋盘大小,成功返回Chessboard,不成功NULL void init_Chessboa

  • C语言实现五子棋游戏

    本文实例为大家分享了C语言实现五子棋的具体代码,供大家参考,具体内容如下 #include <stdio.h> #include <bios.h> #include <ctype.h> #include <conio.h> #include <dos.h> #define CROSSRU 0xbf /*右上角点*/ #define CROSSLU 0xda /*左上角点*/ #define CROSSLD 0xc0 /*左下角点*/ #defin

  • C语言编写五子棋游戏

    本文实例为大家分享了C语言编写五子棋游戏的具体代码,供大家参考,具体内容如下 一.构建棋盘 首先可以用一个二维数组来构建棋盘,下标表示位置,内容表示黑子白子或者空位.当数组内容为1时,该位置为白字,当数组为0时,该位置为白子,空位输出+ int w[11][11], flag = 0; int a, b; for (int k = 0; k < 11; k++) printf("第%d列\t", k); printf("\n"); for (int i = 0

  • 用C语言实现五子棋游戏

    C语言写五子棋,使用多文件形式,使用代码看起来更好看:在这里我实现的功能是双人博弈,如果要实现人机对战,那么代码就会很复杂: 一.main.c 在主调函数中首先要提供一个给用户选择的界面,在这里我们假定选择1为开始游戏,2为退出游戏,代码如下: #include "gobang.h" void Mean(){ printf("-----------------------\n"); printf(" 1.play 2.drop up\n"); p

  • 纯c语言优雅地实现矩阵运算库的方法

    目录 1.一个优雅好用的c语言库必须满足哪些条件 2.实现一个矩阵运算库的几点思考 (1)采用预定义的数据类型,避免直接使用编译器定义的数据类型 (2)基于对象编程,定义矩阵对象 (3)除了特别编写的内存处理函数(使用栈链表保存.释放动态分配的内存地址),不允许任何函数直接分配和释放内存 (4)防御性编程,对输入参数做有效性检查,并返回错误号 (5)注意编程细节的打磨 3.完整c程序 参考资料 编程既是技术输出也是艺术创作.鉴赏高手写的程序,往往让人眼前一亮,他们思路.逻辑清晰,所呈现的代码简洁

  • 利用C语言实现五子棋游戏

    本文实例为大家分享了C语言实现五子棋游戏的具体代码,供大家参考,具体内容如下 一.前言 本文将先介绍五子棋运行所需要的函数,最后串联成完整代码. 我们需要实现的功能有:1.菜单menu函数 2.初始化棋盘Initboard函数 3.显示棋盘Displayboard函数 4.实现人机.人人模式的选择 5.落子函数 playermove  computermove 6.判断输赢ifwin函数 先来看看运行效果吧! 二.头文件 #define _CRT_SECURE_NO_WARNINGS #incl

  • C语言实现五子棋功能全解析

    目录 1.game.h 2.test.c 3.game.c 4.游戏功能详解 (1).棋盘初始化 (2).棋盘的打印 (3).玩家下棋 (4).电脑下棋 (5).判断游戏输赢 (6).判断棋盘是否满了 5.AI算法下棋 (1).判断自己是否会赢(CheckComputer) (2).对玩家进行拦截(CheckPlayer) (3).加入AI算法后game.c的改动 1.game.h game.h:自定义头文件,用于: 库函数头文件的包含 符号与结构的声明 函数的定义 //防止头文件被重复包含 #

  • C语言实现五子棋对战系统

    本文实例为大家分享了C语言实现五子棋对战的具体代码,供大家参考,具体内容如下 一直以来,有不少热爱并希望学习五子棋的人,或者仅为了娱乐来下五子棋的人,他们一般通过下棋对战来增加自己的对战经验,而在现实生活由于五子棋布板麻烦,经常缺少能下棋的环境,并且下棋时效率较低,记录步数也较为麻烦.利用计算机来模拟下五子棋环境,只要有计算机,就可以很方便的随时随地进行下棋,并且对战过程中对步数和下子过程进行记录,方便了喜欢下五子棋的人,让他们的五子棋学习更加高效或者娱乐起来更加方便. #include <st

随机推荐