史上最简单三子棋游戏

史上最简单三子棋游戏,至今未发现更容易的三子棋*

和傻子电脑玩三子棋游戏玩法介绍:首先,电脑会先在棋盘上放置一个X,然后玩家开始走,在没有X的放置O,
在九个精美的格子上(假的,丑爆了,手动精美)展开激烈的厮杀(假的,一点都不好玩),最后有三个相同的棋子,无论是横竖撇捺的直线上连成一线。棋子的所有者获胜,如果在九个格子都被占用后未出现一方获胜,即为平局。

实现原理:建立一个3*3二维数组,为了让游戏玩一把之后还能继续玩,使用do-while循环控制,输入坐标控制子落在何处,电脑的子用随机坐标控制,在九个位置上如果有一方落子,另一方就不能落在此处,所以要判断输入坐标的位置是否是空的。用遍历的方法初始化数组,先放入九个空格,落子就将棋子放入数组中。玩家落子时输入的坐标需要先判断是否合法,再判断坐标是否被占用。判断输赢时,需要将可能的情况的坐标全部列举出来判断。

实现功能的函数:

初始化棋盘时遍历数组全部赋为’ '(空格),定义两个全局变量ROW,COL,方便改变棋盘的大小。

//初始化棋盘
void InitBoard(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] = ' ';
		}
	}
}

打印一个贼丑的棋盘:

//打印棋盘
void DisplayBoard(char board[ROW][COL], int row, int col)
{
	int i = 0;
	int j = 0;

	for (i = 0; i < row; i++)
	{
		for (j = 0; j<row; j++)
		{
			printf("%c ",board[i][j]);
			if (j != 2)
			{
				printf("|");
			}
		}
		printf("\n");
		if (i != 2)
		{
			for (j = 0; j <= col; j++)
			{

				if (j <= col)
					printf("--");

			}
		}
		printf("\n");
	}
}

电脑走的方法:
电脑用随机数生成坐标,rand() % 3表示生成0~2之间的随机数,while循环的作用:在判断出坐标被占用时能够循环继续随机生成可使用的坐标,而不是被占用后停止在这里。

void ComputerMove(char board[ROW][COL], int row, int col)
{
	while (1)
	{
		int x = rand() % 3;
		int y = rand() % 3;
		if (' ' == board[x][y])
		{
			board[x][y] = 'X';
			break;
		}
	}
}

玩家走的方法:
玩家从键盘上输入坐标,总有人不按规矩来想挑战一下,所以第一步判断应该判断玩家输入的坐标是否合法,如果输入的坐标合法,则进行第二步判断输入坐标是否被占用,如果被占用,则进行while循环,直到输入的坐标合法且未被占用。

//玩家走
void PlayerMove(char board[ROW][COL], int row, int col)
{
	int x = 0;
	int y = 0;
	while (1)
	{
		printf("请输入坐标:");
		scanf("%d%d", &x, &y);
		if (x>0 && x <= row && y>0 && y <= col)
		{
			if (' ' == board[x - 1][y - 1])
			{
				board[x - 1][y - 1] = '0';
				break;
			}
			else
				printf("坐标已被占用,请重新输入\n");
		}
		else
			printf("输入不合法,请重新输入\n");
	}
}

判断棋盘是否已满的方法:
遍历整个数组,如果一遇到空格就返回0,说明还没有满,如果遍历完整个数组,没有空格就返回1,说明棋盘已满。

//判断棋盘是否已满
int IsFull(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++)
		{
			if (board[i][j] == ' ')
				return 0;
		}
	}
	return 1;
}

判断输赢的方法:
在棋盘满的时候,返回了1,用i接收它,返回~,到主函数中判断,board[i][0]、board[i][1]、board[i][2]用for循环判断行中是否满足条件,如满足条件则返回board[i][0]中包含的字符。board[0][i]、board[1][i]、board[2][i]用for循环判断列中是否满足条件,如满足条件则返回board[0][i]。再判断board[0][0]、board[1][1]、board[2][2]中的字符是否相同,如果相同则返回board[0][0]中的字符,最后判断board[0][2]、board[1][1]、board[2][0],如果相同则返回board[0][2]中的字符。

//判断输赢
char IsWin(char board[ROW][COL], int row, int col)
{
	int i = 0;
	if (i = IsFull(board, row, col) == 1)
	{
		return '~';
	}

	for (i = 0; i<row; i++)
	{
		if ((board[i][0] == board[i][1]) && (board[i][1] == board[i][2]))
		{
			return board[i][0];
		}
	}

	for (i = 0; i<col; i++)
	{
		if ((board[0][i] == board[1][i]) && (board[1][i] == board[2][i]))
		{
			return board[1][i];
		}
	}

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

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

主函数:
根据IsWin的返回值不同,确定胜利方,IsWin为~,输出平局;O玩家胜利;X电脑胜利

void game()
{
	char board[ROW][COL] = { 0 };
	char ret = '0';

	InitBoard(board, ROW, COL);
	DisplayBoard(board, ROW, COL);

	do
	{
		printf("电脑走:\n");
		ComputerMove(board, ROW, COL);
		DisplayBoard(board, ROW, COL);

		if (IsWin(board, ROW, COL) != ' ')
		{
			break;
		}

		printf("玩家走:\n");
		PlayerMove(board, ROW, COL);
		DisplayBoard(board, ROW, COL);

		ret = IsWin(board, ROW, COL);

	} while (ret == ' ');
	if (IsWin(board, ROW, COL) == '~')
	{
		printf("平局!\n");
	}
	else if (IsWin(board, ROW, COL) == '0')
	{
		printf("恭喜你! 玩家胜利!\n");
	}
	else if (IsWin(board, ROW, COL) == 'X')
	{
		printf("很遗憾! 电脑胜利!\n");
	}

}

代码如下:
game.h

//game.h
#ifndef __GAME_H__
#define __GAME_H__

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

#define ROW 3
#define COL 3

void game();
void InitBoard(char board[ROW][COL], int row, int col);
void DisplayBoard(char board[ROW][COL], int row, int col);
void PlayerMove(char board[ROW][COL], int row, int col);
void ComputerMove(char board[ROW][COL], int row, int col);
int IsFull(char board[ROW][COL], int row, int col);
char IsWin(char aboard[ROW][COL], int row, int col);

#endif

test.c

//test.c
#define _CRT_SECURE_NO_WARNINGS 1

#include "game.h"

void menu()
{
	printf("************************\n");
	printf("******   1.play   ******\n");
	printf("******   0.exit   ******\n");
	printf("************************\n");
}

int main()
{
	int input = 0;
	srand((unsigned int)time(NULL));//确保每次生成随机数
	do
	{
		menu();
		printf("请选择:");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			game();
			break;
		case 0:
			printf("退出游戏!");
			break;
		default:
			printf("选择错误,请重新输入\n");
			break;
		}

	} while (input);
	return 0;
}

game.c

//game.c
#define _CRT_SECURE_NO_WARNINGS 1


#include "game.h"

//打印棋盘
void DisplayBoard(char board[ROW][COL], int row, int col)
{
	int i = 0;
	int j = 0;

	for (i = 0; i < row; i++)
	{
		for (j = 0; j<row; j++)
		{
			printf("%c ",board[i][j]);
			if (j != 2)
			{
				printf("|");
			}
		}
		printf("\n");
		if (i != 2)
		{
			for (j = 0; j <= col; j++)
			{

				if (j <= col)
					printf("--");

			}
		}
		printf("\n");
	}
}

//初始化棋盘
void InitBoard(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] = ' ';
		}
	}
}

//玩家走
void PlayerMove(char board[ROW][COL], int row, int col)
{
	int x = 0;
	int y = 0;
	while (1)
	{
		printf("请输入坐标:");
		scanf("%d%d", &x, &y);
		if (x>0 && x <= row && y>0 && y <= col)
		{
			if (' ' == board[x - 1][y - 1])
			{
				board[x - 1][y - 1] = '0';
				break;
			}
			else
				printf("坐标已被占用,请重新输入\n");
		}
		else
			printf("输入不合法,请重新输入\n");
	}
}

//电脑走
void ComputerMove(char board[ROW][COL], int row, int col)
{
	while (1)
	{
		int x = rand() % 3;
		int y = rand() % 3;
		if (' ' == board[x][y])
		{
			board[x][y] = 'X';
			break;
		}
	}
}

//判断棋盘是否已满
int IsFull(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++)
		{
			if (board[i][j] == ' ')
				return 0;
		}
	}
	return 1;
}

//判断输赢
char IsWin(char board[ROW][COL], int row, int col)
{
	int i = 0;
	if (i = IsFull(board, row, col) == 1)
	{
		return '~';
	}

	for (i = 0; i<row; i++)
	{
		if ((board[i][0] == board[i][1]) && (board[i][1] == board[i][2]))
		{
			return board[i][0];
		}
	}

	for (i = 0; i<col; i++)
	{
		if ((board[0][i] == board[1][i]) && (board[1][i] == board[2][i]))
		{
			return board[1][i];
		}
	}

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

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

void game()
{
	char board[ROW][COL] = { 0 };
	char ret = '0';

	InitBoard(board, ROW, COL);
	DisplayBoard(board, ROW, COL);

	do
	{
		printf("电脑走:\n");
		ComputerMove(board, ROW, COL);
		DisplayBoard(board, ROW, COL);

		if (IsWin(board, ROW, COL) != ' ')
		{
			break;
		}

		printf("玩家走:\n");
		PlayerMove(board, ROW, COL);
		DisplayBoard(board, ROW, COL);

		ret = IsWin(board, ROW, COL);

	} while (ret == ' ');
	if (IsWin(board, ROW, COL) == '~')
	{
		printf("平局!\n");
	}
	else if (IsWin(board, ROW, COL) == '0')
	{
		printf("恭喜你! 玩家胜利!\n");
	}
	else if (IsWin(board, ROW, COL) == 'X')
	{
		printf("很遗憾! 电脑胜利!\n");
	}

}

运行结果:
在这里插入图片描述
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/Thinker_serious/article/details/83047886