您现在的位置是:首页 > 开发类 > 游戏开发游戏开发

用C语言实现三子棋(含思路+完整代码)

2021-06-05 09:11:14游戏开发人已围观

简介三子棋三子棋含义:三子棋是黑白棋的一种。三子棋又叫九宫棋、圈圈叉叉、一条龙、井字棋等。将正方形对角线连起来,相对两边依次摆上三个双方棋子,只要将自己的三个棋子走成一条线,对方就算输了。但是,有很多时候会出现和棋的情况。...

三子棋

目录

三子棋

三子棋含义:

基本思路:

1.创建用户交互菜单界面

2.初始化棋盘

3.显示棋盘面板

4.用户落子

5.电脑随机正确落子

6.判断胜负

7.创建Game界面

完整代码

代码结果显示


三子棋含义:

      三子棋是黑白棋的一种。三子棋又叫九宫棋、圈圈叉叉、一条龙、井字棋等。将正方形对角线连起来,相对两边依次摆上三个双方棋子,只要将自己的三个棋子走成一条线,对方就算输了。但是,有很多时候会出现和棋的情况。图例如下:

                                                          

基本思路:

1.创建用户交互菜单界面

2.初始化棋盘

3.显示棋盘面板(为了不重复显示棋盘,使用清屏操作)

4.用户落子

5.判断胜负

6.电脑随机正确落子

7.判断胜负

(在每次写程序之前,可以向如下图所示,写出思路或伪代码)

创建多文件项目:

写代码之前,首先建立三个文件,以方便后序代码更加完整清晰地呈现。

1.创建用户交互菜单界面

void Meau(){
	printf("+------ meau ----------+\n");
	printf("|----  1.play  --------|\n");
	printf("|----  0.quit  --------|\n");
	printf("+----------------------+\n");
}

2.初始化棋盘

使用宏定义,将棋盘中的内容初始化为空。

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

3.显示棋盘面板

为了不重复显示棋盘,使用清屏操作,使得每次现实的棋盘只有一张。

通过不断调试,使得最终界面,与预期所需界面一致。

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

4.用户落子

落子只能落在为空的位置上,所以在落子前需要判空,若为空,则落子,否则提示重新落子。

static void PlayerMove(char board[][COL], int row, int col){
	int x = 0;
	int y = 0;
	while (1){
		printf("please enter your postion<x,y>: ");
		scanf("%d %d", &x, &y);
		if (x<1 || x>3 || y<1 || y>3){
			printf("Postion Error!");
			continue;
		}
		if (board[x - 1][y - 1] == INIT){
			board[x - 1][y - 1] = WHITE;
			break;
		}
		else{
			printf("Postion Is Not Empty!\n");
		}
	}
}

5.电脑随机正确落子

使用随机数,在正确位置落子。

static 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;	
		}
	}
}

6.判断胜负

static char IsEnd(char board[][COL], int row, int col){
	for (int 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 (int 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[0][0] != INIT){
		return board[0][0];
	}
	if(board[0][2] == board[1][1] && \
		board[1][1] == board[2][0] && \
		board[1][1] != INIT){
		return board[1][1];
	}
	for (int i = 0; i < row; i++){
		for (int j = 0; j < col; j++){
			if (board[i][j] == INIT);
			return NEXT;
		}
	}
	return DRAW;
}

7.创建Game界面

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("it ends in a draw\n"); 
		break;
	defult:
		printf("bug\n");
		break;
	}
}

完整代码

//main.c文件
#include"game.h"

void Meau(){
	printf("+------ meau ----------+\n");
	printf("|----  1.play  --------|\n");
	printf("|----  0.quit  --------|\n");
	printf("+----------------------+\n");
}
int main(){
	int select = 0;
	int quit = 0;
	    while (!quit)
		{
			Meau();
			printf("please enter your choose: ");
			scanf("%d", &select);
			switch (select)
			{
			case 1:
				Game();
				break;
			case 0:
				quit = 1;
				break;
			defult:
				printf("Select error!Try again!\n");
				break;
		    }
		}
	printf("byebye!\n");
	system("pause");
	return 0;
}

//game.c 文件
#include"game.h"
static void InitBoard(char board[][COL], int row, int col){
	for (int i = 0; i < row; i++){
		for (int j = 0; j < col; j++){
			board[i][j] = INIT;
		}
	}
}
static void ShowBoard(char board[][COL],int row,int col){
	system("cls");
	printf("  ");
	for (int i = 0; i < col; i++){
		printf(" %3d", i + 1);
	}
	printf("\n----------------\n");
	for (int i = 0; i < row; i++){
		printf("%-2d", i + 1);
		for (int j = 0; j < col; j++){
			printf("| %c ", board[i][j]);
		}
		printf("\n----------------\n");
	}
}
static char IsEnd(char board[][COL], int row, int col){
	for (int 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 (int 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[0][0] != INIT){
		return board[0][0];
	}
	if(board[0][2] == board[1][1] && \
		board[1][1] == board[2][0] && \
		board[1][1] != INIT){
		return board[1][1];
	}
	for (int i = 0; i < row; i++){
		for (int j = 0; j < col; j++){
			if (board[i][j] == INIT);
			return NEXT;
		}
	}
	return DRAW;
}
static void PlayerMove(char board[][COL], int row, int col){
	int x = 0;
	int y = 0;
	while (1){
		printf("please enter your postion<x,y>: ");
		scanf("%d %d", &x, &y);
		if (x<1 || x>3 || y<1 || y>3){
			printf("Postion Error!");
			continue;
		}
		if (board[x - 1][y - 1] == INIT){
			board[x - 1][y - 1] = WHITE;
			break;
		}
		else{
			printf("Postion Is Not Empty!\n");
		}
	}
}
static 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;
			
		}
	}
}

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("it ends in a draw\n"); 
		break;
	defult:
		printf("bug\n");
		break;
	}
}

//game.h文件
#ifndef __GAME_H__
#define __GAME_H__
#include<stdio.h>
#include <time.h>
#include <stdlib.h>
#include<windows.h>
#pragma warning(disable:4996)
#define ROW 3
#define COL 3

#define INIT ' '
#define WHITE 'X'//player
#define BLACK 'O'//computer

#define DRAW 'D'
#define NEXT 'N'
extern void Game();
#endif

代码结果显示

 

文章来源:https://blog.csdn.net/SSnnX/article/details/117520170

Tags:c 

很赞哦! ()

随机图文

文章评论

留言与评论(共有 0 条评论)
   
验证码:

本栏推荐

站点信息

  • 文章统计247968篇文章
  • 浏览统计18356次浏览
  • 评论统计1个评论
  • 标签管理标签云
  • 统计数据:统计代码
  • 微信公众号:扫描二维码,关注我们