C语言 -- 三子棋

本篇主要是用二维数组和多个函数来实现三子棋游戏。

让我们先来看看这个编写这个游戏的思路:首先要打印三子棋的棋盘,然后是玩家下棋,电脑下棋,最后判断谁赢了,或者看看是否平局。

我们用一个头文件 game.h ,一个源文件 game.c(主要的代码都在这里面哦!)和一个源文件测试文件 text.c(主要写整个游戏的具体思路)来编写我们的代码。

*首先我们看看头文件(game.h):

#ifndef __GAME_H__
#define __GAME_H__#include<stdio.h>
#include<stdlib.h>
#include<time.h>#define ROW 3  //行  自己可以改变棋盘的大小
#define COL 3  //列  同上(不能小于三哦)void init_board(char board[ROW][COL], int row, int col);
void print_board(char board[ROW][COL], int row, int col);
void player_move(char board[ROW][COL], int row, int col);
void computer_board(char board[ROW][COL], int row, int col);
char is_win(char board[ROW][COL], int row, int col);
//以上是后面源文件中需要调用的函数enum OPTION
{EXIT,PLAY
};
//枚举 #endif // ! __GAME_H__

*再来看看测试文件 (test.c):

#include"game.h"void menu()
{printf("             三子棋游戏            \n");printf("\n");printf("***********************************\n");printf("*******       1. play       *******\n");printf("*******       0. exit       *******\n");printf("***********************************\n");
}void game()
{int row = 0;int col = 0;char ret = '0';char board[ROW][COL] = { '0' };            //创建一个数组(棋盘)init_board(board, ROW, COL);               //初始化棋盘,使其都是空格。print_board(board, ROW, COL);              //打印棋盘while (1){player_move(board, ROW, COL);      //玩家下棋print_board(board, ROW, COL);  ret = is_win(board, ROW, COL);//判断输赢平局if (ret == 'X'){printf("恭喜你,赢了!\n");break;}else if (ret == 'Q'){printf("平局\n");break;}computer_board(board, ROW, COL);     //电脑下棋print_board(board, ROW, COL);ret = is_win(board, ROW, COL);//判断if (ret == 'O'){printf("电脑赢了!\n");break;}else if (ret == 'Q'){printf("平局\n");break;}}
}int main()
{int input = 0;srand((unsigned int)(time(NULL)));menu();                             //打印菜单do{printf("请选择:");scanf_s("%d", &input);switch (input){case PLAY:game();break;case EXIT:printf("退出游戏\n");break;default:printf("选择错误,请重新选择!\n");break;}} while (input);return 0;
}

*最后来看看最重要的 game.c ,让我们分部来看:

初始化数组,元素都是空格

void init_board(char board[ROW][COL], int row, int col)
{memset(board, ' ', sizeof(board[0][0]) * row * col);
}

不知道memset函数的点击这里 ==> 点击打开链接

接下来就要打印棋盘了,如下图(3*3棋盘),我们将它分成后面这个图看看。

                     

看红色的(横着看),发现最后一个红框里面比前面的少一个 ‘ | ’;

再看紫色的,发现最后一行比上面少底下一行;

观察完了,我们来实现代码

void print_board(char board[ROW][COL], int row, int col)
{int i = 0;int j = 0;for (i = 0; i < col; i++){for (j = 0; j < row; j++){printf(" %c ", board[i][j]);if (j != row - 1){printf("|");}}printf("\n");if (i != col - 1){for (j = 0; j < row; j++){printf("---");if (j != row - 1){printf("|");}}printf("\n");}   }
}

*玩家下棋

void player_move(char board[ROW][COL], int row, int col)
{int x = 0;int y = 0;while (1){printf("玩家走\n");printf("请输入你要下棋的坐标:");scanf_s("%d %d", &x, &y);if (((x > 0) && (x <= row)) && ((y > 0) && (y <= col)))   //下棋的坐标要在棋盘内。 {if (board[x - 1][y - 1] == ' ')                   //:玩家输入的坐标假如是(1 1),写代码的应该知道其实是(0 0){board[x - 1][y - 1] = 'X';break;}else{printf("输入的坐标已有棋子,请重新输入!\n");}}else{printf("输入棋子的坐标有误,请重新输入!\n");}}
}:玩家输入的坐标假如是(1 1),写代码的应该知道其实是(0 0){board[x - 1][y - 1] = 'X';break;}else{printf("输入的坐标已有棋子,请重新输入!\n");}}else{printf("输入棋子的坐标有误,请重新输入!\n");}}
}

*电脑下棋

void computer_board(char board[ROW][COL], int row, int col)
{printf("电脑走\n");while (1){int x = rand() % row;    //srand((unsigned int)(time(NULL))int y = rand() % col;if (board[x][y] == ' '){board[x][y] = 'O';break;}}
}

*判断输赢还有平局

char is_win(char board[ROW][COL], int row, int col)
{int x = 0;int y = 0;for (x = 1; x < row - 1; x++){for (y = 0; y < col; y++){if ((board[x][y] == board[x - 1][y]) && (board[x][y] == board[x + 1][y]) && board[x][y] != ' '){return board[x][y];}}}for (x = 0; x < row; x++){for (y = 1; y < col - 1; y++){if ((board[x][y] == board[x][y - 1]) && (board[x][y] == board[x][y + 1]) && board[x][y] != ' '){return board[x][y];}}}for (x = 1; x < row - 1; x++){for (y = 1; y < col - 1; y++){if (((board[x][y] == board[x - 1][y - 1]) && (board[x][y] == board[x + 1][y + 1]) && board[x][y] != ' ')|| ((board[x][y] == board[x - 1][y + 1]) && (board[x][y] == board[x + 1][y - 1])) && board[x][y] != ' ')return board[x][y];}}if (is_full(board, ROW, COL) == 1)    //判断棋盘是否满了(平局){return 'Q';   //表示棋盘满了}
}
static int is_full(char board[ROW][COL], int row, int col)
{int i = 0;for (i = 0; i < row; i++){int j = 0;for (j = 0; j < col; j++){if (board[i][j] == ' '){return 0;}}}return 1;
}

想想上面那段代码可以优化吗?

我们可以把玩家或者电脑下棋的坐标传过来,以这个坐标为中心判断输赢,就不用重新一个一个的找,一个一个判断。(可以自己试试哦!)

最后我们来看看结果(3*3棋盘)

再来看一个(5*5棋盘)

                     

好了,这样这个三子棋代码就完成了!学会了吗?

C语言小游戏——三子棋相关推荐

  1. C语言小游戏——三子棋(井字棋)

    文章目录 前言 一.前期准备 二.游戏整体结构及思路 1.程序主体结构: 2.代码解读 3.完整源代码 总结 前言 相信大家小时候都玩过井字棋小游戏,拿石子在地上画或是用笔在纸上画······今天我们 ...

  2. c语言小游戏 三子棋,C语言实现简单的三子棋小游戏

    学习完数组就能用C语言写出的简单小游戏: 编译器使用的为VS2013 代码分为三个部分 1.头文件 game.h 2.源文件 game.c 用来存放游戏中所有的函数 3.源文件 test.c 用来存放 ...

  3. 童年小游戏三子棋(C语言数组实现)

    目录 认识游戏 游戏框架 游戏实现 基本构思 棋子 棋盘 下棋 判断输赢 效果展示 全部代码 游戏效果 认识游戏 三子棋是黑白棋的一种.三子棋是一种民间传统游戏,又叫九宫棋.圈圈叉叉.一条龙.井字棋等 ...

  4. 简单小游戏------三子棋

    目录 前言 一.整体的逻辑 创建菜单 创建棋盘 打印棋盘 玩家下棋 电脑下棋 判断输赢 整合代码 game.c test.c game.h 总结 前言 经典数组游戏三子棋 一.整体的逻辑 1.创建菜单 ...

  5. 用c语言实现小游戏三子棋

    小游戏之三子棋 小游戏之三子棋 三子棋的基本玩法 游戏制作思路 制作步骤 1.菜单 2.初始化棋盘 3.打印棋盘 4.玩家下棋 5.电脑下棋 6.判断胜利 完整代码 ​​​​​​​小结 三子棋的基本玩 ...

  6. C语言小项目--三子棋小游戏

    学了这么长时间的C语言,你是否觉得没有一个没写过稍微长点的代码显得很没有成就感!不怕,今天带你做一个小游戏,领略一下写C和小游戏的快乐.写完记得给自己一个鼓励哦! 一.三子棋小游戏 想必大家都玩过三子 ...

  7. C语言趣味小游戏——三子棋

    全篇无任何废话,本文的解释大多数都在代码段中,所以一定要看代码,边看边学边理解. 这只是初学者入门的一个小游戏,不难懂,没有什么复杂的内容 可以先学习一下比三子棋还简单的猜数字小游戏 C语言趣味小游戏 ...

  8. C语言简易小游戏--三子棋

    小时候,在学校和小伙伴除了互相追逐着玩闹玩游戏以外,相信很多小伙伴们也有和朋友在课堂上拿一张纸玩井字棋的美好回忆.(如下图酱紫啦~) 那今天呢,我们就用C语言制作一款简易的井字棋来练习一下对代码的感觉 ...

  9. (超详解)C语言实现小游戏三子棋

    目录 一,实现目标 二,整体思路 1.创立三个文件:text.c(实现测试的逻辑)                                                            ...

最新文章

  1. 18常用web开发 浮动层、提示层代码下载
  2. 理解Golang的Time结构
  3. jmeter性能测试报告_用 JMeter 做接口测试的优劣浅析
  4. gcc的简单使用教程
  5. TDSQL迁移,myloader:39626报错问题的排查与解决
  6. 【超全教程】SpringBoot 2.3.x 分层构建 Docker 镜像实践
  7. python单选题库答案_大学慕课2020用Python玩转数据题库及答案
  8. 读赵凯华之《新概念物理教程.热学》
  9. PyCharm中英文版本切换
  10. 怎样快速将Word转长图
  11. linux重启数据库11g,linux下重启oracle数据库
  12. c语言相反数补码,求一个数的相反数的补码
  13. php 微信公众号自定义菜单栏,php实现微信公众号创建自定义菜单
  14. 进化的系统需要进化的系统工程
  15. 前端小白奋斗史03(css)
  16. X5腾讯内核 安装线上内核本来能用,突然报115错误问题记录
  17. 《敏捷开发一千另一夜》 读后感1
  18. C# 有符号整数 无符号整数
  19. 彩色图像RGB三通道问题探究
  20. 计算机视觉中的注意力机制

热门文章

  1. PKCS5Padding与PKCS7Padding的区别
  2. 用python倒序输出一个字符串_Python 反转字符串(reverse)的方法小结
  3. mysql timestamp 差值_MySQL中TIMESTAMPDIFF和TIMESTAMPADD函数的用法(两个日期之间的差值)...
  4. 整理计算机网络参考模型知识
  5. matlab的compass怎么用,Compass用法指南
  6. 调用支付jsapi缺少参数appid_服务商模式下的小程序微信支付
  7. android imagebutton 按下效果,Android 点击ImageButton时有“按下”的效果的实现
  8. mysql gno( )_MySql笔记(一)
  9. dueling dqn 和 double dqn_强化学习(十一)--DQN三个经典的变种
  10. php ahp和jhp,php7.4编译(centos)