C语言 VS2019编译器实现简易井字棋小游戏~
文章目录
- 井字棋小游戏
- 游戏实现
- 一、创建新项目及游戏文件
- 二、引头文件,定义符号
- 三、主函数
- 打印菜单
- 四、开始游戏
- 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编译器实现简易井字棋小游戏~相关推荐
- C语言初学——井字棋小游戏
hello呀!小伙伴们,今天小刘同学要带着大家学习的内容是--井字棋小游戏!!! 在本次学习中,我们将会运用到的主要内容是数组,函数,循环和判断. 当然,本次学习的内容并不困难,希望本次教学结束大家都 ...
- python如何在前面加井_python入门之井字棋小游戏
引言: 刚学python好几天了,从java到python,基础学起来确实比较容易,语法掌握,基本概念上都比较容易入脑. 唯一比较郁闷的是老想着用java的语法去学python代码,这点还需要后面慢慢 ...
- python井字棋_用Python做一个井字棋小游戏
井字棋是一个经典的小游戏,在九宫格上玩家轮流画OXO,当每列或每行或是两个对角成一线时便是获胜. 今天就用Python编写一个井字棋小游戏,与电脑对战. 程序执行画面如下图所示: 程序提供了两种人工智 ...
- 用Unity3D实现简单的井字棋小游戏
用Unity3D实现简单的井字棋小游戏 项目地址 井字棋小游戏 完成效果图 实现思路 首先定义游戏的数据部分: /* 井字棋中每一个棋格中的逻辑控制常量,代表这个棋格的状态 */ private co ...
- python井字棋游戏人机对战_用Python做一个井字棋小游戏
井字棋是一个经典的小游戏,在九宫格上玩家轮流画OXO,当每列或每行或是两个对角成一线时便是获胜. 今天就用Python编写一个井字棋小游戏,与电脑对战. 程序执行画面如下图所示: 程序提供了两种人工智 ...
- python井字棋_python实现井字棋小游戏
本文为大家分享了python实现井字棋小游戏,供大家参考,具体内容如下 周五晚上上了python的选修课,本来以为老师是从python的基础语法开始的,没想到是从turtle画图开始,正好补上了我以前 ...
- 井字棋小游戏代码(Visual Studio)
#include<graphics.h> #include<conio.h> #include<iostream> #include "ImagePng. ...
- 基于Unity设计的井字棋小游戏
资源下载地址:https://download.csdn.net/download/sheziqiong/86871335 资源下载地址:https://download.csdn.net/downl ...
- 基于vue框架使用canvas实现井字棋小游戏
引言:最近实现了一个图片上传压缩的功能,使用了canvas,所以学习一下canvas的语法,实现一个井字棋小游戏,这个小游戏可以人人对弈,如果大家有兴趣,可以对代码进行迭代,比如采用极大值极小值搜索法 ...
最新文章
- nginx主配置文件 在那找怎么打开
- live的domain服务
- 在计算机技术领域中数据库一词泛指,数据库原理模拟试题.doc
- push an existing repository from the command line
- 大一萌新看过来,C语言学到什么程度,才能“毕业不失业”!
- Linux Shell脚本的10个有用的“面试问题和解答”
- 探寻安全管理平台(SOC)项目的关键成功因素
- “朝阳群众”APP上线!解读怎么做一款深入群众的应用
- 小程序开发合同_微信小程序怎么做?微信小程序制作流程? | 微信开放社区
- 数据结构-----栈+中缀表达式(计算器)
- 【C++课程设计】基于单向链表的通讯录管理程序
- (VGG)VERY DEEP CONVOLUTIONAL NETWORKS FOR LARGE-SCALE IMAGE RECOGNITION--Karen Simonyan
- python诗歌文件格式处理_Python诗歌的依赖版本语法
- 自然码双拼输入法的辅助码编写问题
- Ethereum Yellow Paper
- 微信公众帐号第三方服务平台源码
- RocksDB 架构
- VSCode详细安装教程(Windows 7)附安装包
- 英文seo,英文seo怎么样
- 史上最简单的Elasticsearch教程:SpringBoot集成Elasticsearch 实时流量监测平台
热门文章
- 为什么 12306 时不时要崩一下?
- 《Flask Web开发实战:入门、进阶与原理解析》读书笔记
- 效果信息[gdc13]《刺客信条3》渲染技术
- C# 非public的方法和属性的单元测试
- dynamic_cast 运算符
- php图片背景平铺,css如何设置背景图片的平铺方式?css设置背景图片平铺的方法(图文详解)...
- Iterable的常见方法以及含义
- 《大象Thinking in UML》学习笔记(二)
- uniapp 窗口小工具、桌面小部件、微件(日历、时间) Ba-AwCalendarS
- SpringBoot集成Freemarker,并使用API生成word文件