前言

相信大家在学习C语言的过程中,有时会感觉到有一些枯燥切乏味,今天就在这里教大家用C语言实现一个简单的小游戏三子棋,这个项目不需要很多的基础,只要学到了数组便可以实现,让我们在学习C语言的过程中可以获得更大的乐趣

新建工程

此次工程分为三个文件来进行实现

分别为

新建头文件 game.h(用于进行函数声明,引用头文件)

新建源文件 game.c(游戏接口函数的实现)

test.c(用于测试接口函数功能,主函数)

如下图所示

游戏逻辑分析

首先,这个游戏是由玩家和电脑进行对局,玩家下棋后再由电脑下,当有任意一行三子连成一条线的时候便游戏结束判断胜利,因此在每一次落子之后便要进行判断胜负,若不分胜负,则平局,平局的判断条件便是当棋盘上的所有格子都有落子,但并没有三个连在一起的棋子。

游戏实现

三子棋是一个比较简单的游戏,所以游戏实现也比较的简单。

菜单

首先,在打开一个程序之后,首先映入眼帘的便是程序的主菜单,

//菜单界面
void menu()
{printf("*********************\n");printf("********1.play*******\n");printf("********2.exit*******\n");printf("*********************\n");
}
//定义菜单枚举变量
enum menu
{PLAY = 1,EXIT
};

设计棋盘

在这个比较基础性的游戏中,没有引用界面库,是通过键盘输入进行游戏,所以我们要用字符来组成一个棋盘,用一个3x3的数组来存放棋子,

棋盘样式|     |
-----|-----|-----|     |
-----|-----|-----|     |     
//打印棋盘
void playboard(char board[ROW][COL])
{int i, j;for (i = 0; i < COL; i++){for (j = 0; j < ROW; j++){printf("  %c  ", board[i][j]);if (j != ROW - 1)printf("|");}printf("\n");for (j = 0; j < ROW; j++){if (i != COL - 1)printf("-----");if (j != ROW - 1&& i != COL - 1)printf("|");}printf("\n");}
}

初始化棋子

在设计棋盘时我们将棋子设置成为了一个3x3的二维数组,在没有任何落子的时候所显示的效果是空白的,所以我们要将一开始的棋子都初始化为空格,下面为初始化棋子的代码实现

//初始化棋子
void IniBoard(char board[COL][ROW])
{int i, j;for (i = 0; i < COL; i++)for (j = 0; j < ROW; j++)board[i][j] = ' ';
}

实现落子

在三子棋中我们将’o‘的落子设置为玩家,’x‘设置为电脑落子,在输入想要落子对应的坐标后,便改变对应的变量为所落的棋子,并判断输入的坐标是否符合要求,在界定范围内,也没有下过棋子,以下分别为玩家和电脑落子的代码实现

//玩家下
void playermove(char board[COL][ROW])
{int x, y;do{printf("请选择您要下的的坐标(格式:行 列)\n");scanf("%d%d", &x, &y);if (x > 0 && x <= COL && y > 0 && y <= ROW && board[x-1][y-1] == ' '){board[x - 1][y - 1] = 'o';break;}elseprintf("坐标非法,请重新输入\n");} while (1);
}
//电脑下
void computermove(char board[COL][ROW])
{do{int x = rand() % 3;int y = rand() % 3;if (board[x][y] == ' '){board[x][y] = 'x';break;}} while (1);
}

判断胜负

在三子棋中每一次落子可能都会决出胜负,为了简化代码提高运行效率,我们以不同的返回值来判断一次落子后胜负,返回'o'则玩家胜利,返回'x'则电脑胜利,返回'D'平局,'C'继续游戏,以下便是判断函数的代码实现。

//判断胜负
char judge(char board[COL][ROW])
{int i, j;for (i = 0; i < COL; i++)if ((board[0][i] == board[1][i] && board[1][i] == board[2][i])|| (board[i][0] == board[i][1] && board[i][1] == board[i][2]))return board[1][i];if ((board[0][0] == board[1][1] && board[1][1] == board[2][2]) || (board[0][2] == board[1][1] && board[1][1] == board[2][0]))return board[1][1];for(i=0;i<ROW;i++)for (j = 0; j < COL; j++){if (board[i][j] == ' ')return 'C';}return 'D';
}

整合接口函数实现游戏

在所需要的接口函数全部实现后,便可以实现整个游戏,写入test.c源文件中进行测试,将游戏的流程整合实现,代码如下。

#include"game.h"
int main()
{srand((unsigned)time(NULL));int input;do{menu();scanf("%d", &input);switch (input){case PLAY:game(); break;case EXIT:break;default:printf("非法输入,请重新输入\n");Sleep(1000);system("cls");break;}} while (input != 2);return 0;
}

源代码展示

game.c

#include"game.h"
//游戏菜单
void menu()
{printf("*********************\n");printf("********1.play*******\n");printf("********2.exit*******\n");printf("*********************\n");
}
//游戏
void game()
{char ret;system("cls");char board[COL][ROW];IniBoard(board);playboard(board);do {playermove(board);playboard(board);ret = judge(board);if (ret == 'o'){printf("玩家胜利\n");system("cls");break;}else if(ret=='D'){printf("平局\n");break;}system("cls");computermove(board);playboard(board);ret = judge(board);if (ret == 'x'){printf("电脑胜利\n");system("cls");break;}else if (ret == 'D'){printf("平局\n");break;}} while (1);}
//初始化棋盘
void IniBoard(char board[COL][ROW])
{int i, j;for (i = 0; i < COL; i++)for (j = 0; j < ROW; j++)board[i][j] = ' ';
}
//打印棋盘
//     |     |
//-----|-----|-----
//     |     |
//-----|-----|-----
//     |     |
void playboard(char board[ROW][COL])
{int i, j;for (i = 0; i < COL; i++){for (j = 0; j < ROW; j++){printf("  %c  ", board[i][j]);if (j != ROW - 1)printf("|");}printf("\n");for (j = 0; j < ROW; j++){if (i != COL - 1)printf("-----");if (j != ROW - 1&& i != COL - 1)printf("|");}printf("\n");}
}
//玩家下
void playermove(char board[COL][ROW])
{int x, y;do{printf("请选择您要下的的坐标(格式:行 列)\n");scanf("%d%d", &x, &y);if (x > 0 && x <= COL && y > 0 && y <= ROW && board[x-1][y-1] == ' '){board[x - 1][y - 1] = 'o';break;}elseprintf("坐标非法,请重新输入\n");} while (1);
}
//电脑下
void computermove(char board[COL][ROW])
{do{int x = rand() % 3;int y = rand() % 3;if (board[x][y] == ' '){board[x][y] = 'x';break;}} while (1);
}
//判断胜负
char judge(char board[COL][ROW])
{int i, j;for (i = 0; i < COL; i++)if ((board[0][i] == board[1][i] && board[1][i] == board[2][i])|| (board[i][0] == board[i][1] && board[i][1] == board[i][2]))return board[1][i];if ((board[0][0] == board[1][1] && board[1][1] == board[2][2]) || (board[0][2] == board[1][1] && board[1][1] == board[2][0]))return board[1][1];for(i=0;i<ROW;i++)for (j = 0; j < COL; j++){if (board[i][j] == ' ')return 'C';}return 'D';
}

test.c

#include"game.h"
int main()
{srand((unsigned)time(NULL));int input;do{menu();scanf("%d", &input);switch (input){case PLAY:game(); break;case EXIT:break;default:printf("非法输入,请重新输入\n");Sleep(1000);system("cls");break;}} while (input != 2);return 0;
}

game.h

#include<stdio.h>
#include<Windows.h>
#include<time.h>
#define ROW 3
#define COL 3
//定义菜单枚举变量
enum menu
{PLAY = 1,EXIT
};
void menu();
void game();
void IniBoard(char* board);
void playboard(char* board);
void playermove(char board[ROW][COL]);
void computermove(char board[ROW][COL]);
char judge(char board[COL][ROW]);

结尾

此次我们实现了一个简单的小游戏,虽然这个游戏的AI比较蠢,但是却可以让我们在学习C语言的过程中提供给我们更多更丰富的乐趣,学习编程的过程中也是有很多乐趣的。

兴趣学C:三子棋小游戏相关推荐

  1. C语言实现三子棋小游戏(编程思路以及代码详解)

    目录 前言 一.三子棋游戏的实现逻辑 二.创建菜单并控制游戏开始或游戏结束 三.创建棋盘并且初始化棋盘 四.打印棋盘并验证打印棋盘和初始化棋盘模块的实现 五.玩家下棋 六.电脑下棋 六.输赢判断 七. ...

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

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

  3. 三子棋小游戏带你走进编程世界(c语言版)

    目录 一.游戏实现的整体思路 二.实现游戏大体框架 二.游戏函数的实现 1.初始化键盘 2.打印棋盘 3.下棋及胜负判断 (1)玩家下棋 (2)电脑下棋 (3)判断输赢 三.结语及源码 三子棋想必大家 ...

  4. 三子棋小游戏(超详细)

    目录 一.实现三子棋游戏的基本逻辑 二.具体的函数实现 1. 菜单函数 2. 棋盘的实现 2.1 棋盘的初始化 2.2 棋盘的打印 3. 玩家下棋 4. 电脑下棋 5.判断棋盘状态 三. 三个文件 3 ...

  5. 【牛客刷题】上手用C语言写一个三子棋小游戏超详解哦(电脑优化)

    作者:[南航科院小张 南航科院小张的博客 专栏:从c语言的入门到进阶 学习知识不只是要懂,还要会用:想要找到好的工作,这里给大家介绍一件可以斩获诸多大厂offer的利器–牛客网 点击免费注册和我一起开 ...

  6. 使用C语言编写三子棋小游戏

    使用C语言编写三子棋小游戏: 首先进行分析: 1.需要将游戏实现分为三个部分:头文件,函数功能实现,游戏组合测试. 2.游戏可以循环进行,不必多次打开,可采用 do...while循环结构. 3.游戏 ...

  7. 如何制作三子棋小游戏

    首先,一个游戏的制作,必须由大化小,分步完成. 当我们想要制作三子棋小游戏时,必须先搞清楚这个小游戏的逻辑和原理. 三子棋是黑白棋的一种.三子棋是一种民间传统游戏,又叫九宫棋.圈圈叉叉.一条龙.井字棋 ...

  8. vs2010c语言小游戏,用C语言写一个三子棋小游戏(用VS2010实现,加强版)

    前几天写了一个三子棋小游戏,但是比较简单,因为以前写的游戏棋盘只能是3x3那么大.今天对那个程序做了两点改进: 1.现在可以实现在任意大小的棋盘上下棋了. 2.因为棋盘可能变大,为了玩家方便确定坐标, ...

  9. 呆头呆脑的电脑----三子棋小游戏(C语言版)

    目录 1.需求分析 2.程序架构 3.代码实现(分函数呈现) (1)主函数代码实现 分析: 异常处理: (2)菜单函数的实现 分析: (3)游戏函数的实现 分析: (4)棋盘的初始化 分析: (5)棋 ...

最新文章

  1. 微信小程序自定义组件Component的简单使用
  2. highcharts常用配置说明
  3. 机器学习(三)聚类深度讲解
  4. Bootstrap的学习
  5. 怎么用计算机画正弦函数图像,几何画板如何绘制正弦函数图象
  6. 存放在外存上的数据关机后_小鑫话题 | 惊了!关机后SSD会丢数据?
  7. zuul网关找不到服务_网关zuul中对所有下游服务权限做控制zuulauth
  8. java框架----mybatis的使用(一)
  9. iPhone上编辑html,在iphone上重新格式化一个简单的html页面
  10. 计算机显示屏幕会对人体产生,一种自动除尘功能的计算机显示屏专利_专利申请于2018-07-13_专利查询 - 天眼查...
  11. 计算机控制系统的框图,计算机控制系统原理框图.doc
  12. abaqus如何并行计算_Abaqus软件与并行计算的硬件配置
  13. 打印机上的一款驱动-惠普LaserJet1020Plus打印机驱动提供下载
  14. unity3d 模型从上到下出现(shader)
  15. iTween基础之Move(移动)
  16. 2011年华为企业业务的15件大事
  17. 丁子高曝爱子长相似父母混合体 坦言:脸型像我
  18. 超声波测距仪编程_北邮小学期pic单片机-超声波测距仪实验报告(附代码).docx
  19. 计算机键盘上切换账户怎么办,笔记本切换小键盘,详细教您笔记本小键盘怎么切换...
  20. layer 上传图片点击取消仍在加载_layer 点击弹出图片

热门文章

  1. ubuntu、windows双系统设置默认启动项(图文教程超详细)
  2. 威胁情报如何改进 DDoS 保护
  3. 涛涛车业通过注册:半年营收7.7亿同比降16% 拟募资6亿
  4. 刀塔传奇-王信文 分享总结
  5. NetSuite Transaction字典
  6. centos 修改 hostname方法总结
  7. m install index.php,织梦dede手机端静态化终极解决方案
  8. 三个方法教大家怎样去水印不影响图片
  9. 为什么程序员买不起房子?
  10. 学习新知识,争做新青年