三子棋游戏的实现(C语言)

本文内容为用C语言实现一个简单的三子棋小游戏:

主要步骤有以下几点:

  • 打印菜单

  • 打印棋盘

  • 游戏过程

    • 玩家落子
    • 电脑落子
  • 判断结果

    • 玩家获胜
    • 电脑获胜
    • 平局
  • 提示玩家是否再来一局并且再次显示菜单

以多文件形式完成:

  • chess.h(放置所有预处理命令、头文件、宏定义以及函数声明)
  • chess.c(函数具体实现)
  • main.c(主要逻辑及函数调用)

以下为具体代码实现:
main.c

#include "chess.h"

int main()
{
	int quit = 0;//用来跳出while循环以退出游戏
	while (!quit){
		Menu();
		int select = 0;
		scanf("%d", &select);
		switch (select){
		case 1:
			Game();
			break;
		case 2:
			quit = 1;//跳出while循环
			break;
		default:
			printf("Enter error!Please enter again:\n");
			break;
		}
	}

	system("pause");
	return 0;
}

chess.h

#ifndef _CHESS_H_
#define _CHESS_H_

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <windows.h>
#pragma warning(disable:4996)

#define ROW 3
#define COL 3
#define PLAYER_PIECE 'X'//玩家旗子
#define COMPUTER_PIECE 'O'//电脑旗子

void Menu();
void Game();
void InitBoard(char board[][COL], int row, int col);
void ShowBoard(char board[][COL], int row, int col);
int  PlayerMove(char board[][COL], int row, int col);
void ComputerMove(char board[][COL], int row, int col);
char JudgeResult(char board[][COL], int row, int col);

#endif

chess.c

#include "chess.h"

void Menu()//游戏菜单
{
	printf("********************************************\n");
	printf("*********** 欢迎来到三子棋游戏!************\n");
	printf("********************************************\n");
	printf("******1.Play!                  2.Exit!******\n");
	printf("********************************************\n");
	printf("Please enter your selection: ");
}

void InitBoard(char board[][COL], int row, int col)//清空游戏棋盘
{
	int i = 0;
	for (; i < row; i++){
		int j = 0;
		for (; j < col; j++){
			board[i][j] = ' ';
		}
	}
}

void ShowBoard(char board[][COL], int row, int col)//显示游戏棋盘
{
	printf("----------------\n");
	printf("   | 1 | 2 | 3 |\n");
	int i = 0;
	for (; i < row; i++){
		printf("----------------\n");
		printf(" %d | %c | %c | %c |\n", i + 1, board[i][0], board[i][1], board[i][2]);
	}
	printf("----------------\n");
}

int PlayerMove(char board[][COL], int row, int col)//玩家落子
{
	int x = 0;
	int y = 0;
	printf("Please enter your position<x,y>: ");
	scanf("%d %d", &x, &y);
	if (x >= 1 && x <= 3 && y >= 1 && y <= 3){
		if (board[x - 1][y - 1] != ' '){
			return 2;//玩家输入坐标位置已被占用
		}
		board[x - 1][y - 1] = PLAYER_PIECE;
		return 0;//玩家正常落子
	}
	else{
		return 1;//玩家输入坐标有误
	}
}

void ComputerMove(char board[][COL], int row, int col)//电脑落子
{
	while (1){
		int i = rand() % row;
		int j = rand() % col;//使电脑在棋盘范围内随机落子
		if (board[i][j] == ' '){
			board[i][j] = COMPUTER_PIECE;
			break;
		}
	}
	Sleep(500);
	printf("Computer done!\n");//提示玩家电脑落子完毕
}

char JudgeResult(char board[][COL], int row, int col)//判断游戏结果
{
	int i = 0;
	for (; i < row; i++){
		if (board[i][0] != ' '&& 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[0][i] == board[1][i] && board[1][i] == board[2][i]){
			return board[0][i];//检查各列是否三子连珠
		}
	}
	if (board[0][0] != ' '&& board[0][0] == board[1][1] && board[1][1] == board[2][2]){
		return board[0][0];//检查对角线1是否三子连珠
	}
	if (board[0][2] != ' '&& board[0][2] == board[1][1] && board[1][1] == board[2][0]){
		return board[0][2];//检查对角线2是否三子连珠
	}
	for (i = 0; i < row; i++){
		int j = 0;
		for (; j < col; j++){
			if (board[i][j] ==' '){
				return 'N';//没有产生结果并且棋盘还有空位置,则继续
			}
		}
	}
	return 'E';//没有产生结果并且棋盘已被占满,则为平局
}

void Game()//游戏函数
{
	printf("Game begin!\n");
	char board[ROW][COL];//定义一个三行三列的数组
	InitBoard(board,ROW,COL);
	int result = 'N';
	srand((unsigned long)time(NULL));//产生随机数,供电脑落子
	while (1){
		ShowBoard(board, ROW, COL);
		int ret = PlayerMove(board, ROW, COL);
		if (1 == ret){
			printf("Enter erorr!Please enter again<x,y>:\n");
			continue;
		}
		else if (2 == ret){
			printf("The position you entered are occupied!Please enter again!\n");
			continue;
		}
		else{
			printf("Player done!\n");//玩家落子完毕
		}
		result = JudgeResult(board, ROW, COL);
		if (result != 'N'){
			break;//如果返回值不为'N'(即已产生结果或平局),则跳出循环,进行结果判断
		}
		ComputerMove(board, ROW, COL);
		result = JudgeResult(board, ROW, COL);
		if (result != 'N'){
			break;//同上
		}
	}
	ShowBoard(board, ROW, COL);//产生结果之后显示最终游戏面板
	printf("Game end!\n");
	//判定游戏结果:
	switch (result){
	case 'E':
		printf("You got a draw with the computer!\n");//平局
		break;
	case PLAYER_PIECE://三子连珠时返回玩家旗子则代表玩家获胜
		printf("Congratulations, you won!\n");
		break;
	case COMPUTER_PIECE://三子连珠时返回电脑旗子则代表电脑获胜
		printf("Sorry,you lost the game!\n");
		break;
	default:
		break;
	}
	printf("Do you want to play again?\n");//提示玩家要不要再来一局
}

运行结果及游戏测试:

  • 玩家获胜
    在这里插入图片描述
  • 电脑获胜
    在这里插入图片描述
  • 平局
    在这里插入图片描述
    总结:
    这是用C语言来完成的一个简单的三子棋小游戏,总体来说实现起来十分简单,逻辑清晰。并且可以继续扩展,如增加玩家和电脑谁先落子的选择(本文代码是默认玩家首先落子),或者在电脑落子时添加适当算法以增加难度,读者可以自己去尝试相关扩展。
原创文章 4 获赞 4 访问量 369

猜你喜欢

转载自blog.csdn.net/X_Mrjw/article/details/105656673