🚀Get to know🚀
😊大家好,我是适才,这是我的主页链接 🌐个人主页链接🌐欢迎您的到来😊
🎁欢迎各位➡点赞👍➕收藏⭐+关注💖+留言📝
🛸文章如果有错误,不足的地方。欢迎指出🛸
🌍希望你这篇文章对你有所帮助🌍
💌学习是终身的事业💌
🔴正文开始🔴
三子棋目录
前言
😋游戏的介绍😋
三子棋游戏是一种两人玩的棋类游戏,也称为连珠棋、井字棋等。游戏中,玩家轮流在一个 3 × 3 3 \times 3 3×3 的棋盘上下棋子,目标是在水平、垂直或对角线上连成三个棋子。先把三个棋子连成一条直线的玩家获胜。如果棋盘下满了棋子但没有一方获胜,则游戏平局。这个游戏简单易学,但也需要一些策略和思考能力。
模块化编程
🌅模块化编程介绍🌅
模块化编程是一种软件开发方法,它将程序分割成独立的、可重用的模块,每个模块都具有其特定的功能。模块化编程的主要目的是提高代码的可读性、可维护性和可扩展性。通过模块化编程,不同的团队可以并行地开发不同的模块,从而提高开发效率。此外,模块化编程也可以减少代码冗余、提高代码复用率,从而降低开发成本。
三子棋游戏
创建三个文件
🟢test.c——源文件—实现游戏的逻辑🟢
🟢game.c——源文件——实现函数的功能🟢
🟢game.h——头文件——实现头文件的引用和函数的声明🟢
1️⃣ 游戏的整体思路
🔹创建一个游戏菜单函数
🔹分支语句实现游戏的选择
🔹创建游戏函数来包含游戏需要实现的函数
🔹创建一个二维数组并初始化为空格
🔹创建打印棋盘函数并实现其功能
🔹创建玩家下棋函数并实现其功能
🔹创建电脑下棋函数并实现其功能
🔹创建判断输赢平局的函数并实现其功能
2️⃣ 游戏的逐步实现
🤩前面知道了游戏实现的总体思路,接下来就一步一步地完成游戏吧。🤩
◾ 游戏菜单函数
菜单的实现无非就是让用户知道怎么选择
菜单函数代码:
void meun()
{
printf("------------------三子棋游戏------------------\n");
printf("************* 0.exit 1.paly ****************\n");
printf("------------------三子棋游戏------------------\n");
}
😁我这菜单比较简陋,大家见谅一下😁
◾ 游戏的选择
游戏的菜单已经完成了,就要实现选择的功能。
这里分支语句采用的是switch多分支语句
这个模块比较简单,直接上代码
int main()
{
int input = 0;
srand((unsigned int)time(NULL));
do
{
meun();
printf("请选择:>");
scanf("%d", &input);
switch (input)
{
case 0:
printf("退出游戏\n");
break;
case 1:
Gmae_mitsuko();//游戏函数
break;
default:
printf("选择错误,请重新选择\n");
}
} while (input);
return 0;
}
◾ 创建游戏函数
▪ 二维数组
二维数组的行和列需在game.h当中进行宏定义
#define ROW 3 // 行
#define COL 3 //列
代码如下:
//创建二维数组
char broad[ROW][COL] = { 0 };
▪ 初始化函数
需要在game.h中进行声明
代码如下:
//初始化棋盘函数
void Init_broad(char str[ROW][COL],int row, int col);
函数的实现:
//初始化棋盘函数
void Init_broad(char str[ROW][COL], int row, int col)
{
int i = 0;
int j = 0;
for (i = 0; i < row; i++)
{
for (j = 0; j < col; j++)
{
str[i][j] = ' ';//二维数组初始化为空格
}
}
}
▪ 打印棋盘函数
棋盘是一个井字棋盘
在game.h中进行声明
代码如下:
//打印棋盘函数
void Print_broad(char str[ROW][COL], int row, int col);
函数的实现
//打印棋盘函数
void Print_broad(char str[ROW][COL], int row, int col)
{
int i = 0;
int j = 0;
for (i = 0; i < row; i++)
{
for (j = 0; j < col; j++)
{
printf(" %c ", str[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");
}
}
}
▪ 玩家下棋函数
玩家下棋让玩家输入坐标
棋盘空的位置上面落子,并且要判断坐标的合法性
‘0’——这个符号是玩家的符号。
依然先在game.h中声明
代码如下:
//玩家下棋
void Player(char str[ROW][COL], int row, int col);
函数的实现
//玩家下棋
void Player(char str[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 <= 3) && (y >= 1 && y <= 3))
{
//由于数组坐标是从0开始的
//减1也是由于这个
if (str[x-1][y-1] == ' ')
{
str[x-1][y-1] = '0';
break;
}
else
{
printf("该坐标已被占用,重新输入\n");
}
}
else
{
printf("坐标非法,重新输入\n");
}
}
}
▪ 电脑下棋函数
📑需引用头文件📑
#include<stdlib.h>—— /* srand rand*/
#include<time.h>—— /* time */
在电脑下棋之前,先详解两个函数——rand
🥳rand——会生成随机值的一个库函数🥳
参数:int rand (void)
🌈使用案例🌈
v1 = rand() % 100; // v1 in the range 0 to 99
v2 = rand() % 100 + 1; // v2 in the range 1 to 100
v3 = rand() % 30 + 1985; // v3 in the range 1985-2014
实现之前还要知道另一个库函数——srand
🥳srand——初始化随机数生成器🥳
参数:void srand (unsigned int seed);
srand使用:
srand((unsigned int)time(NULL));
函数的实现:
//电脑下棋
void computer(char str[ROW][COL], int row, int col)
{
printf("电脑\n");
int x = 0;
int y = 0;
while (1)
{
x = rand() % row;
y = rand() % col;
if (str[x][y] == ' ')
{
str[x][y] = '1';
break;
}
}
}
▪ 判断游戏的输赢
判断游戏的输赢符号(可以自定义)
我这里分别是
’ 0 '——玩家
‘ 1 ’——电脑
‘ a '——平局
’ b '——继续
对于三子棋判断输赢的三个条件
🚀1. 横三行的每个字符相等并且不是空格🚀
🚀2. 竖三列的每个字符相等并且不是空格🚀
🚀3. 两条对角线每个字符相等并且不是空格🚀
判断输赢函数的代码:
char if_win(char str[ROW][COL], int row, int col)
{
int i = 0;
//判断横三行
for (i = 0; i < row; i++)
{
if (str[i][0] == str[i][1] && str[i][0] == str[i][2] && str[i][1] != ' ')
{
return str[i][1];
}
}
//判断列三行
for (i = 0; i < row; i++)
{
if (str[0][i] == str[1][i] && str[0][i] == str[2][i] && str[1][i] != ' ')
{
return str[1][i];
}
}
//判断两条对角线
if (str[0][0] == str[1][1] && str[1][1] == str[2][2] && str[1][1] != ' ')
{
return str[1][1];
}
if (str[0][2] == str[1][1] && str[1][1] == str[2][0] && str[1][1] != ' ')
{
return str[1][1];
}
int ret = if_Dead_heat(str, row, col);//判断平局函数
if (ret == 1)
{
return 'b';
}
return 'a';
}
为了判断是否平局,创建了一个函数
代码如下:
//判断平局函数
int if_Dead_heat(char str[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 (str[i][j] == ' ')
return 0;
}
}
return 1;
}
到这里,游戏已经完成
🚀总体效果图如下🚀
玩家赢
电脑赢
平局
全部代码
Ⅰ test.c
🛸内部包含了一个猜数字的小游戏🛸
#define _CRT_SECURE_NO_WARNINGS 1
#include"Game_mitsuko.h"
---------------------------------------------------------------------
猜数字游戏
//
//
菜单
//void meun()
//{
// printf("---------------猜数字游戏------------\n");
// printf("********** 1.paly 0.exit *******\n");
// printf("---------------猜数字游戏------------\n");
//}
//
游戏实现
//void game_guess()
//{
// int key = 0;
//
// int ret = rand() % 100 + 1;
// int i = 5;
// while (i)
// {
// printf("有%d机会\n",i);
// printf("请猜数字:>");
// scanf("%d", &key);
// if (key > ret)
// {
// printf("猜大了\n");
// i--;
// }
// else if (key < ret)
// {
// printf("猜小了\n");
// i--;
// }
// else
// {
// printf("恭喜你,猜对了\n");
// break;
// }
// }
// if (i == 0)
// {
// printf("次数已用完,请重新开始\n");
// }
//}
//
//
//int main()
//{
//
// int input = 0;
// srand((unsigned int)(time) NULL);
// do
// {
// meun();
// printf("请选择:>");
// scanf("%d",&input);
// switch (input)
// {
// case 0:
// printf("退出游戏\n");
// break;
// case 1:
// game_guess();
// break;
// default:
// printf("选择错误,请重新选择\n");
// }
// } while (input);
// return 0;
//}
//---------------------------------------------------------------------
//三子棋
//菜单
void meun()
{
printf("------------------三子棋游戏------------------\n");
printf("************* 0.exit 1.paly ****************\n");
printf("------------------三子棋游戏------------------\n");
}
//游戏函数
void Gmae_mitsuko()
{
//创建二维数组
char broad[ROW][COL] = { 0 };
//初始化二维数组为空格
Init_broad(broad,ROW,COL);
//打印棋盘函数
//Print_broad(broad, ROW, COL);
while (1)
{
//玩家下棋
Player(broad, ROW, COL);
Print_broad(broad, ROW, COL);
char pc = if_win(broad, ROW, COL);
if (pc != 'a')
{
break;
}
//电脑下棋
computer(broad, ROW, COL);
Print_broad(broad, ROW, COL);
if (pc != 'a')
{
break;
}
}
//判断输赢
char pc = if_win(broad, ROW, COL);
if (pc == '0')
{
printf("玩家赢\n");
}
else if (pc == '1')
{
printf("电脑赢\n");
}
else if (pc == 'b')
{
printf("平局\n");
}
}
int main()
{
int input = 0;
srand((unsigned int)time(NULL));
do
{
meun();
printf("请选择:>");
scanf("%d", &input);
switch (input)
{
case 0:
printf("退出游戏\n");
break;
case 1:
Gmae_mitsuko();
break;
default:
printf("选择错误,请重新选择\n");
}
} while (input);
return 0;
}
Ⅱ game.c
#define _CRT_SECURE_NO_WARNINGS 1
#include"Game_mitsuko.h"
//初始化棋盘函数
void Init_broad(char str[ROW][COL], int row, int col)
{
int i = 0;
int j = 0;
for (i = 0; i < row; i++)
{
for (j = 0; j < col; j++)
{
str[i][j] = ' ';
}
}
}
//打印棋盘函数
void Print_broad(char str[ROW][COL], int row, int col)
{
int i = 0;
int j = 0;
for (i = 0; i < row; i++)
{
for (j = 0; j < col; j++)
{
printf(" %c ", str[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 Player(char str[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 <= 3) && (y >= 1 && y <= 3))
{
//由于数组坐标是从0开始的
//减1也是由于这个
if (str[x-1][y-1] == ' ')
{
str[x-1][y-1] = '0';
break;
}
else
{
printf("该坐标已被占用,重新输入\n");
}
}
else
{
printf("坐标非法,重新输入\n");
}
}
}
//电脑下棋
void computer(char str[ROW][COL], int row, int col)
{
printf("电脑\n");
int x = 0;
int y = 0;
while (1)
{
x = rand() % row;
y = rand() % col;
if (str[x][y] == ' ')
{
str[x][y] = '1';
break;
}
}
}
//判断平局函数
int if_Dead_heat(char str[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 (str[i][j] == ' ')
return 0;
}
}
return 1;
}
//判断输赢
char if_win(char str[ROW][COL], int row, int col)
{
int i = 0;
//判断横三行
for (i = 0; i < row; i++)
{
if (str[i][0] == str[i][1] && str[i][0] == str[i][2] && str[i][1] != ' ')
{
return str[i][1];
}
}
//判断列三行
for (i = 0; i < row; i++)
{
if (str[0][i] == str[1][i] && str[0][i] == str[2][i] && str[1][i] != ' ')
{
return str[1][i];
}
}
//判断两条对角线
if (str[0][0] == str[1][1] && str[1][1] == str[2][2] && str[1][1] != ' ')
{
return str[1][1];
}
if (str[0][2] == str[1][1] && str[1][1] == str[2][0] && str[1][1] != ' ')
{
return str[1][1];
}
int ret = if_Dead_heat(str, row, col);//判断平局函数
if (ret == 1)
{
return 'b';
}
return 'a';
}
Ⅲ game.h
#pragma once //为了避免同一个头文件被包含(include)多次
#define ROW 3 // 行
#define COL 3 //列
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
//初始化棋盘函数
void Init_broad(char str[ROW][COL],int row, int col);
//打印棋盘函数
void Print_broad(char str[ROW][COL], int row, int col);
//玩家下棋
void Player(char str[ROW][COL], int row, int col);
//电脑下棋
void computer(char str[ROW][COL], int row, int col);
//判断输赢
char if_win(char str[ROW][COL], int row, int col);