【C语言】 数组的应用实例:三子棋游戏

简介: 三子棋规则将正方形对角线连起来,相对两边依次摆上三个双方棋子,只要将自己的三个棋子走成一条线,对方就算输了三子棋游戏运行步骤,进入游戏界面,选择进入游戏或者退出游戏,输入1或者0来实现进入游戏或者退出游戏,棋盘进行初始化处理,打印空棋盘,玩家进行下棋,电脑下棋,判断输赢 判断输赢分为: 玩家赢 电脑赢 棋盘无空位(双方平局) 继续下棋(返回第6步)

目录


三子棋规则

三子棋游戏运行步骤

一、代码构成

游戏模块图

如何在vs编译器中建立game.c和game.h文

建立test.c文件和game.c文

      建立game.h头文件

      新建完文件

二、游戏代码和讲解

       程序步骤

1.建立菜单(游戏选择界面)

2.用switch语句来实现选择

3.定义一个char类型的数组

4.初始化棋盘

5.打印棋盘函数(九宫格)

6.玩家下棋

7.电脑下棋

8.判断游戏状态函数

三、全部代码如下

game.h

game.c

test.c



三子棋规则

将正方形对角线连起来,相对两边依次摆上三个双方棋子,只要将自己的三个棋子走成一条线,对方就算输了


三子棋游戏运行步骤

image.png

 

一、代码构成


游戏模块图

image.png

main函数在test.c文件中,test.c文件里编写测试游戏逻辑,game.c里进行函数的实现,game.h文件里进行函数的声明。通过#include "game.h"来调用。


如何在vs编译器中建立game.c和game.h文件


建立test.c文件和game.c文件

image.png

image.png

建立game.h头文件

image.png

image.png


新建完文件

image.png


二、游戏代码和讲解

程序步骤

  1. 程序运行进入游戏菜单栏
  2. 定义一个char类型的数组
  3. 初始化棋盘
  4. 打印空棋盘(九宫格)
  5. 玩家下棋函数
  6. 电脑下棋函数
  7. 判断游戏状态函数


1.建立菜单(游戏选择界面)

voidmenu()
{
printf("***********************\n");
printf("******1. 开始游戏******\n");
printf("******0. 退出游戏******\n");
printf("***********************\n");
}

image.png这样就拥有了游戏开始界面


2.用switch语句来实现选择


do    {
menu();
printf("请选择|:");
scanf("%d", &input);
switch (input)
        {
case1:
/*printf("游戏开始\n");*/game();
break;
case0:
printf("退出游戏\n");
break;
default:
printf("输入错误,重新输入!\n");
break;
        }
    } while (input);

这里定义一个整形变量 当input为0时,跳出do...while循环。


输入1  进入游戏


输入0  退出游戏


输入其他数字  则输出( 输入错误,重新输入 )  input不为0,则继续进入循环。


3.定义一个char类型的数组


在game.h中定义 ROW COL  为3   方便后期的调整


#define ROW 3#define COL 3

在game函数里定义一个char类型的素组

charboard[ROW][COL] = { 0 };


#include"game1.h"

记得引用game.h的头文件。


4.初始化棋盘


头文件game.h  声明

voidNewRoard(charboard[ROW][COL], introw, intcol);

在test.c 调用 NewRoard 函数

//棋盘初始化NewRoard(board, ROW, COL);

在game.c中完成函数的实现

voidNewRoard(charboard[ROW][COL], introw, intcol)
{
inti=0;
for (i=0; i<row; i++)
    {
intj=0;
for (j=0; j<col; j++)
        {
board[i][j] =' ';
        }
    }
}


5.打印棋盘函数(九宫格

九宫格由符号来实现 横线使用 --- 竖线使用  |  

代码顺序(头文件、test.c、game.c)

voidPriRoard(charboard[ROW][COL], introw, intcol);


PriRoard(board, ROW, COL);
voidPriRoard(charboard[ROW][COL], introw, intcol)
{
inti=0;
for (i=0; i<row; i++)
    {
intj=0;
for (j=0; j<col; j++)
        {
printf(" %c ", board[i][j]);
if(j<col-1)
printf("|");
        }
printf("\n");
if (i<row-1)
        {
intj=0;
for (j=0; j<row; j++)
            {
printf("---");
if(j<row-1)
printf("|");
            }
        }
printf("\n");
    }
}



6.玩家下棋

由于玩家不一定是程序员,不知道数组起始是0,也为了方便游玩的时候使用方便,玩家输入1-3 之间的两个数字进入  函数编写时要进行减运算

image.png

代码顺序(头文件、test.c、game.c)


voidPlayRoard(charboard[ROW][COL], introw, intcol);
PlayRoard(board, ROW, COL);
voidPlayRoard(charboard[ROW][COL], introw, intcol)
{
intx=0;
inty=0;
printf("玩家请下棋\n");
while (1)
        {
printf("玩家请输入坐标:>");
scanf("%d %d", &x, &y);
if (x>=1&&x<=row&&y>=1&&y<=row)
            {
if (board[x-1][y-1] ==' ')
                {
board[x-1][y-1] ='*';
break;
                }
else                {
printf("位置已被占用,请重新输入\n");
                }
            }
else            {
printf("输入错误,重新输入\n");
            }
        }
}

7.电脑下棋

这里使用srand函数来生成随机数  


需要用到    #include      #include   两个库函数


用rand进行调用,将rand的随机数%(模)3得到0-2随机数


代码顺序(头文件、test.c、game.c)

voidCompRoard(charboard[ROW][COL], introw, intcol);


CompRoard(board, ROW, COL);


voidCompRoard(charboard[ROW][COL], introw, intcol)
{
intx=0;
inty=0;
printf("电脑下棋\n");
while (1)
    {
intx=rand() %row;
inty=rand() %col;
if (board[x][y] ==' ')
            {
board[x][y] ='#';
break;
            }
    }
}

8.判断游戏状态函数

判断游戏状态可以分为   玩家赢  电脑赢   平局(棋盘满) 继续


编写一个函数   当玩家赢的时候返回 " * "


                        当电脑赢的时候返回 " # "


                        当平局的时候返回     " Q "


                        当继续的时候返回     " C "


代码顺序(test.c、game.c)


IsWin(board, ROW, COL);


intIsFull(charboard[ROW][COL], introw, intcol)
{
inti=0;
for (i=0; i<row; i++)
    {
intj=0;
for (j=0;j<col;j++)
        {
if (board[i][j] ==' ')
return0;
        }
    }
return1;
}
charIsWin(charboard[ROW][COL], introw, intcol)
{
inti=0;
for (i=0; i<row; i++) 
    {
if (board[i][0] ==board[i][1] &&board[i][1] ==board[i][2] &&board[i][0] !=' ')
        {
returnboard[i][0];
        }
    }
for (i=0; i<col; i++)
    {
if (board[0][i] ==board[1][i] &&board[1][i] ==board[2][i] &&board[0][i] !=' ')
        {
returnboard[0][i];
        }
    }
if (board[0][0] ==board[1][1] &&board[1][1] ==board[2][2]&&board[1][1] !=' ')
    {
returnboard[0][0];
    }
if (board[0][2] ==board[1][1] &&board[1][1] ==board[2][0] &&board[1][1] !=' ')
    {
returnboard[1][1];
    }
if (IsFull(board,row,col))
    {
return'Q';
    }
return'C';
}

三、全部代码如下


game.h


#pragma once#define ROW 3#define COL 3#include<stdio.h>#include<string.h>#include<stdlib.h>#include<time.h>voidNewRoard(charboard[ROW][COL], introw, intcol);
voidPriRoard(charboard[ROW][COL], introw, intcol);
voidPlayRoard(charboard[ROW][COL], introw, intcol);
voidCompRoard(charboard[ROW][COL], introw, intcol);
charIsWin(charboard[ROW][COL], introw, intcol);

game.c

#define _CRT_SECURE_NO_WARNINGS 1#include"game1.h"voidNewRoard(charboard[ROW][COL], introw, intcol)
{
inti=0;
for (i=0; i<row; i++)
    {
intj=0;
for (j=0; j<col; j++)
        {
board[i][j] =' ';
        }
    }
}
voidPriRoard(charboard[ROW][COL], introw, intcol)
{
inti=0;
for (i=0; i<row; i++)
    {
intj=0;
for (j=0; j<col; j++)
        {
printf(" %c ", board[i][j]);
if(j<col-1)
printf("|");
        }
printf("\n");
if (i<row-1)
        {
intj=0;
for (j=0; j<row; j++)
            {
printf("---");
if(j<row-1)
printf("|");
            }
        }
printf("\n");
    }
}
voidPlayRoard(charboard[ROW][COL], introw, intcol)
{
intx=0;
inty=0;
printf("玩家请下棋\n");
while (1)
        {
printf("玩家请输入坐标:>");
scanf("%d %d", &x, &y);
if (x>=1&&x<=row&&y>=1&&y<=row)
            {
if (board[x-1][y-1] ==' ')
                {
board[x-1][y-1] ='*';
break;
                }
else                {
printf("位置已被占用,请重新输入\n");
                }
            }
else            {
printf("输入错误,重新输入\n");
            }
        }
}
voidCompRoard(charboard[ROW][COL], introw, intcol)
{
intx=0;
inty=0;
printf("电脑下棋\n");
while (1)
    {
intx=rand() %row;
inty=rand() %col;
if (board[x][y] ==' ')
            {
board[x][y] ='#';
break;
            }
    }
}
intIsFull(charboard[ROW][COL], introw, intcol)
{
inti=0;
for (i=0; i<row; i++)
    {
intj=0;
for (j=0;j<col;j++)
        {
if (board[i][j] ==' ')
return0;
        }
    }
return1;
}
charIsWin(charboard[ROW][COL], introw, intcol)
{
inti=0;
for (i=0; i<row; i++) 
    {
if (board[i][0] ==board[i][1] &&board[i][1] ==board[i][2] &&board[i][0] !=' ')
        {
returnboard[i][0];
        }
    }
for (i=0; i<col; i++)
    {
if (board[0][i] ==board[1][i] &&board[1][i] ==board[2][i] &&board[0][i] !=' ')
        {
returnboard[0][i];
        }
    }
if (board[0][0] ==board[1][1] &&board[1][1] ==board[2][2]&&board[1][1] !=' ')
    {
returnboard[0][0];
    }
if (board[0][2] ==board[1][1] &&board[1][1] ==board[2][0] &&board[1][1] !=' ')
    {
returnboard[1][1];
    }
if (IsFull(board,row,col))
    {
return'Q';
    }
return'C';
}

test.c


#define _CRT_SECURE_NO_WARNINGS 1#include"game1.h"voidgame()
{
printf("游戏开始\n");
//存放数组charboard[ROW][COL] = { 0 };
//棋盘初始化NewRoard(board, ROW, COL);
//打印棋盘PriRoard(board, ROW, COL);
charret=0;
while (1)
    {
//玩家下棋PlayRoard(board, ROW, COL);
//打印棋盘PriRoard(board, ROW, COL);
//判断输赢ret=IsWin(board, ROW, COL);
if (ret!='C')
        {
break;
        }
电脑下棋CompRoard(board, ROW, COL);
打印棋盘PriRoard(board, ROW, COL);
判断输赢ret=IsWin(board, ROW, COL);
if (ret!='C')
        {
break;
        }
    }
if (ret=='*')
printf("玩家赢\n");
elseif (ret=='#')
printf("电脑赢\n");
elseif (ret=='Q')
printf("平局\n");
}
voidmenu()
{
printf("***********************\n");
printf("******1. 开始游戏******\n");
printf("******0. 退出游戏******\n");
printf("***********************\n");
}
intmain()
{
intinput=0;
srand((unsignedint)time(NULL));
do    {
menu();
printf("请选择|:");
scanf("%d", &input);
switch (input)
        {
case1:
/*printf("游戏开始\n");*/game();
break;
case0:
printf("退出游戏\n");
break;
default:
printf("输入错误,重新输入!\n");
break;
        }
    } while (input);
return0;
}
目录
相关文章
|
2月前
|
存储 网络协议 算法
【C语言】进制转换无难事:二进制、十进制、八进制与十六进制的全解析与实例
进制转换是计算机编程中常见的操作。在C语言中,了解如何在不同进制之间转换数据对于处理和显示数据非常重要。本文将详细介绍如何在二进制、十进制、八进制和十六进制之间进行转换。
94 5
|
2月前
|
传感器 算法 安全
【C语言】两个数组比较详解
比较两个数组在C语言中有多种实现方法,选择合适的方法取决于具体的应用场景和性能要求。从逐元素比较到使用`memcmp`函数,再到指针优化,每种方法都有其优点和适用范围。在嵌入式系统中,考虑性能和资源限制尤为重要。通过合理选择和优化,可以有效提高程序的运行效率和可靠性。
187 6
|
3月前
|
机器学习/深度学习 算法 数据挖掘
C语言在机器学习中的应用及其重要性。C语言以其高效性、灵活性和可移植性,适合开发高性能的机器学习算法,尤其在底层算法实现、嵌入式系统和高性能计算中表现突出
本文探讨了C语言在机器学习中的应用及其重要性。C语言以其高效性、灵活性和可移植性,适合开发高性能的机器学习算法,尤其在底层算法实现、嵌入式系统和高性能计算中表现突出。文章还介绍了C语言在知名机器学习库中的作用,以及与Python等语言结合使用的案例,展望了其未来发展的挑战与机遇。
78 1
|
3月前
|
并行计算 算法 测试技术
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面,旨在通过综合策略提升程序性能,满足实际需求。
99 1
|
3月前
|
存储 程序员 编译器
C 语言数组与指针的深度剖析与应用
在C语言中,数组与指针是核心概念,二者既独立又紧密相连。数组是在连续内存中存储相同类型数据的结构,而指针则存储内存地址,二者结合可在数据处理、函数传参等方面发挥巨大作用。掌握它们的特性和关系,对于优化程序性能、灵活处理数据结构至关重要。
|
3月前
|
存储 缓存 算法
在C语言中,数据结构是构建高效程序的基石。本文探讨了数组、链表、栈、队列、树和图等常见数据结构的特点、应用及实现方式
在C语言中,数据结构是构建高效程序的基石。本文探讨了数组、链表、栈、队列、树和图等常见数据结构的特点、应用及实现方式,强调了合理选择数据结构的重要性,并通过案例分析展示了其在实际项目中的应用,旨在帮助读者提升编程能力。
99 5
|
1月前
|
存储 编译器 C语言
【C语言程序设计——函数】分数数列求和2(头歌实践教学平台习题)【合集】
函数首部:按照 C 语言语法,函数的定义首部表明这是一个自定义函数,函数名为fun,它接收一个整型参数n,用于指定要求阶乘的那个数,并且函数的返回值类型为float(在实际中如果阶乘结果数值较大,用float可能会有精度损失,也可以考虑使用double等更合适的数据类型,这里以float为例)。例如:// 函数体代码将放在这里函数体内部变量定义:在函数体中,首先需要定义一些变量来辅助完成阶乘的计算。比如需要定义一个变量(通常为float或double类型,这里假设用float。
37 3
|
1月前
|
存储 算法 安全
【C语言程序设计——函数】分数数列求和1(头歌实践教学平台习题)【合集】
if 语句是最基础的形式,当条件为真时执行其内部的语句块;switch 语句则适用于针对一个表达式的多个固定值进行判断,根据表达式的值与各个 case 后的常量值匹配情况,执行相应 case 分支下的语句,直到遇到 break 语句跳出 switch 结构,若没有匹配值则执行 default 分支(可选)。例如,在判断一个数是否大于 10 的场景中,条件表达式为 “num> 10”,这里的 “num” 是程序中的变量,通过比较其值与 10 的大小关系来确定条件的真假。常量的值必须是唯一的,且在同一个。
20 2
|
1月前
|
存储 C语言
【C语言程序设计——函数】递归求斐波那契数列的前n项(头歌实践教学平台习题)【合集】
本关任务是编写递归函数求斐波那契数列的前n项。主要内容包括: 1. **递归的概念**:递归是一种函数直接或间接调用自身的编程技巧,通过“俄罗斯套娃”的方式解决问题。 2. **边界条件的确定**:边界条件是递归停止的条件,确保递归不会无限进行。例如,计算阶乘时,当n为0或1时返回1。 3. **循环控制与跳转语句**:介绍`for`、`while`循环及`break`、`continue`语句的使用方法。 编程要求是在右侧编辑器Begin--End之间补充代码,测试输入分别为3和5,预期输出为斐波那契数列的前几项。通关代码已给出,需确保正确实现递归逻辑并处理好边界条件,以避免栈溢出或结果
66 16
|
1月前
|
存储 编译器 C语言
【C语言程序设计——函数】回文数判定(头歌实践教学平台习题)【合集】
算术运算于 C 语言仿若精密 “齿轮组”,驱动着数值处理流程。编写函数求区间[100,500]中所有的回文数,要求每行打印10个数。根据提示在右侧编辑器Begin--End之间的区域内补充必要的代码。如果操作数是浮点数,在 C 语言中是不允许直接进行。的结果是 -1,因为 -7 除以 3 商为 -2,余数为 -1;注意:每一个数据输出格式为 printf("%4d", i);的结果是 1,因为 7 除以 -3 商为 -2,余数为 1。取余运算要求两个操作数必须是整数类型,包括。开始你的任务吧,祝你成功!
52 1