文章目录

  • 井字棋小游戏
  • 游戏实现
    • 一、创建新项目及游戏文件
    • 二、引头文件,定义符号
    • 三、主函数
      • 打印菜单
    • 四、开始游戏
      • 1.创建二维数组
      • 2.初始化棋盘
      • 3.打印棋盘
      • 4.玩家下棋
      • 5.电脑下棋
      • 6.判断游戏是否结束
      • 7.playgame完整函数
  • 完整代码

本文章将详细说明如何用C语言实现简易的井字棋小游戏,编译器用的是VS2019。

井字棋小游戏

最终效果如图:

游戏实现

一、创建新项目及游戏文件

1.打开VS创建新的空项目。
2.在解决方案资源管理器选中 源文件 > 右键点击添加 > 新建项 > 选中C++文件并分别创建 game.c 和 text.c 。
3.用同样的方法在解决方案资源管理器 创建头文件 game.h 。

二、引头文件,定义符号

在game.h引入头文件并定义井字棋的行数和列数。
井字棋是3*3的棋盘,因此定义行数3,列数3。
game.h

#pragma once
#define _CRT_SECURE_NO_WARNINGS
#define ROW 3 //棋盘行数
#define COL 3 //棋盘列数
#include <stdio.h>
#include<stdlib.h>
#include<time.h>
#include<windows.h>

然后在game.c 和 text.c 引入头文件 “game.h”
game.c

#include"game.h"

text.c

#include"game.h"

三、主函数

主函数用do while语句和switch语句构成,定义整形 input 来接收玩家输入的数字,输入0则退出游戏,输入1则开始游戏。输入其他数字时则显示输入错误。
text.c

int main()
{srand((unsigned int)time(NULL));//设置随机数起点int input = 0;//接收玩家输入的数字do {printmenu();//打印菜单scanf("%d", &input);switch (input){case 0:printf("退出成功!\n");break;case 1:system("cls");//清屏printf("开始游戏!\n\n\n");playgame();//开始游戏break;default:printf("输入错误,请重试!\n");break;}} while (input);//当input为0,相当于假 退出循环return 0;
}

打印菜单

在主函数种do while语句中先打印菜单让玩家知道输入什么开始游戏,输入什么退出游戏。定义函数printmenu() 来打印菜单。在game.c实现函数并在game.h声明。
game.c

void printmenu()
{printf("■■■■■■■■■■■■■■■\n");printf("■■■    1.开始游戏    ■■■\n");printf("■■■    0.退出游戏    ■■■\n");printf("■■■■■■■■■■■■■■■\n");printf("请输入数字‘0’或数字‘1’>>>\n");
}

需要在game.h声明这个函数的存在,不然在text.c用不了。
game.h

void printmenu();

四、开始游戏

当玩家输入数字1,则开始游戏,因此需要在text.c定义一个 playgame() 函数来实现井字棋游戏。playgame()的完整函数将在最后面展示。

void playgame()
{}

1.创建二维数组

在playgame函数内定义一个二维数组,用于存储井字棋的棋子信息。如电脑为 字符‘X’ 玩家为 字符‘O’。
text.c > playgame()函数内

char table[ROW][COL]={0};//创建一个3行3列的二维数组

2.初始化棋盘

定义一个函数 inittable() 初始化棋盘,将来玩完一盘井字棋后需要清空存储的棋子信息,初始化是十分必要的。然后在playgame函数内传table这个二维数组作为参数。

函数实现:
game.c

void inittable(char table[ROW][COL]) //初始化棋盘
{for (int i = 0; i < ROW; i++){for (int j = 0; j < COL; j++){table[i][j] = ' '; //将信息置为空}}
}

函数声明:
game.h

void printmenu();//打印菜单

3.打印棋盘

棋盘的展示也是必不可少的,因此定义一个函数printtable() 用于打印棋盘。利用 ‘ - ’ 以及 ‘ | ’ 打印一个简易的棋盘。

井字棋可看成
第一行: 空格 棋子 空格 | 空格 棋子 空格 | 空格 棋子 空格

第二行: 横杠 横杠 横杠 | 横杠 横杠 横杠 | 横杠 横杠 横杠

第三行: 空格 棋子 空格 | 空格 棋子 空格 | 空格 棋子 空格

第四行: 横杠 横杠 横杠 | 横杠 横杠 横杠 | 横杠 横杠 横杠

第五行: 空格 棋子 空格 | 空格 棋子 空格 | 空格 棋子 空格

棋子则对应棋盘table内存储的棋子信息。
函数实现:
game.c

//打印棋盘
void printtable(char table[ROW][COL])
{for (int i = 0; i < ROW; i++){//打印空格 棋子 空格 | 空格 棋子 空格 | 空格 棋子 空格for (int j = 0; j < COL; j++){printf(" %c ", table[i][j]);if (j < COL - 1){printf("|");}        }printf("\n");//打印 横杠 横杠 横杠 | 横杠 横杠 横杠 | 横杠 横杠 横杠if (i < ROW - 1){for (int j = 0; j < COL; j++){printf("---");if (j < COL - 1){printf("|");}}}printf("\n");}
}

函数声明:
game.h

void printtable(char table[ROW][COL]);//打印棋盘

4.玩家下棋

当有了棋盘后,玩家就可以开始下棋了。定义函数 player() 接收玩家输入的想下棋的位置 即第几行,第几列。如果这个位置在棋盘table中对应的下标元素为空,这将这个元素置为字符‘O’。如玩家输入第二行第二列,对应table二维数组下标为[1] [1]。

函数实现:
game.c

//玩家下棋
void player(char table[ROW][COL])
{printf("玩家(O)走>>>> (输入: 行 空格 列 ) \n");int row = 0;int col = 0;int k = 0;while (1){scanf("%d %d", &row,&col);if (row > 0 && row <= ROW && col>0 && col<=COL && table[row - 1][col - 1] == ' '){table[row-1][col-1] = 'O';break;}else{printf("输入错误,请重试\n");continue;}}
}

函数声明:
game.h

void computer(char table[ROW][COL]);//电脑下棋

5.电脑下棋

玩家下完棋后,就到电脑下棋了。这里运用随机数代替电脑下棋算法。
首先在主函数设置随机数起点。

int main()
{srand((unsigned int)time(NULL));return 0;
}

定义computer() 函数,然后使用rand()函数 随机生成第row行,第col列,如果这个位置在棋盘table中对应的下标元素为空,这将这个元素置为字符‘X’。

函数实现:
game.c

//电脑下棋
void computer(char table[ROW][COL])
{printf("电脑(X)走>>>>\n");while (1){int col = rand() % COL;int row = rand() % ROW;if (table[row][col] != ' '){continue;}else{table[row][col] = 'X';break;}}Sleep(500);
}

函数声明:
game.h

void computer(char table[ROW][COL]);//电脑下棋

6.判断游戏是否结束

当双方有一方下棋时,应该实时检查游戏是否结束,如电脑胜利,玩家胜利还是平局,不然游戏将无止境。因此定义函数check() 检测是否游戏结束,定义iswin() 检测是胜利还是失败还是平局还是继续游戏。

check() 函数如何判断一方的胜利呢?其实只需要分别检测井字棋的三行三列以及两个斜线八条连线 对应的三个元素是否相同,如果相同,返回对应元素的字符,如返回‘O’ 则知道是玩家赢了。如果八条连线对应的元素没有三个都相同,且已经没有空位了,返回字符‘P’表示平局。如果还有空格则返回字符‘C’表示游戏继续。
接着通过iswin() 函数打印游戏结束后是谁赢的信息,并退出游戏循环。游戏结束返回1,没有结束返回0。
函数实现
game.c

//检测是否游戏结束
char check(char table[ROW][COL])
{int i = 0;int j = 0;for (j = 0; j < COL; j++){if (table[j][0] == table[j][1] && table[j][1] == table[j][2] && table[j][0] != 0)//判断竖{return table[j][0];}}for (i = 0; i < ROW; i++){if (table[0][i] == table[1][i] && table[1][i] == table[2][i] && table[0][i] != 0)//判断横{return table[0][i];}}if (table[0][0] == table[1][1] && table[2][2] == table[1][1] && table[1][1] != 0)//判断斜行{return table[0][0];}if (table[0][2] == table[1][1] && table[1][1] == table[2][0] && table[1][1] != 0)//判断斜行{return table[0][2];}for (i = 0; i < ROW; i++)   //判断是否继续 不是两方胜利也不是平局 {for (j = 0; j < COL; j++){if (table[i][j] == ' '){return 'C';}}}return 'P'; //判断平局
}//检测是胜利还是失败还是平局还是继续游戏。
int iswin(char table[ROW][COL])
{char ret = check(table);if (ret == 'O'){printf("恭喜你赢了!玩家胜利\n");return 1;}else if (ret == 'X'){printf("很遗憾你输了!电脑胜利\n");return 1;}else if (ret == 'P'){printf("平局!!!");return 1;}else{return 0;}
}

函数声明
game.h

//检测是否游戏结束
char check(char table[ROW][COL]);//检测是胜利还是失败还是平局还是继续游戏
int iswin(char table[ROW][COL]);

7.playgame完整函数

有了以上的函数,就可以将它们放入游戏函数内了。

void playgame()
{char table[ROW][COL] = { 0 };inittable(table);//初始化棋盘printtable(table);//打印棋盘//进入游戏循环while (1){           player(table);//玩家下棋system("cls");//清屏printtable(table);//打印棋盘if (iswin(table))//检测是否游戏结束{system("pause");system("cls");//清屏break;}computer(table);//电脑下棋system("cls");//清屏printtable(table);//打印棋盘if (iswin(table))//检测是否游戏结束{system("pause");system("cls");//清屏break;}}
}

以上就是井字棋的游戏实现的所有内容,可以参考下面的完整代码~

完整代码

game.h

#pragma once
#define _CRT_SECURE_NO_WARNINGS
#define ROW 3 //棋盘行数
#define COL 3 //棋盘列数
#include <stdio.h>
#include<stdlib.h>
#include<time.h>
#include<windows.h>//打印菜单
void printmenu();//初始化棋盘
void inittable(char table[ROW][COL]);//打印棋盘
void printtable(char table[ROW][COL]);//玩家下棋
void player(char table[ROW][COL]);//电脑下棋
void computer(char table[ROW][COL]);//检测是否游戏结束
char check(char table[ROW][COL]);//检测是胜利还是失败还是平局还是继续游戏
int iswin(char table[ROW][COL]);

game.c

#include"game.h"//打印菜单
void printmenu()
{printf("■■■■■■■■■■■■■■■\n");printf("■■■    1.开始游戏    ■■■\n");printf("■■■    0.退出游戏    ■■■\n");printf("■■■■■■■■■■■■■■■\n");printf("请输入数字‘0’或数字‘1’>>>\n");
}//初始化棋盘
void inittable(char table[ROW][COL])
{for (int i = 0; i < ROW; i++){for (int j = 0; j < COL; j++){table[i][j] = ' ';}}
}//打印棋盘
void printtable(char table[ROW][COL])
{for (int i = 0; i < ROW; i++){for (int j = 0; j < COL; j++){printf(" %c ", table[i][j]);if (j < COL - 1){printf("|");}      }printf("\n");if (i < ROW - 1){for (int j = 0; j < COL; j++){printf("---");if (j < COL - 1){printf("|");}}}printf("\n");}
}//玩家下棋
void player(char table[ROW][COL])
{printf("玩家(O)走>>>> (输入: 行 空格 列 ) \n");int row = 0;int col = 0;int k = 0;while (1){scanf("%d %d", &row,&col);if (row > 0 && row <= ROW && col>0 && col<=COL && table[row - 1][col - 1] == ' '){table[row-1][col-1] = 'O';break;}else{printf("输入错误,请重试\n");continue;}}
}//电脑下棋
void computer(char table[ROW][COL])
{printf("电脑(X)走>>>>\n");while (1){int col = rand() % COL;int row = rand() % ROW;if (table[row][col] != ' '){continue;}else{table[row][col] = 'X';break;}}Sleep(500);
}char check(char table[ROW][COL])
{int i = 0;int j = 0;for (j = 0; j < COL; j++){if (table[j][0] == table[j][1] && table[j][1] == table[j][2] && table[j][0] != 0)//判断竖{return table[j][0];}}for (i = 0; i < ROW; i++){if (table[0][i] == table[1][i] && table[1][i] == table[2][i] && table[0][i] != 0)//判断横{return table[0][i];}}if (table[0][0] == table[1][1] && table[2][2] == table[1][1] && table[1][1] != 0)//判断斜行{return table[0][0];}if (table[0][2] == table[1][1] && table[1][1] == table[2][0] && table[1][1] != 0)//判断斜行{return table[0][2];}for (i = 0; i < ROW; i++)   //判断是否继续 不是两方胜利也不是平局 {for (j = 0; j < COL; j++){if (table[i][j] == ' '){return 'C';}}}return 'P'; //判断平局
}int iswin(char table[ROW][COL])
{char ret = check(table);if (ret == 'O'){printf("恭喜你赢了!玩家胜利\n");return 1;}else if (ret == 'X'){printf("很遗憾你输了!电脑胜利\n");return 1;}else if (ret == 'P'){printf("平局!!!");return 1;}else{return 0;}
}

text.c

#include"game.h"void playgame()
{char table[ROW][COL] = { 0 };inittable(table);//初始化棋盘printtable(table);//打印棋盘//进入游戏循环while (1){           player(table);//玩家下棋system("cls");//清屏printtable(table);//打印棋盘if (iswin(table))//检测是否游戏结束{system("pause");system("cls");//清屏break;}computer(table);//电脑下棋system("cls");//清屏printtable(table);//打印棋盘if (iswin(table))//检测是否游戏结束{system("pause");system("cls");//清屏break;}}
}int main()
{srand((unsigned int)time(NULL));int input = 0;do {printmenu();//打印菜单scanf("%d", &input);switch (input){case 0:printf("退出成功!\n");break;case 1:system("cls");printf("开始游戏!\n\n\n");playgame();break;default:printf("输入错误,请重试!\n");break;}} while (input);return 0;
}

C语言 VS2019编译器实现简易井字棋小游戏~相关推荐

  1. C语言初学——井字棋小游戏

    hello呀!小伙伴们,今天小刘同学要带着大家学习的内容是--井字棋小游戏!!! 在本次学习中,我们将会运用到的主要内容是数组,函数,循环和判断. 当然,本次学习的内容并不困难,希望本次教学结束大家都 ...

  2. python如何在前面加井_python入门之井字棋小游戏

    引言: 刚学python好几天了,从java到python,基础学起来确实比较容易,语法掌握,基本概念上都比较容易入脑. 唯一比较郁闷的是老想着用java的语法去学python代码,这点还需要后面慢慢 ...

  3. python井字棋_用Python做一个井字棋小游戏

    井字棋是一个经典的小游戏,在九宫格上玩家轮流画OXO,当每列或每行或是两个对角成一线时便是获胜. 今天就用Python编写一个井字棋小游戏,与电脑对战. 程序执行画面如下图所示: 程序提供了两种人工智 ...

  4. 用Unity3D实现简单的井字棋小游戏

    用Unity3D实现简单的井字棋小游戏 项目地址 井字棋小游戏 完成效果图 实现思路 首先定义游戏的数据部分: /* 井字棋中每一个棋格中的逻辑控制常量,代表这个棋格的状态 */ private co ...

  5. python井字棋游戏人机对战_用Python做一个井字棋小游戏

    井字棋是一个经典的小游戏,在九宫格上玩家轮流画OXO,当每列或每行或是两个对角成一线时便是获胜. 今天就用Python编写一个井字棋小游戏,与电脑对战. 程序执行画面如下图所示: 程序提供了两种人工智 ...

  6. python井字棋_python实现井字棋小游戏

    本文为大家分享了python实现井字棋小游戏,供大家参考,具体内容如下 周五晚上上了python的选修课,本来以为老师是从python的基础语法开始的,没想到是从turtle画图开始,正好补上了我以前 ...

  7. 井字棋小游戏代码(Visual Studio)

    #include<graphics.h> #include<conio.h> #include<iostream> #include "ImagePng. ...

  8. 基于Unity设计的井字棋小游戏

    资源下载地址:https://download.csdn.net/download/sheziqiong/86871335 资源下载地址:https://download.csdn.net/downl ...

  9. 基于vue框架使用canvas实现井字棋小游戏

    引言:最近实现了一个图片上传压缩的功能,使用了canvas,所以学习一下canvas的语法,实现一个井字棋小游戏,这个小游戏可以人人对弈,如果大家有兴趣,可以对代码进行迭代,比如采用极大值极小值搜索法 ...

最新文章

  1. nginx主配置文件 在那找怎么打开
  2. live的domain服务
  3. 在计算机技术领域中数据库一词泛指,数据库原理模拟试题.doc
  4. push an existing repository from the command line
  5. 大一萌新看过来,C语言学到什么程度,才能“毕业不失业”!
  6. Linux Shell脚本的10个有用的“面试问题和解答”
  7. 探寻安全管理平台(SOC)项目的关键成功因素
  8. “朝阳群众”APP上线!解读怎么做一款深入群众的应用
  9. 小程序开发合同_微信小程序怎么做?微信小程序制作流程? | 微信开放社区
  10. 数据结构-----栈+中缀表达式(计算器)
  11. 【C++课程设计】基于单向链表的通讯录管理程序
  12. (VGG)VERY DEEP CONVOLUTIONAL NETWORKS FOR LARGE-SCALE IMAGE RECOGNITION--Karen Simonyan
  13. python诗歌文件格式处理_Python诗歌的依赖版本语法
  14. 自然码双拼输入法的辅助码编写问题
  15. Ethereum Yellow Paper
  16. 微信公众帐号第三方服务平台源码
  17. RocksDB 架构
  18. VSCode详细安装教程(Windows 7)附安装包
  19. 英文seo,英文seo怎么样
  20. 史上最简单的Elasticsearch教程:SpringBoot集成Elasticsearch 实时流量监测平台

热门文章

  1. 为什么 12306 时不时要崩一下?
  2. 《Flask Web开发实战:入门、进阶与原理解析》读书笔记
  3. 效果信息[gdc13]《刺客信条3》渲染技术
  4. C# 非public的方法和属性的单元测试
  5. dynamic_cast 运算符
  6. php图片背景平铺,css如何设置背景图片的平铺方式?css设置背景图片平铺的方法(图文详解)...
  7. Iterable的常见方法以及含义
  8. 《大象Thinking in UML》学习笔记(二)
  9. uniapp 窗口小工具、桌面小部件、微件(日历、时间) Ba-AwCalendarS
  10. SpringBoot集成Freemarker,并使用API生成word文件