当前位置:网站首页>Sanzi chess (C language)

Sanzi chess (C language)

2022-07-06 07:50:00 Dull in autumn 11111

The rules of the game

Players and computers ( No technology , Random down )

The default player will go first , One child at a time , The two sides alternate , Until either computer or player wins , Or the chessboard is full ( It ends in a draw ), Game over .


Application framework

Three files :

text.c__ Test the logic of the game ( Source file )

game.c__ function ( Source file )

game.h__ The definition of symbols Declaration of functions ( The header file )


The basic idea

1. Print menu

                1.play( Play )   0.exit( Quit the game ) Enter other numbers ( Input error , Re input )

Implementation code

//text.c
#include "game.h"

void menu()
{
    printf("************************");
    printf("*******  1.play ********");
    printf("*******  0.exit ********");
    printf("************************");
}
void text()
{
	int input = 0;
	do 
	{
		menu();	
		printf(" Please enter :->\n");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			game();// Implement the functions of the three piece chess game 
			break;
		case 0:
			printf(" End the game :->\n");
			break;
		default:
			printf(" Input error , Please re-enter :->\n");
			break;
		}
	}while(input)
}
int main()
{
    text();
    return 0;
}

2. Complete the Sanzi game function code

In the file text.c Of game() in

Complete the idea of sanziqi :

           1. Initialize the chessboard to full space ( Need to have a dividing line )

           2. Print chessboard + data ()

           3. Players play chess

           4. The computer plays chess ( Random )

           5. Judgement of winning or losing  

See the following code :

//text.c
void game()
{
    // An array of chess players 
    char boar[ROW][COL]={0};
    
    // Initialize the chessboard to be full of spaces 
    InitBoard(board,ROW,COL);
    
    // Print chessboard 
    DisplayBoard(board,ROW,COL);

    // Players play chess , Judgement of winning or losing 
    // The computer plays chess at random , Judgement of winning or losing 
}

above 5 Each step requires 5 Functions in game.h In a statement , stay game.c The concrete implementation of

The statement is shown below :

//game.h Statement 
#include<stdio.h>

#define ROW 3// Create a chessboard , That's ok 3
#define COL 3// Create a chessboard , Column 3
// Use a macro to define , Define rows and columns , Easy to modify 

// Initialize chessboard 
void InitBoard(char board[ROW][COL], int row, int col);

// Print chessboard 
void DisplayBoard(char board[ROW][COL], int row, int col);

// Players play chess 
void player_move(char board[ROW][COL], int row, int col);

// The computer plays chess 
void computer_move(char board[ROW][COL], int row, int col);

// Judgement of winning or losing 
char is_win(char board[ROW][COL], int row, int col);

1. Initialize the array data to spaces  

//game.c Function implementation 
#include "game.h"

// Initialization data 
void InitBoard(char board[ROW][COL], int row, int col)
{
	for (int i = 0; i < row; i++)
	{
		for (int j = 0; j < col; j++)
		{
			board[i][j] = ' ';
		}
	}
}

2. There are spaces in the chessboard array , Need to print chessboard  

Can be realized as :

void DisplayBoard(char board[ROW][COL], int row, int col)
{
	for (int i = 0; i < row; i++)
	{
		// Print data 
		printf(" %c | %c | %c \n", board[i][0], board[i][1], board[i][2]);
		// Print split lines 
		if(i<row-1)
		printf("---|---|---\n");
	}
}

But the above code only applies to 3*3 The board , To improve universality , Can be realized as : 

//game.c
// Print chessboard + data 

void DisplayBoard(char board[ROW][COL], int row, int col)
{
	for (int i = 0; i < row; i++)
	{
		// Print data 
		for (int j = 0; j < col; j++)
		{
			printf(" %c ", board[i][j]);
		    if (j < col - 1)
			    printf("|");
		}
		printf("\n");
		// Print split lines 
		if (i < row - 1)
		{
			for (int j = 0; j < col; j++)
			{
				printf("---");
				if (j < col - 1)
					printf("|");
			}
			printf("\n");
		}
	}
}

  Chessboard printing effect :

 

 3.  Players play chess

The default player plays chess first , And the pieces are :*

Players need to enter coordinates , Players think the coordinates are from 1 beginning , Computer coordinates from 0 beginning , That is, players need to reduce the input coordinates 1

//game.c

// Players play chess 
void player_move(char board[ROW][COL], int row, int col)
{
	int x = 0;
	int y = 0;
	printf(" Players play chess \n");
	while (1)
	{
		printf(" Please enter the coordinates :->");
		scanf("%d %d", &x, &y);
		if (x > 0 && x <= row && y > 0 && y <= col)
        // You need to enter coordinates within a reasonable range 
		{
			// Playing chess 
			if (board[x - 1][y - 1] == ' ')
			{
				board[x - 1][y - 1] = '*';
				break;
			}
			else
			{
				printf(" The coordinates are occupied , Please re-enter \n");
			}
		}
		else
		{
			printf(" It's illegal to enter coordinates , Please re-enter \n");
		}
	}
}

4. The computer plays chess ( Random )

Computer chess pieces default to :#

//game.c

// The computer plays chess ( Random )
void computer_move(char board[ROW][COL], int row, int col)
{
	int x = 0;
	int y = 0;
	printf(" The computer plays chess :>\n");
	while (1)
	{
		x = rand() % row;
		y = rand() % col;// Random generation 

		if (board[x][y] == ' ')
		{
			board[x][y] = '#';
			break;
		}
	}
}

notes : Use here rand() function , It needs to be used in the main function srand((unsigned int)time(NULL))

         stay game.h The header file should be marked in , as follows :

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

 5. Judgement of winning or losing ( Three situations )

The main logic text.c To realize the function part of the three piece chess game game() The final version :

/* Game situation : Game player wins , Computers win , It ends in a draw , Continue to cycle */
//  Game player wins _'*'
//  Computers win _'#'
//  It ends in a draw _'Q'
//  continue _'C'

//text.c

void game()
{
	char ret = 0;

	// An array of chess players 
	char board[ROW][COL] = { 0 };

	// Initialize the chessboard to full space 
	InitBoard(board, ROW, COL);

	// Print chessboard 
	DisplayBoard(board, ROW, COL);

	while (1)
	{
		// Players play chess 
		player_move(board, ROW, COL);
		DisplayBoard(board, ROW, COL);
		// Judgement of winning or losing 
		ret = is_win(board, ROW, COL);
		if (ret != 'C')
			break;
        // As long as it's not “ continue ”, Just break the cycle , Jump out 

		// The computer plays chess ( Random )
		computer_move(board, ROW, COL);
		DisplayBoard(board, ROW, COL);
		// Judgement of winning or losing 
		ret = is_win(board, ROW, COL);
		if (ret != 'C')
			break;
        // As long as it's not “ continue ”, Just break the cycle , Jump out 
	}
	if (ret == '*')
	{
		printf(" The player won \n");
	}
	else if (ret == '#')
	{
		printf(" The computer won \n");
	}
	else
	{
		printf(" It ends in a draw \n");
	}
}

victory : Either party only needs to 、 Column 、 Diagonals , First three in a row , That is, the party wins

It ends in a draw : The chessboard is full , The conditions for one side to win have not been met , It ends in a draw

continue : The chessboard is not full The game goes on  

//game.c

// Judgement of winning or losing 
char is_win(char board[ROW][COL], int row, int col)
{
	int i = 0;
	// Judgment line 
	for (i = 0; i < row; i++)
	{
		if (board[i][0]== board[i][1]&& board[i][1] == board[i][2] && board[i][0] != ' ')
		{
			return board[i][0];
		}
	}
	// Judgment column 
	int j = 0;
	for (j = 0; j < col; j++)
	{
		if (board[0][j]== board[1][j] && board[0][j] == board[2][j]&& board[0][j] != ' ')
		{
			return board[0][j];
		}
	}
	// Diagonals 
	if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[1][1] != ' ')
	{
		return board[1][1];
	}
	if (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[1][1] != ' ')
	{
		return board[1][1];
	}
	// Judge a draw 
	if (if_full(board, row, col) == 1)
	{
		return 'Q';
	}
	// continue 
	return 'C';
}

notes : You also need a function to judge whether the chessboard is full ( It ends in a draw )

//game.c
 
static int if_full(char board[ROW][COL], int row, int col)
// Use static Modify function , Limit the scope to this file , In the service of is_win() function 
{
	for (int i = 0; i < row; i++)
	{
		for (int j = 0; j < col; j++)
		{
			if (board[i][j] == ' ')
				return 0;// Not full 
		}
		return 1;
	}
}

To sum up, that is, the sharing content of Sanzi chess games

原网站

版权声明
本文为[Dull in autumn 11111]所创,转载请带上原文链接,感谢
https://yzsam.com/2022/02/202202131853029107.html