【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;
}
目录
相关文章
|
29天前
|
存储 算法 C语言
通义灵码在考研C语言和数据结构中的应用实践 1-5
通义灵码在考研C语言和数据结构中的应用实践,体验通义灵码的强大思路。《趣学C语言和数据结构100例》精选了五个经典问题及其解决方案,包括求最大公约数和最小公倍数、统计字符类型、求特殊数列和、计算阶乘和双阶乘、以及求斐波那契数列的前20项和。通过这些实例,帮助读者掌握C语言的基本语法和常用算法,提升编程能力。
60 4
|
27天前
|
存储 编译器 C语言
【c语言】数组
本文介绍了数组的基本概念及一维和二维数组的创建、初始化、使用方法及其在内存中的存储形式。一维数组通过下标访问元素,支持初始化和动态输入输出。二维数组则通过行和列的下标访问元素,同样支持初始化和动态输入输出。此外,还简要介绍了C99标准中的变长数组,允许在运行时根据变量创建数组,但不能初始化。
35 6
|
30天前
|
存储 算法 C语言
C语言:什么是指针数组,它有什么用
指针数组是C语言中一种特殊的数据结构,每个元素都是一个指针。它用于存储多个内存地址,方便对多个变量或数组进行操作,常用于字符串处理、动态内存分配等场景。
|
1月前
|
存储 C语言
C语言:一维数组的不初始化、部分初始化、完全初始化的不同点
C语言中一维数组的初始化有三种情况:不初始化时,数组元素的值是随机的;部分初始化时,未指定的元素会被自动赋值为0;完全初始化时,所有元素都被赋予了初始值。
|
算法 编译器 程序员
C语言学习笔记—P11(数组<2>+图解+题例+三子棋游戏<初级>)
C语言学习笔记(数组<2>+图解+题例+三子棋游戏<初级>)
130 0
C语言学习笔记—P11(数组<2>+图解+题例+三子棋游戏<初级>)
|
存储 C语言
C语言学习笔记—P10(数组<1>+图解+题例)
C语言学习笔记(数组<1>+图解+题例)
136 0
C语言学习笔记—P10(数组<1>+图解+题例)
|
C语言
C语言学习笔记——数组(二)
C语言学习笔记——数组
179 0
C语言学习笔记——数组(二)
|
C语言
C语言学习笔记——数组(一)
C语言学习笔记——数组
166 0
C语言学习笔记——数组(一)
|
1月前
|
C语言 C++
C语言 之 内存函数
C语言 之 内存函数
34 3
|
机器学习/深度学习 C语言 编译器
【C语言】学习笔记4——数组
我直接把控制语句和循环跳过了。大致看了一下,讲得太繁琐了。这部分在后面用C写数据结构就可以练得很熟了。 1. 数组: 由数据类型相同得一系列元素组成。内存上是一片连续得存储单元。 2. 声明 int nums[5] // 内含5个int类型元素的数组 float ...
1001 0