C语言代码实现三子棋小游戏
作者:安然Arran 发布时间:2023-04-16 02:12:41
本文实例为大家分享了C语言实现三子棋小游戏的具体代码,供大家参考,具体内容如下
设计思路
三子棋的C语言设计的思路:
1.设计一个界面:让玩家运行后即可以看到一个界面,而此时界面需要一个让玩家选择的语句,即可以选择玩游戏或者退出操作。界面设计需要swich语句的实现,退出游戏设计选项为0,即可以当选择退出游戏时直接退出while(循环),即结束游戏。
2.游戏实现:当玩家选择玩游戏时,调用启动游戏的函数,而在游戏中,应当有的内容有:
(1)游戏内的棋盘设计:三子棋应当是三行三列的一个棋盘,通过函数打印出来。
(2)玩家的移动:玩家输入相应的坐标然后将属于玩家的标记打印在棋盘上,且电脑不能在同一位置打印。
(3)电脑的移动:电脑应随即控制,即调用rand函数,使用time和时间随机。
(4)输赢的处理:这里需要给出判断输赢的条件:即任意一行或一列或对角线相同即为赢,通过标记的符号来判断玩家赢还是电脑赢,如果棋盘放满且仍未判断出输赢,则为平局。
(5)函数的调用处理:在函数调用时,每走一步,应打印出相对应的棋盘供玩家观看,定义一个头文件直接将所需函数的头文件以及所需要的定义的行列常量,函数声明放在里面,在代码中只需用COL和ROW表示即可,需要修改棋盘的时候,只需修改头文件中的define所定义的COL以及ROW。
代码实现:
首先是游戏的界面代码:直接用printf打印出来即可
void meun()
{
printf("****************\n");
printf("*****0.Exit*****\n");
printf("*****1.Play*****\n");
printf("****************\n");
}
然后设计出三子棋的棋盘
void ShowBoard(char board[][COL], int row, int col)
{
for (int i = 0; i < row; i++)
{
for (int j = 0; j < col; j++)
{
printf(" %c ",board[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 PlayerMove(char board[][COL], int row, int col)
{
int x = 0;
int y = 0;
while (1)
{
printf("请输入你的坐标:\n");
scanf("%d%d",&x,&y);
if (x >= 1 && x <= 3 && y >= 1 && y <= 3)
{
if (board[x - 1][y - 1] == ' ')
{
board[x - 1][y - 1] = 'X';
break;
}
}
else
{
printf("坐标有误,请重新输入\n");
}
}
}
电脑下棋的功能实现:(用time让rand函数变成随机值而不固定随机)
void ComputerMove(char board[][COL], int row, int col)
{
while (1)
{
srand((unsigned)time(NULL));
int x = rand() % ROW;
int y = rand() % COL;
if (board[x][y] == ' ')
{
board[x][y] = 'O';
break;
}
}
}
输赢的处理(代码与思路一致,有IsWin函数(判断输赢),IsFull(判断平局))
char IsWin(char board[][COL], int row, int col)
{
for (int 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[0][0] != ' ')
{
return board[0][0];
}
if (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[1][1] != ' ')
{
return board[0][2];
}
if (IsFull(board, row, col) == 1)
{
return 'Q';
}
}
return ' ';
}
static int IsFull(char board[][COL], int row, int col)
{
for (int i = 0; i < row; i++)
{
for (int j = 0; j < col; j++)
{
if (board[i][j] == ' ')
{
return 0;
}
}
}
return 1;
}
最后就是函数调用问题,设计一个函数game()来调用设计好的代码功能,进行游戏功能的实现
void game()
{
char board[ROW][COL] = {0};
InitBoard(board, ROW, COL);
ShowBoard(board, ROW, COL);
int ret = 0;
while (1)
{
PlayerMove(board, ROW, COL);
ComputerMove(board, ROW, COL);
ShowBoard(board, ROW, COL);
ret = IsWin(board, ROW, COL);
if (ret != ' ')
{
break;
}
}
if (ret == 'X')
{
printf("玩家赢\n");
}
if (ret == 'O')
{
printf("电脑赢\n");
}
if (ret == 'Q')
{
printf("平局\n");
}
}
主函数作为入口,让玩家自由选择进入游戏或者退出
int main()
{
int input = 0;
do
{
meun();
printf("请选择是否进入游戏:");
scanf("%d",&input);
switch (input)
{
case 1:
game();
break;
case 0:
printf("退出游戏\n");
break;
default:
printf("选择有误,请重新输入\n");
break;
}
} while (input);
return 0;
}
一些需要调用的库函数以及定义,函数声明放在自定义头文件中调用即可
#ifndef _GAME_H_
#define _GAME_H_
#include<stdio.h>
#include<stdlib.h>
#pragma once
#define ROW 3
#define COL 3
void InitBoard(char board[][COL],int row,int cow);
void ShowBoard(char board[][COL], int row, int col);
void PlayerMove(char board[][COL], int row, int col);
void ComputerMove(char board[][COL], int row, int col);
char IsWin(char board[][COL], int row, int col);
#endif
运行结果
更多有趣的经典小游戏实现专题,分享给大家:
C++经典小游戏汇总
python经典小游戏汇总
python俄罗斯方块游戏集合
JavaScript经典游戏 玩不停
java经典小游戏汇总
javascript经典小游戏汇总
来源:https://blog.csdn.net/qq_45042271/article/details/109956046
猜你喜欢
- 本文实例为大家分享了Android SurfaceView画板操作的具体代码,供大家参考,具体内容如下画板—&m
- 1、背景我有一堆学生数据,其中湖北省的学生需要排在所有数据的最前面。其余省正序排序,对于同一个省的数据,按照年龄倒序排序。2、分析对于上方的
- 背景环境已学习java基础,html,css,js,jquery,bootstrap,layui,maven,servlet和jsp,刚进入
- 1概述众所周知,Java支持平台无关性、安全性和网络移动性。而Java平台由Java虚拟机和Java核心类所构成,它为纯Java程序提供了统
- 最新Spring Data JPA官方参考手册 Version 2.0.0.RC2,2017-07-25https://docs.sprin
- 其实说实话,没有多大的可比较性,它们是完全不同的两个东西,它们的抽象不在同一个层级上。但是为了让大家更好的理解,还是做一个比较吧,毕竟它们都
- 一 模式介绍重试模式,是应用在异常处理中,发生异常的时候,能够对业务程序进行重新调用,在实际中,可以使用Polly提供稳定,简单的用法,自己
- Mybatis注解查找@Select( "SELECT * FROM tt_user WHERE username Like #{
- jmap:Java内存映像工具jmap(Memory Map for Java)命令用于生成堆转储快照(一般称为heapdump或dump文
- 在使用spring boot进行打包的时候出现了一些问题,不是说找不到主类,就是说spring初始化时有些类没有加载。下面介绍一下如何解决。
- log4j2支持日志的异步打印,日志异步输出的好处在于,使用单独的进程来执行日志打印的功能,可以提高日志执行效率,减少日志功能对正常业务的影
- 前言在日常开发中,圆形的图片效果还是很常见的。可以通过给Paint设置Xfermode来实现,这里简单记录如下。实现实现圆形效果的核心是Po
- 前言之所以要写这篇关于C#反射的随笔,起因有两个:第一个是自己开发的网站需要用到其次就是没看到这方面比较好的文章。所以下定决心自己写一篇,废
- 电话号码的字母组合中等给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。给出数字到字母的映射如下
- 前言:在 Java 中,让线程休眠的方法有很多,这些方法大致可以分为两类,一类是设置时间,在一段时间后自动唤醒,而另一个类是提供了一对休眠和
- Java注解是在JDK5时引入的新特性,鉴于目前大部分框架(如spring)都使用了注解简化代码并提高编码的效率,因此掌握并深入理解注解对于
- * 的实现使用的模式:代理模式。代理模式的作用是:为其他对象提供一种代理以控制对这个对象的访问。类似租房的中介。两种 * :(1)jd
- 今天是解决报错的一天,首先在操作Springboot中的时候,有些朋友的yml显示的不是绿叶的图标,或者是配置了之后不生效的问题。第一个解决
- 为什么需要在应用程序中增加渠道信息?Android应用的发布需要面对各种各样的市场,我们称之为渠道。有的时候,我们需要知道应用是从哪个渠道下
- 哈希表的分离链接法原理Hash Table可以看作是一种特殊的数组。他的原理基本上跟数组相同,给他一个数据,经过自己设置的哈希函数变换得到一