C语言小项目之三子棋游戏(简易版)

哈哈哈!!!

       今天给大家带来一篇三子棋小游戏(简易版)的代码,xdm请跟随我的节奏一起来起舞吧!!!说是简易版是因为没有实现电脑智能化,这样让我们尽情的去向电脑复仇吧!!!

一、知识储备

        二维数组

        分支循环熟练运用

        函数熟练操作

        逻辑思维分析

二、需求分析

        三子棋,简而言之,三子成线,给出一个9宫格,玩家和电脑轮流下棋,看哪一方先三子成线则胜利,项目相对来说对初学者有点困难。

        1、二维数组初始化

        2、棋盘打印

        3、玩家下棋

        4、电脑下棋

        5、判断输赢

        6、游戏逻辑函数设计

        7、主函数设计

三、代码呈现

此项目采用模块化设计

        分game.h  game.cpp  test.cpp三个模块

        1、头文件设计

             为了方便改动和使其有好的扩展性采用宏定义来设置行和列数

#pragma once

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#define ROW 3//行数
#define COL 3//列数

//菜单
void menu();

//初始化
void init_board(char board[ROW][COL], int row, int col);

//打印
void display_board(char board[ROW][COL], int row, int col);

//玩家下棋
void player_move(char board[ROW][COL], int row, int col);

//电脑下棋
void computer_move(char board[ROW][COL], int row, int col);

//判断胜负
char judge_result(char board[ROW][COL], int row, int col);

        2.函数设计

          (1)、菜单函数

//菜单函数
void menu()
{
	printf("*********************\n");
	printf("****** 1、play ******\n");
	printf("****** 0、exit ******\n");
	printf("*********************\n");
}

        (2)、棋盘初始化

//初始化棋盘
void init_board(char board[ROW][COL], int row, int col)
{
	for (int i = 0; i < row; i++)
	{
		for (int j = 0; j < col; j++)
		{
			board[i][j] = ' ';//初始全置为 空格
		}
	}
}

        (3)、棋盘打印

//打印棋盘
void display_board(char board[ROW][COL], int row, int col)
{
	for (int i = 0; i < row; i++)//控制行数
	{
		for (int j = 0; j < col; j++)//控制每一列
		{
			printf(" %c ", board[i][j]);
			if (j < col-1)
			{
				printf("|");
			}
		}
		printf("\n");//打完一行加换行符
		for (int j = 0; j < col; j++)//控制每一列
		{
			if (i < row-1)
			{
				printf("---");
				if (j < col - 1)
				{
					printf("+");
				}
			}
		}
		printf("\n");//打完一行加换行符
	}
}

        (4)、玩家下棋

void player_move(char board[ROW][COL], int row, int col)
{
	int x = 0;//代表行
	int y = 0;//代表列
	printf("玩家下棋:");
	while (1)
	{
		scanf("%d %d", &x, &y);
		if (x < row && y < col && x>0 && y>0 && board[x-1][y-1] == ' ')
		{
			board[x - 1][y - 1] = '*';//由于数组下标是从0开始的,人们正常思维是从1开始的
			break;//输入符合条件则记录下来后跳出,若不符合条件则继续重新输入
		}
		else
		{
			printf("输入有误,请重新输入:");
		}
	}
}

        (5)电脑下棋

//电脑下棋
void computer_move(char board[ROW][COL], int row, int col)
{
	int x = 0;//电脑仅仅随机出一个坐标位置,没有智能化
	int y = 0;
	do {
		x = rand() % row;//电脑随机出x行
		y = rand() % col;//电脑随机出y列
	} while (board[x][y] != ' ');
	board[x][y] = '#';
	printf("电脑下棋:%d %d \n", x+1, y+1);
}

        (6)、判断棋盘是否满

//判断是否棋盘满
int is_full(char board[ROW][COL], int row, int col)
{
	for (int i = 0; i < row; i++)
	{
		for (int j = 0; j < col; j++)
		{
			if (board[i][j] == ' ')
			{
				return 0;//如果有一个位置为空则返回0,代表棋盘没满
			}
		}
	}
	return 1;//如果每一个位置都不为空则棋盘满返回1,如果棋盘没有满则在上面已经返回不会来到这
}

        (7)、判断胜负

                此部分设计巧妙在于由于玩家下棋下的是 * ,电脑下棋下的是 # ,若一方胜利直接返回他们所下的棋代表,然后判断是否棋盘满即平局的判断,若平局返回‘P',若都不是则返回‘C’

//判断输赢
char judge_result(char board[ROW][COL], int row, int col)
{
	for (int 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 (int j = 0; j < row; j++)//判断每一列三个是否一样
	{
		if (board[0][j] == board[1][j] && board[1][j] == board[2][j] && board[1][j] != ' ')
		{
			return board[0][j];
		}
	}
	if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[0][0] != ' ')//判断对角线
	{
		return board[0][0];
	}
	if (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[0][2] != ' ')//判断对角线
	{
		return board[0][2];
	}
	if (is_full(board, ROW, COL))
	{
		return 'P';
	}
	else
		return 'C';

}

        (8)、游戏逻辑设计

//游戏函数
void game()
{
	char board[ROW][COL];
	char result = 0;
	printf("游戏开始\n");
	init_board(board, ROW, COL);
	while (1)
	{
		player_move(board, ROW, COL);
		display_board(board, ROW, COL);
		result = judge_result(board, ROW, COL);
		if (result != 'C')
		{
			break;
		}

		computer_move(board, ROW, COL);
		display_board(board, ROW, COL);
		result = judge_result(board, ROW, COL);
		if (result != 'C')
		{
			break;
		}
	}
	if (result == '*')
	{
		printf("玩家获胜!\n");
	}
	else if (result == '#')
	{
		printf("电脑获胜!\n");
	}
	else
	{
		printf("平局!\n");
	}
}

        (9)、主函数设计

//主函数
int main()
{
	int input = 1;
	do
	{
		menu();
		srand((unsigned int)time(NULL));
		printf("请输入:");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			game();
			break;

		case 0:
			printf("退出游戏!!!\n");
			break;

		default:
			printf("输入错误,请重新输入");
			break;

		}
	} while (input);

	return 0;
}

        本文写到这里就结束了,若是有兴趣的话您可以自行修改,自行增添内容使项目丰富多彩。

若本文是对您有所帮助的话,希望你可以点赞下,你的支持是我创作最大的动力!!!

                谢谢!!!

注:作者水平有限,若有错误,欢迎指正!

  • 17
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 11
    评论
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值