小游戏 --- 三子棋

1. 创建棋盘

首先在游戏主程序 game( ) 中创建棋盘并初始化:

char chessBoard[ROW][COL] = { 0 };

初始化棋盘:

void init(char str[ROW][COL])
{
//这里用库函数更方便
	//for (int i = 0; i < ROW; i++)
	//{
	//	for (int j = 0; j < COL; j++)
	//	{
	//		str[i][j] = ' ';
	//	}
	//}
	memset(str,' ',ROW*COL);
}

2. 打印棋盘

打印棋盘:

void print(char str[ROW][COL])
{
	printf("+---+---+---+\n");
	for (int i = 0; i < ROW; i++) 
	{
	
		printf("| %c | %c | %c |\n", str[i][0],
		str[i][1], str[i][2]);
		
	printf("+---+---+---+\n");
	}
}

3. 玩家走棋

玩家先下子:

void playerMove(char str[ROW][COL])
{
	//玩家输入下子位置
	while (1)
	{
		printf("请下子(范围为0~2):\n");
		int row, col;
		scanf("%d %d", &row, &col);
		//如果输入坐标超出范围,则提示并重新进入循环
		if (row<0 || row>ROW - 1 || col<0 || col>COL - 1)
		{
			printf("超出棋盘范围,请重新输入合适位置:\n");
			continue;
		}
		//如果输入坐标处已有子,则提示并重新进入循环
		if (str[row][col] != ' ')
		{
			printf("该位置已有棋子,请重新输入:\n");
			continue;
		}
		str[row][col] = 'x';
		break;
	}
}

5. 电脑走棋

电脑下子:

void RobotMove(char str[ROW][COL])
{
	while (1)
	{
		int row, col;
		//行列取不大于3的随机值
		row = rand() % ROW;
		col = rand() % COL;
		//如果坐标处已有子,则重新进入循环
		if (str[row][col] != ' ')
		{
			continue;
		}
		str[row][col] = 'o';
		break;
	}
}

6. 判定胜负

判断胜负关系:

char isWin(char str[ROW][COL])
{
	//判断一行元素是否相等,若相等则返回它们的共同值
	for (int i = 0; i < ROW; i++)
	{
		if (str[i][0] != ' '&&str[i][0] == str[i][1] && str[i][0] == str[i][2])
		{
			return str[i][0];
		}
	}
	//判断一列元素是否相等,若相等则返回它们的共同值
	for (int j = 0; j < ROW; j++)
	{
		if (str[0][j] == str[1][j] && str[0][j] == str[2][j])
		{
			return str[0][j];
		}
	}
	//判断两个对角线上的元素是否相等,若相等则返回它们的共同值
	if (str[0][0] != ' '&&str[0][0] == str[1][1] && str[0][0] == str[2][2])
	{
		return str[0][0];
	}
	if (str[0][2] != ' '&&str[0][2] == str[0][1] && str[0][2] == str[2][0])
	{
		return str[0][2];
	}
	//判断棋盘是否还有空位,如果有,返回空格,游戏继续;如果没有,返回一个任意字母,游戏以和局结束
	int flag = isFull(str);
	if (flag == 1)
		return 'l';
	else if (flag == 0)
		return ' ';
}

判断棋盘是否还有空位:

//若还有空位返回一个0
int isFull(char str[ROW][COL])
{
	for (int i = 0; i < ROW; i++)
	{
		for (int j = 0; j < COL; j++)
		{
			if (str[i][j] == ' ')
				return 0;
		}
	}
	return 1;
}

游戏演示

在这里插入图片描述
在这里插入图片描述

程序文件:

main.c

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define ROW 3
#define COL 3
// 游戏流程
// 1. 创建棋盘并初始化
// 2. 打印棋盘
// 3. 玩家落子
// 4. 判定胜负
// 5. 电脑落子
// 6. 判定胜负
// continue 2 
void game()
{
	char chessBoard[ROW][COL] = { 0 };//创建棋盘
	init(chessBoard);//初始化棋盘
	//判断胜负关系标志位
	char flag = ' ';
	while (1)
	{
		//打印棋盘
		print(chessBoard);
		//玩家落子
		playerMove(chessBoard);
		//判断胜负
		flag = isWin(chessBoard);
		if (flag != ' ')
			break;
		//人机落子
		RobotMove(chessBoard);
		//判断胜负
		if (flag != ' ')
			break;
	}
	if (flag == 'x')
		printf("恭喜你获得了胜利!\n");
	else if (flag == 'o')
		printf("很遗憾,你输了。\n");
	else
		printf("和局!\n");
}

int main()
{
	//随机数种子
	srand(time(0));
	while (1)
	{
		int choice = menu();
		if (choice == 1)
			game();
		else if (choice == 2)
		{
			printf("再见不送\n");
			break;
		}
		else
		{
			printf("请输入正确选项!\n");
			continue;
		}
	}
	return 0;
	system("pause");
}	{
			printf("再见不送\n");
			break;
		}
		else
		{
			printf("请输入正确选项!\n");
			continue;
		}
	}
	return 0;
	system("pause");
}

game.c

#define _CRT_SECURE_NO_WARNINGS
include"game.h"
#define ROW 3
#define COL 3
int menu()
{
	printf("**********************************\n");
	printf("*****  欢迎来到三子棋小游戏  *****\n");
	printf("*****       1.开始游戏       *****\n");
	printf("*****       2.退出游戏       *****\n");
	printf("**********************************\n");
	printf("请选择:");
	int x = 0;
	scanf("%d", &x);
	return x;
}
//初始化棋盘
void init(char str[ROW][COL])
{
	//for (int i = 0; i < ROW; i++)
	//{
	//	for (int j = 0; j < COL; j++)
	//	{
	//		str[i][j] = ' ';
	//	}
	//}
	memset(str, ' ', ROW*COL);
}
//打印棋盘
void print(char str[ROW][COL])
{
	printf("+---+---+---+\n");
	for (int i = 0; i < ROW; i++) {
		printf("| %c | %c | %c |\n", str[i][0],
			str[i][1], str[i][2]);
		printf("+---+---+---+\n");
	}
}
//玩家落子
void playerMove(char str[ROW][COL])
{
	//玩家输入下子位置
	while (1)
	{
		printf("请下子(范围为0~2):\n");
		int row, col;
		scanf("%d %d", &row, &col);
		//如果输入坐标超出范围,则提示并重新进入循环
		if (row<0 || row>ROW - 1 || col<0 || col>COL - 1)
		{
			printf("超出棋盘范围,请重新输入合适位置:\n");
			continue;
		}
		//如果输入坐标处已有子,则提示并重新进入循环
		if (str[row][col] != ' ')
		{
			printf("该位置已有棋子,请重新输入:\n");
			continue;
		}
		str[row][col] = 'x';
		break;
	}
}
//人机落子
void RobotMove(char str[ROW][COL])
{
	while (1)
	{
		int row, col;
		//行列取不大于3的随机值
		row = rand() % ROW;
		col = rand() % COL;
		//如果坐标处已有子,则重新进入循环
		if (str[row][col] != ' ')
		{
			continue;
		}
		str[row][col] = 'o';
		break;
	}
}
//判断胜负
char isWin(char str[ROW][COL])
{
	//判断一行元素是否相等,若相等则返回它们的共同值
	for (int i = 0; i < ROW; i++)
	{
		if (str[i][0] != ' '&&str[i][0] == str[i][1] && str[i][0] == str[i][2])
		{
			return str[i][0];
		}
	}
	//判断一列元素是否相等,若相等则返回它们的共同值
	for (int j = 0; j < ROW; j++)
	{
		if (str[0][j] == str[1][j] && str[0][j] == str[2][j])
		{
			return str[0][j];
		}
	}
	//判断两个对角线上的元素是否相等,若相等则返回它们的共同值
	if (str[0][0] != ' '&&str[0][0] == str[1][1] && str[0][0] == str[2][2])
	{
		return str[0][0];
	}
	if (str[0][2] != ' '&&str[0][2] == str[0][1] && str[0][2] == str[2][0])
	{
		return str[0][2];
	}
	//判断棋盘是否还有空位,如果有,返回空格,游戏继续;如果没有,返回一个任意字母,游戏以和局结束
	int flag = isFull(str);
	if (flag == 1)
		return 'l';
	else if (flag == 0)
		return ' ';
}
//判断棋盘是否还有空位
int isFull(char str[ROW][COL])
{
	for (int i = 0; i < ROW; i++)
	{
		for (int j = 0; j < COL; j++)
		{
			if (str[i][j] == ' ')
				return 0;
		}
	}
	return 1;
}

game.h

#pragma once
#include<stdio.h>
#include<string.h>
#define ROW 3
#define COL 3
int menu();
void init(char str[ROW][COL]);
void print(char str[ROW][COL]);
void playerMove(char str[ROW][COL]);
void RobotMove(char str[ROW][COL]);
char isWin(char str[ROW][COL]);
int isFull(char str[ROW][COL]);
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值