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

一、三子棋小游戏

想必大家都玩过三子棋小游戏,只有先了解规则,我们才能写出对应的算法。


点击下面链接直达你想看的内容

  • 一、三子棋小游戏
    • 1、首先需要思考的事情
    • 2、开始下棋
    • 3.判断输赢
    • 4.代码实现
  • 二、总结

1、首先需要思考的事情

斗棋首先得有一个平台,比如三子棋的平台就是我们常见的九宫格 如下图:


这时候有人就会说了,这谁都知道,可是这个图形怎么在电脑上显示呢?
问得好

我们把这个图案画出来(小声哔哔:个人感觉画的还不错)从图中可以看出蓝色分为三层,红色其实也分为三层,只不过最后一层没有省略了。

代码如下:

void DisplayBoard(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");}
}

2、开始下棋

平台我们已经做好了,第二步我们该干嘛呢?
肯定是可以下棋啦!
那么问题来了,我们怎么将我们的棋子下到对应的位置呢?而且还不能重复?
三子棋是一个双人游戏,那我们就写一个人机对打的操作!

玩家操作函数封装为

void PlayerMove(char board[ROW][COL], int row, int col)

电脑玩家操作函数封装为

void ComputerMove(char board[ROW][COL], int row, int col)

看表面都能看出来两个函数其实没有太大区别。

注意:我们把下棋的位置看成一个个二维数组的元素,其实就显而易见了,我们下的棋子就是给相应二维数组元素赋值,这里我们把玩家下的棋用 ∗\color{black}{*}∗ 表示,电脑玩家下的棋用 # 表示。

那我们该如何实现这两个函数呢?

代码如下:

void PlayerMove(char board[ROW][COL], int row, int col)
{printf("玩家走>\n");int x = 0;int y = 0;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;}elseprintf("坐标被占用,请重新输入\n");}elseprintf("坐标非法,超出范围\n");}
}
void ComputerMove(char board[ROW][COL], int row, int col)
{printf("电脑走>\n");int x = 0;int y = 0;while (1){x = rand() % row; // 将棋子位置合法化, 下同y = rand() % col;if (board[x][y] == ' ') // 当前位置为空 则电脑下棋{board[x][y] = '#';break;}}
}

3.判断输赢

当玩家下完棋之后是不是要判断一下当前是否已经赢了。

我们该如何判断输赢呢?

这时我们自己定义一个规则:

  • 首先定义一个变量 ret
  • 让 ret 来返回当前局面是否已经成立或是平局
  • 当玩家赢返回 ∗\color{black}{*}∗
  • 当电脑玩家赢返回 #
  • 平局返回Q
  • 继续游戏时返回 C

代码如下:

int IsFull(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++){if (board[i][j] == ' ') // 如果还有空位置说明还没结束return 0;}}return 1;
}
char IsWin(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];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 (IsFull(board, row, col)) // 平局{return 'Q';}return 'C'; // 以上都不满足则继续游戏
}

4.代码实现

我们理解完较难代码的实现之后,下面开始真正做一个完整的小游戏吧!


1、首先我们写一个有文件说明一下几个重要函数

game.h代码如下:

#pragma once
#define _CRT_SECURE_NO_DEPRECATE#include <stdio.h>
#include <stdlib.h>
#include <time.h>#define ROW 3
#define COL 3// 初始化棋盘
void InitBoard(char board[ROW][COL], int row, int col);// 显示棋盘
void DisplayBoard(char board[ROW][COL], int row, int col);// 玩家移动
void PlayerMove(char board[ROW][COL], int row, int col);// 电脑玩家移动
void ComputerMove(char board[ROW][COL], int row, int col);// 判断输赢
char IsWin(char board[ROW][COL], int row, int col);

2、主函数代码主要调用函数用途

main.c代码如下:

#include "game.h"void menu()
{printf("****************************\n");printf("********** 1.paly **********\n");printf("********** 0.exit **********\n");printf("****************************\n");
}
void game()
{char board[ROW][COL];InitBoard(board, ROW, COL);DisplayBoard(board, ROW, COL);char ret;while (1){PlayerMove(board, ROW, COL); // 玩家下棋DisplayBoard(board, ROW, COL); // 打印棋盘ret = IsWin(board, ROW, COL); // 返回标志代码 ‘C’为继续 ‘Q’为平局 ‘*’为玩家赢 ‘#’为电脑赢if (ret != 'C')break;ComputerMove(board, ROW, COL);DisplayBoard(board, ROW, COL);ret = IsWin(board, ROW, COL);if (ret != 'C')break;}if (ret == '*')printf("玩家赢!\n");if (ret == '#')printf("电脑赢!\n");if (ret == 'Q')printf("平局!\n");
}
int main()
{int input = 0;srand((unsigned int)time(NULL));menu();do{printf("请选择>");scanf("%d", &input);switch (input){case 1:  game(); break;case 0: printf("退出游戏!\n"); break;default: printf("选择错误!\n"); break;}} while (input);
}

3、下面代码才是函数的实现也是游戏的核心内容

game.c代码如下:

#include "game.h"void InitBoard(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++){board[i][j] = ' ';}}
}
void DisplayBoard(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 PlayerMove(char board[ROW][COL], int row, int col)
{printf("玩家走>\n");int x = 0;int y = 0;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;}elseprintf("坐标被占用,请重新输入\n");}elseprintf("坐标非法,超出范围\n");}
}
void ComputerMove(char board[ROW][COL], int row, int col)
{printf("电脑走>\n");int x = 0;int y = 0;while (1){x = rand() % row; // 将棋子位置合法化, 下同y = rand() % col;if (board[x][y] == ' ') // 当前位置为空 则电脑下棋{board[x][y] = '#';break;}}
}int IsFull(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++){if (board[i][j] == ' ')return 0;}}return 1;
}
char IsWin(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];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 (IsFull(board, row, col)){return 'Q';}return 'C';
}

二、总结

代码已经实现出来了,完成了一项小游戏,是不是特有成就感,相信以后的你还会有更牛的项目!加油!

C语言小项目--三子棋小游戏相关推荐

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

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

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

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

  3. C语言 进阶版三子棋小游戏

    目录 前言 游戏运行效果: 游戏代码: 1.test.c文件 2.  game.h头文件 3.  game.c 一.框架部分 二.游戏函数实现 1.创建数组并初始化 2.打印数组 3.玩家下棋 4.电 ...

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

    游戏规则: 三子棋是一种民间传统游戏,又叫九宫棋.圈圈叉叉.一条龙等.游戏是在一个3*3的棋盘里面下棋的.只要有三个一样的连成一条线,就表示有一方胜出:如果下完了9个格子还没有玩家胜出,游戏为平局. ...

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

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

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

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

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

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

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

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

  9. 趣讲用c语言实现三子棋小游戏

    目录 直接先看看最后运行效果吧 三子棋如何设计的,及其步骤 1,源文件已经头文件的创建 2.创建主函数 3.test函数的创建 4.game函数的创建和运行 5.五个函数的实现 a.init_boar ...

最新文章

  1. linux下载b站的视频+ffmpeg抽取出mp3
  2. SublimeText如何让代码的关键字高亮显示
  3. ICCV2021 | 南洋理工大学、港中大提出Talk-to-Edit,对话实现高细粒度人脸编辑
  4. hdfs存储与数据同步
  5. java.sql.SQLException: null, message from server: “Host ‘xxx.xxx.xxx.xxx‘ is not allowed to
  6. 大一高等数学期末考试试卷及答案详解
  7. idea主题插件网址
  8. Unity3d Network 局域网多人对战之游戏大厅
  9. 2021年危险化学品经营单位主要负责人考试技巧及危险化学品经营单位主要负责人模拟考试题库
  10. 100+篇论文合集:GNN在NLP中的应用
  11. android 智能识别名片,小程序云开发实战:实现 AI 智能名片识别小程序
  12. 中国风android,小鱼天气 - 水墨古典中国风 #Android
  13. Java编程:通过获取当前时间,判断今天星期几
  14. opengl: 太阳地球和月亮
  15. ai个性化 国庆 头像 合成
  16. 人工学习之预测2023年考研英语答案分布
  17. cpu soft lockup
  18. tkinter-Entry详解
  19. linux安装红帽openshift,Redhat Openshift 单机版安装指南 CRC4.6
  20. 《数据挖掘导论》学习笔记:第1-2章

热门文章

  1. FM 发射模块QN8027软件android 5.1实现分析
  2. 【discuz】discuz模板语法
  3. Hyperledger Fabric CouchDB 查询
  4. 物联网技术概论:第6章
  5. LeetCode 56 合并区间
  6. php中文乱码问号,解决PHP中文乱码问题
  7. 求职干货,泄露太多我担心HR封杀我(附带简历模板)
  8. 晴 · 雨 | 草原天路 同一空间 双面气质
  9. 程序员未来实现在家办公,真的会开心吗?
  10. 文件上传-自定义上传(修改上传文件名