当前位置 : 主页 > 手机开发 > harmonyos >

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

来源:互联网 收集:自由互联 发布时间:2023-08-28
目录 三子棋规则 三子棋游戏运行步骤 一、代码构成 游戏模块图 如何在vs编译器中建立game.c和game.h文件 建立test.c文件和game.c文件 建立game.h头文件 新建完文件 二、游戏代码和讲解 程序


目录

三子棋规则

三子棋游戏运行步骤

一、代码构成

游戏模块图

如何在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


三子棋规则

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

三子棋游戏运行步骤

  1. 进入游戏界面
  2. 选择进入游戏或者退出游戏
  3. 输入1或者0来实现进入游戏或者退出游戏
  4. 棋盘进行初始化处理
  5. 打印空棋盘
  6. 玩家进行下棋
  7. 电脑下棋
  8. 判断输赢 

     判断输赢分为:  玩家赢  电脑赢    棋盘无空位(双方平局)  继续下棋(返回第6步)

一、代码构成

游戏模块图

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

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

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

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

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

 

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

 建立game.h头文件

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

 

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

 新建完文件

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

二、游戏代码和讲解

 程序步骤

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

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

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

}

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

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

2.用switch语句来实现选择

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);

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

输入1  进入游戏

输入0  退出游戏

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

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

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

#define ROW 3
#define	COL 3

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

char board[ROW][COL] = { 0 };
#include"game1.h"

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

4.初始化棋盘

头文件game.h  声明

void NewRoard(char board[ROW][COL], int row, int col);

在test.c 调用 NewRoard 函数

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

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

void NewRoard(char board[ROW][COL], int row, int col)
{
	int i = 0;
	for (i = 0; i < row; i++)
	{
		int j = 0;
		for (j = 0; j < col; j++)
		{
			board[i][j] = ' ';
		}
	}
}

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

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

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

void PriRoard(char board[ROW][COL], int row, int col);
PriRoard(board, ROW, COL);
void PriRoard(char board[ROW][COL], int row, int col)
{
	int i = 0;
	for (i = 0; i < row; i++)
	{
		int j = 0;
		for (j = 0; j < col; j++)
		{
			printf(" %c ", board[i][j]);
			if(j<col-1)
			printf("|");
		}
		printf("\n");
		if (i < row - 1)
		{
			int j = 0;
			for (j = 0; j < row; j++)
			{
				printf("---");
				if(j<row-1)
				printf("|");
			}
			
		}
		printf("\n");

	}
}

6.玩家下棋

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

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

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

void PlayRoard(char board[ROW][COL], int row, int col);
PlayRoard(board, ROW, COL);
void PlayRoard(char board[ROW][COL], int row, int col)
{
	

		int x = 0;
		int y = 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<stdlib.h>      #include<time.h>

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

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

void CompRoard(char board[ROW][COL], int row, int col);
CompRoard(board, ROW, COL);
void CompRoard(char board[ROW][COL], int row, int col)
{
	int x = 0;
	int y = 0;
	printf("电脑下棋\n");
	while (1)
	{
		int x = rand() % row;
		int y = rand() % col;
		
			if (board[x][y] == ' ')
			{
				board[x][y] = '#';
				break;
			}
	}
}

8.判断游戏状态函数

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

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

" # "

" Q "

" C "

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

IsWin(board, ROW, COL);
int IsFull(char board[ROW][COL], int row, int col)
{
	int i = 0;
	for (i = 0; i < row; i++)
	{
		int j = 0;
		for (j=0;j<col;j++)
		{
			if (board[i][j] == ' ')
				return 0;
		}
	}
	return 1;
}
char  IsWin(char board[ROW][COL], int row, int col)
{
	int i = 0;
	for (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];
	    }
		
	}
	for (i = 0; i < col; i++)
	{
		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[1][1] != ' ')
	{
		return board[0][0];
	}
	if (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[1][1] != ' ')
	{
		return board[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>
void NewRoard(char board[ROW][COL], int row, int col);
void PriRoard(char board[ROW][COL], int row, int col);
void PlayRoard(char board[ROW][COL], int row, int col);
void CompRoard(char board[ROW][COL], int row, int col);
char IsWin(char board[ROW][COL], int row, int col);

game.c

#define _CRT_SECURE_NO_WARNINGS 1
#include"game1.h"
void NewRoard(char board[ROW][COL], int row, int col)
{
	int i = 0;
	for (i = 0; i < row; i++)
	{
		int j = 0;
		for (j = 0; j < col; j++)
		{
			board[i][j] = ' ';
		}
	}
}
void PriRoard(char board[ROW][COL], int row, int col)
{
	int i = 0;
	for (i = 0; i < row; i++)
	{
		int j = 0;
		for (j = 0; j < col; j++)
		{
			printf(" %c ", board[i][j]);
			if(j<col-1)
			printf("|");
		}
		printf("\n");
		if (i < row - 1)
		{
			int j = 0;
			for (j = 0; j < row; j++)
			{
				printf("---");
				if(j<row-1)
				printf("|");
			}
			
		}
		printf("\n");

	}
}
void PlayRoard(char board[ROW][COL], int row, int col)
{
	

		int x = 0;
		int y = 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");
			}
		}
}




void CompRoard(char board[ROW][COL], int row, int col)
{
	int x = 0;
	int y = 0;
	printf("电脑下棋\n");
	while (1)
	{
		int x = rand() % row;
		int y = rand() % col;
		
			if (board[x][y] == ' ')
			{
				board[x][y] = '#';
				break;
			}
	}
}
int IsFull(char board[ROW][COL], int row, int col)
{
	int i = 0;
	for (i = 0; i < row; i++)
	{
		int j = 0;
		for (j=0;j<col;j++)
		{
			if (board[i][j] == ' ')
				return 0;
		}
	}
	return 1;
}
char  IsWin(char board[ROW][COL], int row, int col)
{
	int i = 0;
	for (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];
	    }
		
	}
	for (i = 0; i < col; i++)
	{
		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[1][1] != ' ')
	{
		return board[0][0];
	}
	if (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[1][1] != ' ')
	{
		return board[1][1];
	}
	if (IsFull(board,row,col))
	{
		return 'Q';
	}
	return 'C';
}

test.c

#define _CRT_SECURE_NO_WARNINGS 1
#include"game1.h"

void game()
{
	printf("游戏开始\n");
	//存放数组
    char board[ROW][COL] = { 0 };
	//棋盘初始化
	NewRoard(board, ROW, COL);
	//打印棋盘
    PriRoard(board, ROW, COL);
	char ret = 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");
	else if (ret == '#')
		printf("电脑赢\n");
	else if (ret == 'Q')
		printf("平局\n");
}
void menu()
{
	printf("***********************\n");
	printf("******1. 开始游戏******\n");
	printf("******0. 退出游戏******\n");
	printf("***********************\n");
	

}
int main()
{
	int input = 0;
	srand((unsigned int)time(NULL));
	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;
}
网友评论