三子棋 —— 利用C语言数组实现的简单游戏 玩转华为云
1. 前言
进入C语言初阶的学习已经有一段时间,已经能完成简单的分支循环语句,学习了函数和数组的运用,学习了递归等函数,已经能具备了实现一款小游戏的时候,相信经过反复咀嚼,能很快理解和完成这个游戏!
作为草稿纸上常出现的小游戏,三子棋的逻辑可谓是非常简单了,只需要玩家走一步、电脑走一步,并在八种可能获胜结果中比对就行了,下面让我们一起来看看三子棋的实现。
1.1 三子棋游戏规则
是黑白棋的一种。三子棋是一种民间传统游戏,又叫九宫棋、圈圈叉叉、一条龙、井字棋等。将正方形对角线连起来,相对两边依次摆上三个双方棋子,只要将自己的三个棋子走成一条线,对方就算输了。但是,有很多时候会出现和棋的情况。
2. 正文
本程序员一共==三个文件==
- “tast.c” —— 存储文件主函数,和game游戏主要逻辑
- “game.c” —— 存储game函数里出现函数实现方法,对game里的方法进行封装方便直接调用
- “tast.h” —— 存放头文件及其函数声明和宏,方便前两个函数引用
2.1 主文件部分 (tast.c)
主文件的负责程序的主要逻辑,包括了,main函数,game函数,menu函数等,主要负责给整个程序一个框架,建立了整个应用最初始的逻辑体系。
2.1.1 主函数部分(main)
主函数部分的逻辑为进入循环后先打印菜单,然后选择1则是进入游戏函数,选择0则跳出循环结束程序,选其他的提示输入错误。
以下是实现的函数部分
//menu为菜单答应函数
void menu()
{
printf("************************\n");
printf("******* 1.play *******\n");
printf("******* 2.exit *******\n");
printf("************************\n");
}
int main()
{
int input = 0;
printf("欢迎进入三子棋游戏\n");
do
{
menu();//打印菜单 //1.play 2.exit
printf("请选择 >");
scanf("%d", &input); //输入选项,选择是否开始游戏
switch (input)//下面就是选择分支语句了
{
case 1:
printf("进入游戏\n");
game();
break;
case 0:
printf("退出游戏\n");
break;
default:
printf("选择错误请从新选择\n");
break;
}
} while (input);
return 0;
}
2.1.2 游戏函数部分(game)
游戏函数部分里主要是写出大框架,调用相对应的函数,完成了初始化,下棋,获胜判定等一系列逻辑判断。
2.2 头文件部分 (tast.h)
这个头文件是自己建立的,目的就是在主函数源文件(test.c)和功能实现函数(game.c)中搭起一座沟通的桥梁,方便这两个文件取用
2.3 功能函数部分
功能函数由五个函数组成,每个函数都有自己对应的功能,具体实现了初始化棋盘,打印棋盘,人下棋,电脑下棋,判断输赢的功能,使得主函数调用便可使用,不用每次都用相同的功能都得重新写。
2.3.1 初始化棋盘
此处有些类容与后面雷同,就不后面就不做解释了
2.3.2 打印棋盘函数
2.3.3 玩家落子函数
2.3.3 电脑落子函数
2.3.3 检查输赢的函数
3. 效果展示
如同三种情况无一缺席,我们的代码基本可以满足需求
3.1 代码展示
3.1.1主函数代码
#define _CRT_SECURE_NO_WARNINGS 1
#include "test.h"
void menu()
{
printf("************************\n");
printf("******* 1.play *******\n");
printf("******* 2.exit *******\n");
printf("************************\n");
}
void game()//游戏主体 通过调用函数实现
{
char board[HANG][LIE] = {0};
//初始化棋盘
InitBoard(board, HANG, LIE);
srand((unsigned int)time(NULL));
//打印棋盘
//DisplayBoard(board, HANG, LIE);
char ret = 0;
while(1){
//玩家下棋
//DisplayBoard(board, HANG, LIE);
PlayerMove(board, HANG, LIE);
ret = IsWin(board, HANG, LIE);
if (ret != 'C')
break;
//电脑下棋
ComputerMove(board, HANG, LIE);
//DisplayBoard(board, HANG, LIE);
ret = IsWin(board, HANG, LIE);
if (ret != 'C')
break;
}
if (ret == '*')
{
printf("玩家获胜\n");
}
if (ret == '#')
{
printf("电脑获胜\n");
}
if(ret == 'Q')
{
printf("平局\n");
}
}
int main()
{
int input = 0;
printf("欢迎进入三子棋游戏\n");
do
{
menu();
printf("请选择 >");
scanf("%d", &input);
switch (input)
{
case 1:
printf("进入游戏\n");
game();
break;
case 0:
printf("退出游戏\n");
break;
default:
printf("选择错误请从新选择\n");
break;
}
} while (input);
return 0;
}
3.1.2头文件代码
#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include <windows.h>
#define HANG 3
#define LIE 3
void InitBoard(char board[HANG][LIE], int hang, int lie);
void DisplayBoard(char board[HANG][LIE], int hang, int lie);
void PlayerMove(char board[HANG][LIE], int hang, int lie);
void ComputerMove(char board[HANG][LIE], int hang, int lie);
//玩家 *
//电脑 #
//平局 Q
//继续 c
char IsWin(char board[HANG][LIE], int hang, int lie);
3.1.2功能函数代码
#define _CRT_SECURE_NO_WARNINGS 1
#include "test.h"
//初始化棋盘
void InitBoard(char board[HANG][LIE] ,int hang ,int lie )
{
for (int h = 0; h <= hang - 1; h++) {
for (int l = 0; l <= lie - 1; l++) {
board[h][l] = ' ';
}
}
}
//打印棋盘
void DisplayBoard(char board[HANG][LIE], int hang, int lie)
{
for (int h = 0; h <= hang - 1; h++)
{
for (int l = 0; l <= lie - 1; l++)
{
printf(" %c ",board[h][l]);
if (l < lie-1)//筛选 最后一行列不打印 |
printf("|");
}
printf("\n");
if (h < hang - 1)
{
for (int i = 1; i <= lie; i++)
{
printf("---");
if (i <= lie - 1)
printf("|");
}
printf("\n");
}
}
}
void PlayerMove(char board[HANG][LIE], int hang, int lie)
{
int x = 0;
int y = 0;
while (1)
{
DisplayBoard(board, HANG, LIE);
printf("请落子");
scanf("%d %d", &x, &y);
if (x >= 1 && x <= hang && y >= 1 && y <= lie) {
if (board[x - 1][y - 1] == ' ') {
board[x - 1][y - 1] = '*';
break;
}
else
{
printf("该位子以落子,请从新落子\n");
}
}
else
{
printf("坐标不合法,重新输入\n");
}
}
system("cls");//刷新
}
void ComputerMove(char board[HANG][LIE], int hang, int lie)
{
int x = 0;
int y = 0;
printf("电脑下棋\n");
while (1)
{
int x = rand() % hang;
int y = rand() % lie;
if (board[x][y] == ' ')
{
board[x][y] = '#';
break;
}
}
system("cls");//刷新
}
char IsWin(char board[HANG][LIE], int hang, int lie)
{
for (int h = 0; h < hang; h++) {
if (board[h][0] == board[h][1] && board[h][1] == board[h][2] && board[h][0] != ' ')
{
return board[h][0];
}
if (board[0][h] == board[1][h] && board[1][h] == board[2][h] && board[0][h] != ' ')
{
return board[h][0];
}
}
if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[0][0] != ' ')
{
return board[1][1];
}
if (board[2][0] == board[1][1] && board[1][1] == board[0][2] && board[1][1] != ' ')
{
return board[1][1];
}
for (int h = 0; h < hang; h++) {
for (int l = 0; l < lie; l++) {
if (board[h][l] == ' ')
{
return 'C';
}
}
}
return 'Q';
}
4. 一下GPT为我代码写的总结
这段代码实现了一个简单的三子棋游戏。以下是对代码的总结:
主函数(main):程序的入口,通过调用其他函数实现游戏的开始、进行和结束。在一个循环中,根据用户的选择调用不同的函数。
菜单函数(menu):打印游戏菜单,供用户选择开始游戏或退出游戏。
游戏函数(game):游戏的主体部分,通过调用其他函数来实现游戏的进行。首先初始化棋盘,然后进入一个循环,在每轮循环中玩家和电脑交替下棋,直到有玩家获胜或平局。
功能函数头文件(test.h):声明了游戏中使用的函数和常量。
初始化棋盘函数(InitBoard):将棋盘数组中的所有元素初始化为空格。
打印棋盘函数(DisplayBoard):以可视化的形式打印当前的棋盘状态。
玩家下棋函数(PlayerMove):提示玩家输入落子位置的坐标,判断输入的合法性,然后在棋盘上相应位置落下玩家的棋子。
电脑下棋函数(ComputerMove):通过随机生成坐标的方式,选择一个合法的位置,在棋盘上落下电脑的棋子。
判断胜负函数(IsWin):根据当前棋盘状态判断游戏是否结束,返回相应的结果。检查每行、每列和对角线上是否有连续的三个相同的棋子。
代码的逻辑清晰,通过不同的函数实现了游戏的各个功能模块,使得代码结构更加清晰易读。这段代码实现了一个简单的三子棋游戏,可以通过玩家和电脑之间交替下棋,判断胜负并输出结果。
- 点赞
- 收藏
- 关注作者
评论(0)