三子棋小游戏

1.构建菜单

void Menu()
{
	printf("|--------------------------------|\n");
	printf("|1.ThreeChess          0.Exit    |\n");
	printf("|--------------------------------|\n");
}

  也可以添加2,3,4…选项添加更多游戏选项。
  有了菜单我们还需要一个棋盘,但这个棋盘是用一个二维数组实现的但是这个二位数组我们该用什么实现呢?经过我多次思考决定用字符型比较好,我们分别用O表示玩家的棋子,X表示电脑的棋子。我们创建了一个函数得初始化,初始化我决定封装成函数,来提升代码的可读性。

2.在主函数中生成选项

int main()
{
	int select = 0;
	int quit = 0;
	while (!quit){  //输入错误数字不能退出
		Menu();
		printf("Please Select# ");
		scanf("%d", &select);
		switch (select){
		case 1:
			Game();
			break;
		case 0:
			quit = 1;
			break;
		default:
			printf("Enter Error, Try Again!\n");
			break;
		}
	}
	printf("ByeBye!\n");
	system("pause");   
	return 0;
}

3.定义宏常量

#define ROW 3
#define COL 3  

#define INIT ' '   //此处表示空格
#define BLACK 'X'
#define WHITE 'O'  //表示人和电脑棋子

#define DRAW 'D'   //此为平局
#define NEXT 'N'    //若棋子落盘正确进入下一步

4.游戏函数

void Game()
{
	char board[ROW][COL];
	InitBoard(board,ROW,COL);  //初始化棋盘
	
	srand((unsigned long)time(NULL));//生成随机数让电脑落子
	char result=0;
	while(1)
	{
		ShowBoard(board,ROW,COL); //展示棋盘
		PlayerMove(board,ROW,COL);  //人下棋
		result =IsEnd(board,ROW,COL);  
		if(result!=NEXT){   //判断胜负
			break;
		}
		ShowBoard(board,ROW,COL);
		ComputerMove(board,ROW,COL);
		result=IsEnd(board,ROW,COL);  //电脑落子
		if(result!=NEXT){
			break;
		}
	}
	ShowBoard(board,ROW,COL);  //游戏结束再展示棋盘
	switch (result){
	case WHITE:
		printf("You Win!\n");
		break;
	case BLACK:
		printf("You Lose!\n");
		break;
	case DRAW:
		printf("You == Computer!\n");
		break;
	default:
		printf("BUG!\n"); //Do Nothing!
		break;
	}
}

5.初始化棋盘

void InitBoard(char board[][COL],int row,int col)
{
	int i,j;
	for (i = 0; i < row; i++){
		for (j = 0; j < col; j++){
			board[i][j] = INIT;
		}
	}
}

这里将棋盘全设置为空白

6.展示棋盘

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


游戏开始时第一次展示棋盘

7.判断胜负

char IsEnd(char board[][COL], int row, int col)
{
	int i,j;
	for (i = 0; i < row; i++){
		if (board[i][0] == board[i][1] && \  //这里‘\’表示续行
			board[i][1] == board[i][2] && \
			board[i][0] != INIT){
			return board[i][0];
		}
	}

	for (j = 0; j < COL; j++){
		if (board[0][j] == board[1][j] && \
			board[1][j] == board[2][j] && \
			board[0][j] != INIT){
			return board[0][j];
		}
	}
	if (board[0][0] == board[1][1] && \
		board[1][1] == board[2][2] && \
		board[1][1] != INIT){
		return board[1][1];
	}
	if (board[0][2] == board[1][1] && \
		board[1][1] == board[2][0] && \
		board[1][1] != INIT){
		return board[1][1];
	}
	for (i = 0; i < row; i++){
		for (j = 0; j < col; j++){
			if (board[i][j] == INIT){
				return NEXT;
			}
		}
	}
	return DRAW;  //若以上情况都不是,则判为平局
}

在这里插入图片描述
若最终无胜负则判为平局

8.玩家落子

void PlayerMove(char board[][COL], int row, int col)
{
	int x = 0;
	int y = 0;
	while (1){
		printf("Please Enter Postion<x,y># ");
		scanf("%d %d", &x, &y);
		if (x < 1 || y < 1 || x > 3 || y > 3){  //判断落子是否合法
			printf("Enter Postion Error!\n");
			continue;
		}
		if (board[x - 1][y - 1] == INIT){ //若此处无子,则在此处落子
			board[x - 1][y - 1] = WHITE;
			break; 
		}
		else{
			printf("Postion Is Not Empty!\n");
		}
	}
}

9.电脑随机落子

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

10.头文件

#ifndef __GAME_H__
#define __GAME_H__

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

#define ROW 3
#define COL 3

#define INIT ' '
#define WHITE 'X' //Player
#define BLACK 'O' //Computer


#define DRAW 'D'
#define NEXT 'N'

#pragma warning(disable:4996)

extern void Game();

#endif

思路总结:

  首先我们需要一个菜单这个菜单能根据你的输入决定是要开始游戏还是退出游戏,再是棋盘这一定是一个二维数组的棋盘。再是玩家下棋和电脑下棋最后再是判断输赢。

  • 5
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值