当前位置:网站首页>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
边栏推荐
- Transformer principle and code elaboration
- shu mei pai
- ROS learning (IX): referencing custom message types in header files
- 洛谷P4127 [AHOI2009]同类分布 题解
- DataX self check error /datax/plugin/reader/_ drdsreader/plugin. Json] does not exist
- opencv学习笔记八--答题卡识别
- 49. Sound card driven article collection
- TS 类型体操 之 循环中的键值判断,as 关键字使用
- The difference between TS Gymnastics (cross operation) and interface inheritance
- 继电反馈PID控制器参数自整定
猜你喜欢
Risk planning and identification of Oracle project management system
Relevant introduction of clip image
Jerry's ad series MIDI function description [chapter]
21. Delete data
Force buckle day31
Redis builds clusters
Google可能在春节后回归中国市场。
The ECU of 21 Audi q5l 45tfsi brushes is upgraded to master special adjustment, and the horsepower is safely and stably increased to 305 horsepower
成为优秀的TS体操高手 之 TS 类型体操前置知识储备
Qualitative risk analysis of Oracle project management system
随机推荐
Scala语言学习-08-抽象类
[dictionary tree] [trie] p3879 [tjoi2010] reading comprehension
上线APS系统,破除物料采购计划与生产实际脱钩的难题
C # connect to SQLite database to read content
esRally国内安装使用避坑指南-全网最新
xpath中的position()函数使用
[CF Gym101196-I] Waif Until Dark 网络最大流
js對象獲取屬性的方法(.和[]方式)
Google可能在春节后回归中国市场。
The difference between TS Gymnastics (cross operation) and interface inheritance
Le chemin du navigateur Edge obtient
数据治理:微服务架构下的数据治理
Méthode d'obtention des propriétés de l'objet JS (.Et [] méthodes)
Relevant introduction of clip image
Parameter self-tuning of relay feedback PID controller
Rust language - receive command line parameter instances
解决方案:智慧工地智能巡检方案视频监控系统
Luogu p4127 [ahoi2009] similar distribution problem solution
Document 2 Feb 12 16:54
WebRTC系列-H.264预估码率计算