先说下背景吧,写下这篇博客时,博主大一在读,C语言初学者,寒假无事,便计划写几个由C语言实现的小游戏以提升编程能力。在这篇博客里分享的是可人机对战的五子棋游戏。
棋类游戏要实现初级的机器智能,其核心思想便是:
感知(SENSE)->
思考(THINK)->
行动(ACT)。所以,本文将尽量以这个顺序介绍实现过程。
(1) 前期准备:
此程序中,机器方将以“当前最佳下法”来主导行动,即设计一套评价体系,针对每一个可落子处,综合评分,最终选最高分处落子。所以,我定义了“位置”的结构,包含横纵坐标和得分数三个参数。进而,定义一个位置结构体数组,用于记录每次评分时的可选位置,以及记录该数组最后一个有效元素下标的变量,用于更方便存入取出。另外,诸如初始化棋盘,打印棋盘,初始化位置结构体数组等自定义函数,也一并贴在此处。
#include<stdio.h>
#include<windows.h>
#define TRUE 1
#define FALSE 0
struct position {
int x;
int y;
int score;
};
char chess_board[16][16];
struct position positions[50];
int position_order;
void initialize_board(void)
{
int i, j;
for (i = 0;i < 16;i++) {
for (j = 0;j < 16;j++) {
chess_board[i][j] = ' ';
}
}
}
void initial_positions(void)
{
positions[0].x = positions[0].y = positions[0].score = 0;
for (position_order = 1;position_order < 50;position_order++) {
positions[position_order] = positions[0];
}
position_order = 0;
}
void print_board(void)
{
int i, j;
/*print letters*/
printf(" ");
for (j = 0;j < 16;j++) {
printf(" %c", 'A' + j);
}
putchar('\n');
/*print chess board*/
for (i = 0;i < 33;i++) {
if (i % 2 == 1) {
printf("%2d", (i + 1) / 2);
}
else {
printf(" ");
}
for (j = 0;j < 33;j++) {
/*The first row*/
if (i == 0 && j == 0) {
printf("┌ ");
}
else if (i == 0 && j==32) {
printf("┐");
}
else if (i == 0 && j % 2 == 0) {
printf("┬ ");
}
/*The last row*/
if (i == 32 && j == 0) {
printf("└ ");
}
else if (i == 32 && j == 32) {
printf("┘");
}
else if (i == 32 && j % 2 == 0) {
printf("┴ ");
}
/*The other rows*/
if (i != 0 && i != 32) {
if (i % 2 == 0) {
if (j == 0) {
printf("├ ");
}
else if (j == 32) {
printf("┤");
}
else if (j % 2 == 0) {
printf("┼ ");
}
}
else if(j % 2 == 0) {
printf(" %c", chess_board[(i - 1) / 2][(j + 1) / 2]);
}
}
}
putchar('\n');
}
}
int is_full(void) {
int i, j;
for (i = 0;i < 16;i++) {
for (j = 0;j < 16;j++) {
if (chess_board[i][j] == ' ')
return(FALSE);
}
}
return(TRUE);
}
void is_win(int x, int y, char cp)
{
int i, num=0;
/*row*/
for (i = 0;chess_board[y][x +