二维数组实战项目--------《三子棋》

目录

一.开发思路以及游戏框架设计

二. 开发及代码优化细节

                     三.总结


今天给大家分享一个小游戏,就会我们通常玩的五子棋(正文中的代码块为示范代码,游戏源码小编放在文章末尾!!!


一.开发思路以及游戏框架设计:

1.游戏的菜单打印

2.游戏棋盘的打印

3.开始游戏

4.判断输赢

二. 开发及代码优化细节

1)打印菜单

VS上创建好项目后,我们需要添加2个源文件和1个头文件

test.c-------------------------用于测试三子棋游戏

game.c----------------------用于游戏函数的实现

game.h----------------------用于游戏函数的声明

#define _CRT_SECURE_NO_WARNINGS 1
#include 
void  menu(){
	printf("------------------------\n");
	printf("------------------------\n");
	printf("---------1.paly---------\n");
	printf("---------0.exit---------\n");
	printf("------------------------\n");
	printf("------------------------\n");
}

void game() {


}
int main() {
	int input = 0;
	do 
	{
		menu();
		printf("请选择:");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			game();
			break;
		case 0:
			printf("退出游戏:\n");
			break;
		default:
			printf("选择错误,重新选择:\n");
			break;
		}
	} while (input);
	return 0;
}

注:此代码适用于简单的小游戏开发(菜单打印),每个游戏的实现逻辑都不一样,上面代码的game函数用于游戏实现逻辑的封装,代码实现如下:

二维数组实战项目--------《三子棋》_第1张图片



2)游戏棋盘的打印及代码优化 

为了帮助大家理解,这是运行以后的界面,由.exe文件执行结果界面可知,棋盘的实现是一个3x3的网格状,落子的位置由坐标去实现,玩家下棋用( * )代替,电脑下棋用(#)代替,所以我们需要创建一个字符型二维数组来存放玩家和电脑输入的字符,接下来就是棋盘打印的实现了:

二维数组实战项目--------《三子棋》_第2张图片

为了使代码的效率更高,我们选择用宏定义来控制数组的行和列:
#define COL 3

#define ROW 3

棋盘打印代码如下

void game() {
	char board[ROW][COL] = { 0 }; 
//数组初始化为0
	display_board(board, ROW, COL);
//创建打印棋盘的函数,分别用数组名,行数,列数作为三个参数去调用
}
void display_board(char board[ROW][COL], int row, int col) {
	int i = 0;
	for (i = 0; i < row; i++) {
		//存放数据
		printf(" %c | %c | %c \n", board[i][0], board[i][1], board[i][2]);
		//打印---|---|---
		if(i

 运行:

二维数组实战项目--------《三子棋》_第3张图片

Tips:打印的棋盘与预期不太符合,原因是我们给数组初始化的时候设置为0,所以我们需要给此代码进行优化



优化:写一个初始化函数,确保二维数组里存放的是空格字符,代码如下:

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

 二维数组实战项目--------《三子棋》_第4张图片

 二次优化代码(动态控制棋盘):

void display_board(char board[ROW][COL], int row, int col) {
	int i = 0;
	for (i = 0; i < row; i++) {
		//存放数据
		//printf(" %c | %c | %c \n", board[i][0], board[i][1], board[i][2]);
		//打印---|---|---
		int j = 0;
		for (j = 0; j < col; j++) {
			printf(" %c ", board[i][j]);
			if (j < col - 1)
				printf("|");
		}
		printf("\n");
		if(i

 到这里,棋盘的打印准备工作就已经完成了



 3)开始游戏,玩家下棋和电脑下棋

 玩家和电脑通过棋盘的坐标来实现对战,这里注意两个点:

  • 坐标的合法性
  • 坐标是否被占用

玩家下棋代码如下:

void palyer_move(char board[ROW][COL], int row, int col) {
	int x = 0;
	int y = 0;

	printf("玩家下棋:\n");

	printf("请输入要下棋的坐标:");
	scanf("%d %d", &x, &y);
	//坐标的合法性
	//坐标是否被占用
	while(1){
		if (x >= 1 && x <= row && y >= 1 && y <= col) {
			if (board[x - 1][y - 1] == ' ') {
				board[x - 1][y - 1] = '*';
				break;
			}
			else {
				printf("该坐标被占用,请重新输入:\n");
			}
		}
			else {
				printf("坐标非法,重新输入:\n");
			}
		}
	}

接下来就是电脑下棋,电脑下棋和玩家不一样,玩家可以控制棋子的位置,而电脑不行,所以这里我们需要一个引用一个函数来控制电脑落棋的随机性,这里我们要使用一个库函数,srand函数,用时间戳作为返回值来确保电脑下棋的随机性,关于srand函数大家可以去网上找找资料https://cplusplus.com/reference/cstdlib/srand/?kw=srand,有了这样一个函数,我们就能很好的控制电脑下棋的随机性了,当然,在使用过程中,不要忘记加头文件------>

电脑下棋代码如下:

computer_move(char board[ROW][COL], int row, int col) {
	printf("电脑下棋:\n");
	while(1)
	{
		int x = rand() % row;  //取模运算防止数组越界,生成0~row-1的数字
		int y = rand() % col;
		if (board[x][y] == ' ') {
			board[x][y] = '#';
			break;
		}
	}
}

 到这里,玩家和电脑下棋就搞定了!!!



4)判断输赢

判断输赢可以分成4种情况:

  • 玩家赢  ----------------------用*表示
  • 电脑赢  ----------------------用#表示
  • 平局     -----------------------用C表示
  • 游戏继续 --------------------用Q表示

 game.c下代码块如下:

//判断棋盘是否已经占满
static int is_full(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 is_win(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[1][1];
	}

	if (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[1][1] != ' ')
	{
		return board[1][1];
	}

	//判断平局
	if (is_full(board, row, col) == 1)
	{
		return 'Q';
	}

	//继续
	return 'C';
}

到这里游戏就可以正常的运行起来了


二维数组实战项目--------《三子棋》_第5张图片



三.总结

此文章适合有一定C代码基础的童鞋们,小编在学习的时候也是研究了好久才弄明白了,所以第一次看希望大家耐性看完,这里有个视频供大家一起学习,方便理解,觉得有帮助还请老铁们三连!!蟹蟹!!!https://www.bilibili.com/video/BV1q54y1q79w?p=15

源码:https://gitee.com/xu-fan-fan/c-language-code/tree/master/sanziqi_game_7.30/sanziqi_game_7.30

你可能感兴趣的:(c语言,c++,开发语言)