c语言程序设计中三子棋游戏,C语言实现简易版三子棋游戏

本文实例为大家共享了C语言实现三子棋游戏的详细代码,供大家参考,详细内容如下

什么是多文件?

多数大型的工程的头文件和源文件非常多,我们也不可能把所有的代码都写在同一个文件里,这样也不方便代码的阅读与维护,通常都会根据不同的功能将代码分别书写到多个源文件与头文件中。

游戏简介

三子棋是个简单的双人游戏,双方在3X3的棋盘上轮流落子,当一条直线上出现三颗连续且相同的棋子时即获胜。此程序让玩家先落子,电脑在棋盘上随机落子。游戏结束时显示胜负,玩家可以选择是否继续玩游戏。

代码实现

chess.h

通常我们会在头文件中写一些类型的定义、结构体定义、宏定义、函数声明、include共含等内容。

#ifndef _CHESS_H_

#define _CHESS_H_

#include

#include

#include

#include

#include

#pragma warning(disable:4996)

#define ROW 3

#define COL 3

#define BLACK_PIECE 'X'

#define WHITE_PIECE 'O'

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

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

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

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

char CheckWin(char board[ROW][COL], int row, int col);

#endif

chess.c

源文件中共含了chess.h这个头文件,于是在这个chess.c文件中就可以使用这些在头文件中定义的内容,可以使用自定义类型、自定义函数、标准输入输出函数等。

include的路径问题,当使用< >来指定共含的头文件时,编译器会从系统头文件库中进行查找,而使用" "来共含的头文件,编译器将会从当前程序目录进行查找。在include时被共含文件可以是绝对路径,也可以是相对路径,总之,只要头文件的存放路径与当前源文件的关系正确就行了。

#include "chess.h"

//打印棋盘

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

{

for (int i = 0; i < row; i++){

for (int j = 0; j < col; j++){

board[i][j] = ' ';

}

}

}

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

{

printf(" | 1 | 2 | 3 |\n");

int i = 0;

for (; i < row; i++){

printf("----------------\n");

printf(" %d | %c | %c | %c |\n", i + 1, board[i][0], board[i][1], board[i][2]);

}

printf("----------------\n");

}

//玩家下棋

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

{

int x = 0;

int y = 0;

printf("\n");

printf("----------玩家走----------\n");

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] = 'X';

break;

}

else{

printf("坐标被占用,请重新版输入!\n");

}

}

else{

printf("坐标有误!\n");

}

}

}

//电脑下棋

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

{

int x = 0;

int y = 0;

printf("\n");

printf("----------电脑走----------\n");

printf("\n");

while (1){

for (x = 0; x <= 2; x++){ //当玩家有两个子连成一条线时,堵!

for (y = 0; y <= 2; y++){

if (board[x][y] == ' '){

board[x][y] = 'X';

if (CheckWin(board, ROW, COL) == 'X'){

board[x][y] = 'O'; //一旦落子,就直接跳出while循环,后面都一样

Sleep(500);

return 0;

}

else{

board[x][y] = ' '; //还原

}

}

}

}

if (board[1][1] == ' '){ //如果中间可以落子,在中间落子

board[1][1] = 'O';

Sleep(500);

return 0;

}

else{ //如果四个角可以落子,在四个角上落子。

for (x = 0; x <= 2; x += 2){

for (y = 0; y <= 2; y += 2){

if (board[x][y] == ' '){

board[x][y] = 'O';

Sleep(500);

return 0;

}

}

}

}

x = rand() % row; //四个边的中间随机落子,0—2

y = rand() % col;

if (board[x][y] == ' '){

board[x][y] = 'O';

Sleep(1000);

break;

}

printf("\n");

}

}

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

}

//用户赢了 BLACK_PIECE 'X'

//电脑赢了 WHITE_PIECE 'O'

//平局, 'Q'

//继续, 'C'

//结果判断 玩家赢 or 电脑赢 or 平局

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

{

int i = 0;

for (; i < row; i++){

//判断一行是否相同

if (board[i][0] != ' ' && board[i][0] == board[i][1] && board[i][1] == board[i][2]){

return board[i][0];

}

}

for (i = 0; i < col; i++){

//判断一列是否相同

if (board[0][i] != ' ' && board[0][i] == board[1][i] && board[1][i] == board[2][i]){

return board[0][i];

}

}

if (board[0][0] != ' ' && board[0][0] == board[1][1] && board[1][1] == board[2][2]){

return board[0][0];

}

if (board[0][2] != ' ' && board[0][2] == board[1][1] && board[1][1] == board[2][0]){

return board[1][1];

}

//平局

if (IsFull(board, row, col) == 1){

return 'Q';

}

//继续

return 'C';

}

main.c

理清思路,搭建好运行的框架。

1.游戏菜单,选择玩/不玩

2.打印棋盘

3.玩家落子

4.打印棋盘

5.电脑落子

6.打印棋盘

7.…

8.显示胜负

9.返回游戏菜单,选择玩/不玩

#include "chess.h"

void Menu()

{

printf("\n");

printf("----------三子棋游戏----------\n");

printf("\n");

printf("******************************\n");

printf("* 1.Play *\n");

printf("* 2.Exit *\n");

printf("******************************\n");

printf("\n");

printf("Please Enter Select:");

}

void Game()

{

char board[ROW][COL] = { 0 };//记录棋盘

char ret = 0;

InitBoard(board, ROW, COL);

ShowBoard(board, ROW, COL);//打印棋盘

while (1){

PlayerMove(board, ROW, COL);//玩家走

ShowBoard(board, ROW, COL);//打印棋盘

//判断输赢

ret = CheckWin(board, ROW, COL);

if (ret != 'C'){

break;

}

ComputerMove(board, ROW, COL);//电脑走

ShowBoard(board, ROW, COL);//打印棋盘

//判断输赢

ret = CheckWin(board, ROW, COL);

if (ret != 'C'){

break;

}

}

if (ret == 'X'){

printf("----------玩家赢!----------\n");

}

else if (ret == 'O'){

printf("----------电脑赢!----------\n");

}

else if (ret == 'Q'){

printf("----------平局!----------\n");

}

}

int main()

{

int select = 0;

int quit = 0;

srand((unsigned int)time(NULL));

while (!quit){

Menu();

scanf("%d", &select);

switch (select){

case 1:

Game();

while (!select);

break;

case 2:

printf("Game Over!\n");

break;

default:

printf("Enter Error!\n");

break;

}

}

system("pause");

return 0;

}

测试结果

2020110712520446516.png

2020110712520446517.png

2020110712520446518.png

2020110712520546519.png

更多有趣的经典小游戏实现专题,共享给大家:

C++经典小游戏汇总

python经典小游戏汇总

python俄罗斯方块游戏集合

JavaScript经典游戏 玩不停

java经典小游戏汇总

javascript经典小游戏汇总

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持乐购源码。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/525800.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Rancher创始人谈Docker,创新愈发困难,未来将何去何从?

导读:本文由Rancher Labs CEO及联合创始人梁胜博士在参加DockerCon之前和之后写的两篇文章综合整理而成。从各家容器编排方案均很不成熟的初期到三足鼎立的编排之战&#xff0c;到如今kubernetes似已全面胜利&#xff0c;梁胜博士作为整个发展历程的参与者与见证者&#xff0c;…

ld 指令c语言实现,C语言符号、指令表.doc

C语言符号、指令表.docC语语语 言言言 符符符 号号号 控控控 制制制 命命命 令令令 表表表 编译指令 编译指令 说明 i n c l u d e 包含另一个文件 d e f i n e 定义一个宏( m a c r o)或是常量 u n d e f 取消一个宏常量的定义 a s m 和 e n d a s m 在程序中加入汇编语言的程…

400位京东技术专家心血之作 《决战618:探秘京东技术取胜之道》重磅发售!

6.18始于京东的店庆日&#xff0c;现在早已演变成为全民参与的网购狂欢节。2017年6月18日24点&#xff0c;当京东总部的指挥中心大屏定格在“当前累计下单金额1199亿元”时&#xff0c;欢呼声、掌声响彻整个作战指挥室。在成绩背后&#xff0c;是京东强大的技术硬实力&#xff…

c语言创建一个顺序表主函数,用C语言来创建一个顺序表(数据结构部分)

顺序表的创建需要用到结构体&#xff0c;构造一个结构体来存储数据&#xff0c;顺序表申请的内存是连续的。创建顺序表的思路按照数据的“增删改查来进行编写”下列是顺序表的创建代码创建头文件&#xff1a;sqlist.h#ifndef SQLIST_H#define SQLIST_H#define N 100#define min…

XSS常见攻击与防御

本文获得作者授权刊发&#xff0c;更多信息请关注作者专栏。 XSS攻击全称跨站脚本攻击&#xff0c;是为不和层叠样式表(Cascading Style Sheets, CSS)的缩写混淆&#xff0c;故将跨站脚本攻击缩写为XSS&#xff0c;XSS是一种在web应用中的计算机安全漏洞&#xff0c;它允许恶意…

关于c语言的符号常量以下叙述中正确的是,关于C语言的符号常量,以下叙述中正确的是( )...

关于对起的是下列械布重机置的正确认识。标准运用征税国家公布&#xff0c;符号治权征的家凭借政力开税收是国。常量包括专利权的程序授予。现左膝关痛节肿&#xff0c;下叙化验快R增&#xff0c;性A阴&#xff0c;女性&#xff0c;能的最可诊断是&#xff0c;多发口腔溃疡年来…

创业公司的容器化之路

作者简介&#xff1a; 章烨明&#xff0c;杏仁医生CTO。中年程序员&#xff0c;关注各种技术和团队管理。本文首发杏仁医生技术站 1. 创业公司的技术挑战 托尔斯泰说&#xff1a;“幸福的家庭都是相同的&#xff0c;不幸的家庭各有各的不幸。”互联网创业公司也一样。大部分互…

周围剃光头顶留长发型_发型改变气质,这话放在石原里美身上也通用啊

上周&#xff0c;石原里美的新剧《天国餐馆》开播啦。你们有在追吗&#xff1f;她新剧里的发型争议还蛮大。她在剧里演一个法国餐厅老板黑须假名子&#xff0c;非常多这种大背头造型。很多网友觉得不适合她&#xff0c;有点老气。▼这个大背头发型也是角色需要啦&#xff0c;是…

单片机模数转换实验c语言程序,单片机实验AD转换实验

《单片机实验AD转换实验》由会员分享&#xff0c;可在线阅读&#xff0c;更多相关《单片机实验AD转换实验(5页珍藏版)》请在人人文库网上搜索。1、实验报告课程名称&#xff1a; 单片机原理及应用 实验项目&#xff1a; A/D转换实验 专业班级&#xff1a; 姓 名&#xff1a; 学…

ServiceComb中的数据最终一致性方案

本文由华为微服务引擎技术团队&&ServiceComb社区授权发布。 数据一致性是构建业务系统需要考虑的重要问题 &#xff0c; 以往我们是依靠数据库来保证数据的一致性。但是在微服务架构以及分布式环境下实现数据一致性是一个很有挑战的的问题。ServiceComb作为开源的微服务…

Rabbitmq延迟队列和惰性队列

延迟队列 当一个队列中的消息满足下列情况之一&#xff0c;可以成为死信&#xff1a; &#xff08;1&#xff09;消费者使用basic.reject或basic.nack声明消费失败&#xff0c;并且消息的requeue参数设置为false &#xff08;2&#xff09;消息是一个过期消息&#xff0c;超时…

laydate点击输入框闪一下不见了_爱剪辑:如何制作抖音、苹果风格的快闪视频...

不知道大家有没有看过iPhone的宣传片&#xff0c;视频开头有几十秒的快闪字幕&#xff0c;当时视频一出来就有很多剪刀手求教程&#xff0c;因为这个效果不仅酷炫&#xff0c;用途还很广&#xff0c;可以用于&#xff1a;日常生活介绍、产品介绍、搞笑段子......今天就来教大家…

c语言学习与应用 北京邮电大学出版社,《C语言程序设计与应用》低价购书_计算机与互联网_孔网...

c语言是一种简洁高效的编程语言&#xff0c;目前大多数高等院校把它作为学习程序设计的入门语言。本书针对程序设计的初学者&#xff0c;由浅入深、通俗易懂地介绍c语言。本书主要内容包括c语言概述、数据类型和表达式、程序控制结构、数组、函数、高级变量类型与宏定义、文件共…

C++和Lua交互教程(基于LuaBridge)

作者&#xff1a;查志旺 &#xff0c;向日葵远程控制软件前端开发工程师。 最近公司需要做向日葵远程控制软件跨平台项目&#xff0c;为了代码的可复用性&#xff0c;需嵌入跨平台脚本语言&#xff0c;我们选择了Lua&#xff0c;理由是Lua由标准C编写而成&#xff0c;几乎在所有…

c语言100000阶乘,求10000的阶乘(c语言代码实现)

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼/*程序功能&#xff1a;计算一个正整数n的阶乘&#xff0c;目前最大能运算10000的阶乘&#xff0c;可秒杀。程序意义&#xff1a;加强自己对于大数的处理。说明&#xff1a;此程序对乘法和除法还未做任何优化&#xff0c;如果用上位…

ogg批量配置_最简单OGG配置方式

ogg一般来说有4个进程&#xff0c;Manager进程&#xff0c;Extract进程&#xff0c;Pump进程&#xff0c;Replicat进程Manager进程&#xff1a;是GoldenGate的控制进程&#xff0c;它主要作用有以下几个方面&#xff1a;启动、监控、重启GoldenGate的其他进程&#xff0c;报告错…

与Serverless 的第一次亲密接触

Servrless概念 Serverless 是一个架构上的概念&#xff0c;从字面上理解就是无服务器架构。Serverless最初是用于描述依赖第三方服务实现对逻辑和状态进行管理的应用&#xff0c;典型的例子是单页 Web 和移动 App 这种富客户端应用&#xff0c;他们一般都使用基于云端的数据库…

eclipse把tomcant用到一个项目里_聊一个镜头工艺里容易被忽略,但很重要的项目...

在不改换门庭的情况下&#xff0c;一颗镜头一般都会伴随大家使用很长一段时间&#xff0c;也相信大多数人都遇到过剐蹭镜头前组的情况&#xff0c;这时候最容易引发的担忧就是“伤着镀膜了么&#xff1f;会不会影响成像效果&#xff1f;”其实换个角度来看&#xff0c;这个问题…

c语言中词法分析怎么识别注释,C语言中的词法分析-如何在检测多行注释时使星号被读取并输出?...

我正在研究词法分析程序&#xff0c;检测到一行注释时一切正常。 这是我的单行注释检测代码。//Single Commentif ((Current_Character /) && (fgetc(File_Input) /)){printf("%c", Current_Character);do{printf ("%c", Current_Character);Cur…

Java性能调优的11个实用技巧

大多数开发人员认为性能优化是个比较复杂的问题&#xff0c;需要大量的经验和知识。是的&#xff0c;这并不没有错。诚然&#xff0c;优化应用程序以获得最好的性能并不是一件容易的事情&#xff0c;但这并不意味着你在没有获得这些经验和知识之前就不能做任何事。下面有几个很…