简单三子棋游戏

简单思路及实现步骤:
1、对于一个游戏来说,首先向用户显示的应该是游戏菜单,我们可以用一个函数ShowMenu来实现。该游戏菜单有两个选项,玩或者退出,我们直接让用户从键盘上输入选择,选择为1时,进入游戏,选择为2时,退出该游戏。作为开发者,我们当然希望用户多玩几次,所以使用了死循环。
2、如果选择玩游戏,我们用Game函数实现它的玩法。既然是玩游戏,就该有一定的顺序,我们调用函数PlayerMove为实现人的玩法,用ComputerMove实现电脑的玩法,我们遵循顾客至上的原则,所以先选择人走。
3、进入游戏后,我们应该将棋盘展现给用户,无论是人走还是电脑走,走前还是走后,我们都应该更新最新的棋盘,用函数ShowBoard,以使比赛顺利进行。
4、关于下棋的过程,对于用户来说,键盘输入即可,而对于及其而言,我们让他随机生成一个数填写进去,即实现了输入过程。
5、判断结果,如果棋盘被铺满,且用户和电脑都没赢,则为平局;如果棋盘有空余,要么是用户赢了,要么是电脑赢了

主函数

#include"chess.h"
int main()
{
	int select = 0;
	int quit = 0;
	while (!quit) 
	{
		ShowMenu();//显示菜单,让用户进行选择
		scanf("%d", &select);
		switch (select)
		{
		case 1:
			Game();//select=1,调用Game函数,实现游戏的玩法
			break;
		case 2:
			printf("byebye!\n");
			quit = 1;//quit=1,跳出该循环
			break;
		default:
			printf("select error,try again!\n");
			break;
		}
	}
	system("pause");
	return 0;
}

头文件

#ifndef _CHESS_H_
#define _CHESS_H_
#include<stdio.h>
#include<windows.h>
#include<string.h>
#include<time.h>
#define ROW 3
#define COL 3
#define PLAYER_COLOR 'X'//人走的棋用X表示
#define COMPUTER_COLOR 'O'//电脑走用O表示
#pragma warning(disable:4996)
void Game();
void InitBoard(char board[][COL], int row, int col);//初始化数组
void ShowBoard(char board[][COL], int row, int col);//显示键盘
void PlayerMove(char board[][COL], int row, int col);//用户走
char Judge(char board[][COL], int row, int col);//判断游戏是否终止
void ComputerMove(char board[][COL], int row, int col);//电脑走
#endif

分别实现每个函数的功能
ShowMenu()函数打印菜单

void ShowMenu()
{
	printf("###############################\n");
	printf("########### 1.Play ############\n");
	printf("########### 2.Exit ############\n");
	printf("###############################\n");
	printf("please select:");
}

PlayerMove()函数实现用户走

void PlayerMove(char board[][COL], int row, int col)
{
	while (1)
	{
		int x = 0;
		int y = 0;
		printf("please enter pos<x,y>:");
		scanf("%d%d", &x, &y);
		//判断用户输入的坐标是否合法
		if (x >= 1 && x <= 3 && y >= 1 && y <= 3)
		{
			//用户输入从1开始,数组下标从0开始,所以减1
			if (board[x - 1][y - 1] == ' ')
			{
				board[x - 1][y - 1] = PLAYER_COLOR;
				break;
			}
			else
			{
				printf("enter error,try again!\n");
			}
		}
	}
}

ComputerMove()实现电脑走

void ComputerMove(char board[][COL], int row, int col)
{
	while (1)
	{
		int x = rand() % row;//调用rand函数生成随机数,使行范围在[0,2]
		int y = rand() % col;//调用rand函数生成随机数,使列范围在[0,2]
		if (board[x][y] == ' ')//判断该位置是否为空,电脑是否可继续落子
		{
			board[x][y] = COMPUTER_COLOR;
			break;
		}
	}
}

Judge()函数判断

char Judge(char board[][COL], int row, int col)
{
	int i = 0;
	int j = 0;
	for (i = 0; i < row; i++)
	{
		//判断落子是否合法,每一行是否三子连珠
		if (board[i][0] != ' ' && board[i][0] == board[i][1] && board[i][1] == board[i][2])
		{
			return board[i][0];
		}
	}
	for (j = 0; j < col; j++)
	{
		//判断落子是否合法,每一列是否三子连珠
		if (board[0][j] != ' ' && board[0][j] == board[1][j] && board[1][j] == board[2][j])
		{
			return board[0][j];
		}
	}
	//判断落子是否合法,主对角线是否能三子连珠
	if (board[1][1] != ' ' && board[0][0] == board[1][1] && board[1][1] == board[2][2])
	{
		return board[1][1];
	}
	//判断落子是否合法,次对角线是否能三子连珠
	if (board[1][1] != ' ' && board[0][2] == board[1][1] && board[1][1] == board[2][0])
	{
		return board[1][1];
	}
	for (i = 0; i < row; i++)
	{
		for (j = 0; j < col; j++)
		{
			//说明没有实现三子连珠,棋盘未被铺满,继续执行
			if (board[i][j] == ' ')
			{
				return 'N';
			}
		}
	}
		return 'E';//说明没有实现三子连珠,且棋盘已满,则为平局
}

ShowBoard()函数显示棋盘

void ShowBoard(char board[][COL], int row, int col)
{
	system("cls");//清屏
	int i = 0;
	int j = 0;
	printf("  | 1 | 2 | 3 |\n");
	printf("---------------\n");
	for (i=0; i < row; i++)
	{
		printf("%d |", i + 1);
		for (j=0; j < col; j++)
		{
			printf(" %c |", board[i][j]);
		}
		printf("\n---------------\n");
	}
	printf("\n");
}

Game()函数为游戏的实现

void Game()
{
	char result = '\0';
	char board[ROW][COL];//定义数组棋盘
	InitBoard(board, ROW, COL);
	ShowBoard(board, ROW, COL);
	srand((unsigned int)time(NULL));
	while (1)
	{
		PlayerMove(board, ROW, COL);
		ShowBoard(board, ROW, COL);
		result = Judge(board, ROW, COL);
		if (result != 'N')//每次走完都需判断
		{
			break;
		}
		ComputerMove(board, ROW, COL);
		ShowBoard(board, ROW, COL);
		result = Judge(board, ROW, COL);
		if (result != 'N')
		{
			break;
		}
	}
	switch (result)
	{
	case 'X':
		printf("congratulations!you win!\n");
		break;
	case 'O':
		printf("sorry,you lose\n");
		break;
	case 'E':
		printf("equal!\n");
		break;
	default:
		printf("bug?\n");
		break;
	}

运行结果

选择页面
在这里插入图片描述
输入页面
在这里插入图片描述
用户赢
在这里插入图片描述
电脑赢
在这里插入图片描述
平局
在这里插入图片描述

扫描二维码关注公众号,回复: 9499731 查看本文章
发布了32 篇原创文章 · 获赞 6 · 访问量 828

猜你喜欢

转载自blog.csdn.net/Beverly_/article/details/90322163