小游戏:三子棋用C语言实现

你是否学完了C语言的函数、数组、选择结构、循环结构苦于没有实战小项目巩固自己所学的知识呢,今天小程序猿就给大家带来了一个游戏的小游戏——三子棋,利用C语言实现的,希望对大家能有所帮助。


我们大家大多都接触过棋类游戏,最常见的就是五子棋啦,今天我们简化游戏,只涉及到三子棋,两者思路是相同的,如果大家有兴趣在可以在接下来的思路上尝试实现五子棋。

文章目录

  • 小游戏:三子棋用C语言实现
  • 一、游戏规则:
  • 二、实现的思路
  • 三、代码讲解
    • 1.头文件
    • 2.调试部分
    • 3.游戏功能的具体实现

一、游戏规则:

三字棋的规则如下:
我们这里只谈论三子棋,依照这个思路也可以实现五子棋等多种棋类游戏 三子棋规则如下:游戏人和电脑轮流下棋,谁先让自己的三颗棋子连成一条直线获胜,如果棋盘下满则双方平局。


二、实现的思路

提到三子棋就必须要有棋盘,棋盘可以用一个二维数组来实现,因为我们将来数组所存储的内容将是我们的棋子,所以我们定义一个char型数组,下棋的位置可以输入坐标来决定,如果几个坐标对应数组元素的内容一样就表示哪一方获胜,其中涉及了选择分支语句和循环语句,具体实现如下:

三、代码讲解

1.头文件

头文件我们命名为game.h
众所周知,头文件中存放的内容是函数的声明,涉及到的库函数以及宏定义;
我所编写的头文件如下:

#pragma once
#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 display_board(char board[ROW][COL], int row, int col);
//玩家落子
void player_move(char board[ROW][COL], int row, int col);
//电脑落子
void computer_move(char board[ROW][COL], int row, int col);
//判断游戏的进行情况
char is_win(char board[ROW][COL], int row, int col);

这里唯一要注意的就是在宏定义#define ROW 3 后面一定没有分号。

2.调试部分

我们将主函数放在调试部分,命名给test.c,主要是程序的框架,不包含游戏主要功能的具体实现;
代码如下:

#define  _CRT_SECURE_NO_WARNINGS 1
#include "game.h"
#include "game.h"
void menu()
{printf("*********************************\n");printf("********      1. play    ********\n");printf("********      0. exit    ********\n");printf("*********************************\n");
}
void game()
{char ret = 0;char board[ROW][COL] = { 0 };init_board(board, ROW, COL);display_board(board, ROW, COL);while (1){player_move(board, ROW, COL);display_board(board, ROW, COL);ret = is_win(board, ROW, COL);if (ret != 'C')break;computer_move(board, ROW, COL);display_board(board, ROW, COL);ret = is_win(board, ROW, COL);if (ret != 'C')break;}if (ret == '*'){printf("玩家赢\n");}else if (ret == '#'){printf("电脑赢\n");}else if (ret == 'Q'){printf("平局\n");}display_board(board, ROW, COL);}
int main()
{int input = 0;srand((unsigned int)time(NULL));do{menu();printf("请选择:>");scanf("%d", &input);switch (input){case 1:game();break;case 0:printf("退出游戏\n");break;default:printf("选择错误,重新选择!\n");break;}} while (input);return 0;
}

既然是游戏就应该有菜单可供玩家选择,我们简单设计一个菜单;菜单只需要打印内容即可,所以菜单函数设计成void即可;
菜单模块如下;

void menu()
{printf("*********************************\n");printf("********      1. play    ********\n");printf("********      0. exit    ********\n");printf("*********************************\n");
}

游戏部分直接调用我们设计的函数,假设玩家棋子是*,电脑棋子是#,r变量ret表示游戏的进程,*表示玩家获胜,#表示电脑获胜,Q表示平局,c表示游戏继续;
代码如下:

void game()
{char ret = 0;char board[ROW][COL] = { 0 };init_board(board, ROW, COL);display_board(board, ROW, COL);//玩游戏while (1){player_move(board, ROW, COL);display_board(board, ROW, COL);ret = is_win(board, ROW, COL);if (ret != 'C')break;computer_move(board, ROW, COL);display_board(board, ROW, COL);ret = is_win(board, ROW, COL);if (ret != 'C')break;}if (ret == '*'){printf("玩家获胜\n");}else if (ret == '#'){printf("电脑获胜\n");}else if (ret == 'Q'){printf("平局\n");}display_board(board, ROW, COL);}

3.游戏功能的具体实现

游戏功能涉及到棋盘的初始化,棋盘的打印,玩家下棋,电脑下棋,棋盘是否占满的判断,游戏结果的判断六大功能,下面分模块进行讲解:

1.棋盘的初始化

void init_board(char board[ROW][COL], int row, int col)
{int i = 0;int j = 0;for (i = 0; i < row; i++){for (j = 0; j < col; j++){board[i][j] = ' ';}}
}

此处利用一个二维数组char board[ ][ ]实现对棋盘位置的存储,利用循环将每一个位置都初始化为空格。

2.棋盘的打印

void display_board(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++){printf(" %c ", board[i][j]);if (j < col - 1)printf("|");}printf("\n");if (i < row - 1){for (j = 0; j < col; j++){printf("---");if (j < col - 1)printf("|");}printf("\n");}}
}

此处将棋盘按照一种标准格式打印,利用循环打印出棋盘的轮廓,
效果图如下:

3.玩家下棋

void player_move(char board[ROW][COL], int row, int col)
{int x = 0;int y = 0;printf("玩家下棋:>\n");while (1){printf("请输入要下棋的坐标:>");scanf("%d %d", &x, &y);if (x >= 1 && x <= row && y >= 1 && y <= col){if (board[x - 1][y - 1] == ' '){board[x - 1][y - 1] = '*';break;}else{printf("该坐标被占用,请重新输入\n");}}else{printf("坐标非法,重新输入\n");}}
}

玩家下棋的功能就是利用x和y两个变量作为数组的下标,将对应数组的内容替换成玩家的棋子,同时玩家不能在已经有棋子的地方下棋,所以利用了判断语句,判断对应数组存放的内容是否是空格,如果是空格则表示可以在此处下棋,否则就表示坐标被占用了请玩家重新输入,同时如果输入的下标导致数组越界就提示坐标非法,重新输入。

4.电脑下棋

void computer_move(char board[ROW][COL], int row, int col)
{printf("电脑下棋:>\n");//0~32726//%3-->0~2while (1){int x = rand() % row;int y = rand() % col;if (board[x][y] == ' '){board[x][y] = '#';break;}}
}

电脑下棋我们采用rand函数,但是rand函数使用前要定义一个随机入口,就必须用到srand函数,srand函数参数要是一个无符号整型数据,我们用时间戳来作为它的参数,rand函数随机生成0~32726之间的数据,我们对rand函数取模%,就可以让变量x和y的范围锁定在0 ~2之间,如果数组对应的内容为空格则表示可以下棋,用#替换数组的内容。

5.棋盘是否占满的判断

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;
}

此处简单利用循环判断,如果棋盘满了,返回1,不满,返回0

6.结果的判断

char is_win(char board[ROW][COL], int row, int col)
{int i = 0;for (i = 0; i < row; i++){if (board[i][0] == board[i][1] && board[i][1] == board[i][2] && board[i][0] != ' '){return board[i][0];}}for (i = 0; i < col; i++){if (board[0][i] == board[1][i] && board[1][i] == board[2][i] && board[0][i] != ' '){return board[0][i];}}if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[1][1] != ' '){return board[1][1];}if (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[1][1] != ' '){return board[1][1];}//判断平局if (is_full(board, row, col) == 1){return 'Q';}//继续return 'C';
}

如果每一行每一列或者两个对角线上的元素都相同则表示一方获胜,如果都没有则表示平局,棋盘没有下满游戏继续。

7.游戏功能实现部分完整代码

#define  _CRT_SECURE_NO_WARNINGS 1
#include "game.h"
#include "game.h"void init_board(char board[ROW][COL], int row, int col)
{int i = 0;int j = 0;for (i = 0; i < row; i++){for (j = 0; j < col; j++){board[i][j] = ' ';}}
}
void display_board(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++){printf(" %c ", board[i][j]);if (j < col - 1)printf("|");}printf("\n");if (i < row - 1){for (j = 0; j < col; j++){printf("---");if (j < col - 1)printf("|");}printf("\n");}}
}void player_move(char board[ROW][COL], int row, int col)
{int x = 0;int y = 0;printf("玩家下棋:>\n");while (1){printf("请输入要下棋的坐标:>");scanf("%d %d", &x, &y);if (x >= 1 && x <= row && y >= 1 && y <= col){if (board[x - 1][y - 1] == ' '){board[x - 1][y - 1] = '*';break;}else{printf("该坐标被占用,请重新输入\n");}}else{printf("坐标非法,重新输入\n");}}
}
void computer_move(char board[ROW][COL], int row, int col)
{printf("电脑下棋:>\n");while (1){int x = rand() % row;int y = rand() % col;if (board[x][y] == ' '){board[x][y] = '#';break;}}
}
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;
}char is_win(char board[ROW][COL], int row, int col)
{int i = 0;for (i = 0; i < row; i++){if (board[i][0] == board[i][1] && board[i][1] == board[i][2] && board[i][0] != ' '){return board[i][0];}}for (i = 0; i < col; i++){if (board[0][i] == board[1][i] && board[1][i] == board[2][i] && board[0][i] != ' '){return board[0][i];}}if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[1][1] != ' '){return board[1][1];}if (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[1][1] != ' '){return board[1][1];}//判断平局if (is_full(board, row, col) == 1){return 'Q';}//继续return 'C';
}

以上便是三子棋所有功能实现的思路以及代码,希望对大家有所帮助,欢迎大家随时私信,如果对大家有帮助的话可以关注加三连,以后可以互相学习进步~

利用C语言巧妙实现棋类游戏——三子棋相关推荐

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

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

  2. linux 剪刀石头布c语言,利用C语言编写“剪刀石头布”小游戏

    前言 大家好~ 我是一名C语言初学者,学了C语言基础后,我制作了一个小游戏:剪刀石头布. 希望大家能对我的思路和代码提出小Tips(eg.更简便的方法与程序) 我也会虚心接受大家的建议~ 一.游戏原理 ...

  3. C语言人机大战之决战三子棋之巅

    文章目录 C语言人机大战之三子棋 一.游戏规则 二.游戏实现 (1)游戏界面 (2)游戏ing 初始化棋盘 打印棋盘 玩家落子 电脑落子 判断输赢 棋盘满否 三.代码总结 (1)game.h (2)t ...

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

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

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

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

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

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

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

    C语言 -- 三子棋 本篇主要是用二维数组和多个函数来实现三子棋游戏. 让我们先来看看这个编写这个游戏的思路:首先要打印三子棋的棋盘,然后是玩家下棋,电脑下棋,最后判断谁赢了,或者看看是否平局. 我们 ...

  8. C语言实现简单游戏 三子棋

    对基本C语言的知识有了一定的了解和认识,能够通过C语言编程解决一些简单的问题.使用C语言编程完成一个简单的游戏<三子棋>. 游戏简介:常见的3x3棋盘,有两名游戏玩家,在本版本中实现的效果 ...

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

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

最新文章

  1. 一个JS对话框,可以显示其它页面,
  2. yii2 ajax分页,Yii框架分页技术实例分析
  3. 基于COM的矢量图像控件VectorDraw
  4. ArcGis中这些你真的清楚么
  5. 提款机转账多久到账?
  6. lamp php用开吗,LAMP环境之PHP安装使用
  7. windows配置cmder
  8. 计算机中内存存储器最小单位,计算机中存储容量的最小单位和最基本单位是什么?...
  9. IE浏览器怎么查看cookie
  10. dreamweaver动漫HTML网站制作——海贼王主题网页1页海贼王我当定了(HTML+CSS)
  11. MACD、KDJ、DMA等常用技术指标的python实现
  12. 霜降后,宝宝穿衣要做到三捂两不捂
  13. arcgis 根据坐标定位
  14. cdh5.9运行mapreduce uber任务报java.lang.RuntimeException: native snappy library not available错误
  15. 现在这么卷,软件测试的岗位会越来越少吗?
  16. 名字空间的含义及作用
  17. 170 套各种公司网站模板软件公司网站模板企业网站模板创意设计公司网站模板html5网页静态模板Bootstrap扁平化网站源码css3手机seo自适响应
  18. 相干与非相干FSK解调和Viterbi软硬判性能的仿真对比
  19. Flutter学习笔记-主轴与交叉轴的对其方式
  20. 小数点化分数的过程_分数和小数互化教学评语

热门文章

  1. 计算机科学的创始人是谁,谁是计算机的父亲(两个)? . 谁是计算机科学的创始人?...
  2. java的字符串复制_java字符串常用方法
  3. MPC5744-PIT
  4. CentOS 查看隐藏文件的命令
  5. 科研论文写作FAQs
  6. 山东大学软件学院信息检索考试重点复习
  7. 前端捕捉轨迹_web端百度地图API实现实时轨迹动态展现
  8. python 如何自动生成exl_python如何做excel自动化
  9. myeclipse10激活注册码生成器代码
  10. 浅析国内云计算云主机现状市场