本文实例讲述了基于C语言实现五子棋游戏的方法,代码备有比较完整的注释,可以帮助读者更好的加以理解。
五子棋游戏代码如下:
/*
* 使用键盘的上下左右键移动棋盘,空格键表示下棋,ESC键退出程序
*/
#include
#include
#include
#include
#include
/*
* 对应键盘键的十六进制数字
*/
#define ESC 0x11b
#define UP 0x4800
#define DOWN 0x5000
#define LEFT 0x4b00
#define RIGHT 0x4d00
#define BLANK 0x3920
#define PLAYER1 1
#define PLAYER2 2
#define COMPUTER 2
#define LENGTH 15
#define SEARCH_DEEP 2
/*
* 用来在函数can_expand()查找可以扩展的节点步长
*/
#define STEP 1
/************全局变量定义***************/
int x1 = 240,
y1 = 240,
oldx = 240,
oldy = 240;
int key_mode;
int key_net;
int step_sum = 0;
int chessman[LENGTH][LENGTH];
int depth = 2; /* 搜索的深度 */
int a = 0,
b = 0;
int flag_run;
int win_flag = 0;
typedef struct five_chess *point;
struct five_chess {
int x;
int y;
int layer;
double value;
double score;
int chess[LENGTH][LENGTH];
int record[LENGTH][LENGTH];
} A;
int stack_deep0 = 0;
point stack_c[10];
point close[600];
void
push(point s0)
{
if (stack_deep0 < 10)
stack_c[stack_deep0++] = s0;
}
point
top()
{
if (stack_deep0 > 0)
return stack_c[stack_deep0 - 1];
/*else return 一个什么样的东西?*/
}
void
pop()
{
if (stack_deep0 > 0)
stack_deep0--;
}
int
is_empty()
{
if (stack_deep0 != 0)
return 1;
else
return 0;
}
/************函数的声明**************/
void five();
void show();
int win_or_not(int x0, int y0, int who,
int chessman[LENGTH][LENGTH], int a);
void set_chessman();
void print_result();
/************评价函数部分************/
double score_row(int i, int j, int chessman[LENGTH][LENGTH]);
double score_col(int i, int j, int chessman[LENGTH][LENGTH]);
double score_diag_45(int i, int j, int chessman[LENGTH][LENGTH]);
double score_diag_135(int i, int j, int chessman[LENGTH][LENGTH]);
double total_score(int who_running, int chessman[LENGTH][LENGTH]);
double score(int chessman[LENGTH][LENGTH]);
int rowdt(int i, int j, int chessman[LENGTH][LENGTH]);
int coldt(int i, int j, int chessman[LENGTH][LENGTH]);
int diadt(int i, int j, int chessman[LENGTH][LENGTH]);
int vdiadt(int i, int j, int chessman[LENGTH][LENGTH]);
int can_expand(int i, int j, int chessman[LENGTH][LENGTH]);
void copy(point s1, point s0);
int
POW(int s, int t)
{
int sum = s,
i;
if (t <= 0)
return 1;
for (i = 0; i < t; i++)
sum *= sum;
return sum;
}
/*
* 定义computer先手
*/
point
expand(point s0)
{
int flag;
int i,
j;
point new_chess = (point) malloc(sizeof(struct five_chess));
/*************************这里出错***********************************/
for (i = 0; i < LENGTH; i++)
for (j = 0; j < LENGTH; j++)
new_chess->chess[i][j] = s0->chess[i][j];
for (i = 0; i < LENGTH; i++)
for (j = 0; j < LENGTH; j++)
new_chess->record[i][j] = s0->chess[i][j];
/*************************这里出错***********************************/
if (s0->layer % 2 == 0)
flag = COMPUTER;
else
flag = PLAYER1;
for (i = 0; i < LENGTH; i++)
for (j = 0; j < LENGTH; j++) {
if (s0->record[i][j]) /*如果有棋子*/
continue;
if (can_expand(i, j, s0->chess) == 0) /*如果有棋子,而且沿水平,树直,左上—右下,右上—左下,四个方向可以扩展*/
continue;
s0->record[i][j] = flag;
new_chess->chess[i][j] = flag;
new_chess->layer = s0->layer + 1;
new_chess->x = i;
new_chess->y = j;
new_chess->record[i][j] = flag;
return new_chess;
}
/*
* for(i=5;i<10;i++) for(j=5;j<10;j++){ if(s0->record[i][j]) continue;
* if(can_expand(i,j,s0->chess)==0) continue; s0->record[i][j]=flag;
* new_chess->x=i; new_chess->y=j; new_chess->record[i][j]=flag;
* new_chess->layer=s0->layer+1; new_chess->chess[i][j]=flag ; return
* new_chess; } for(i=2;i<12;i++) for(j=2;j<12;j++){
* if(i>4&&i<10&&j>4&&j<10) continue; if(s0->record[i][j]) continue;
* if(can_expand(i,j,s0->chess)==0) continue; s0->record[i][j]=flag;
* new_chess->x=i; new_chess->y=j; new_chess->record[i][j]=flag;
* new_chess->layer=s0->layer+1; new_chess->chess[i][j]=flag; return
* new_chess;
*
* } for(i=0;i
* if(i>1&&i<12&&j>1&&j<12) continue; if(s0->record[i][j]) continue;
* if(can_expand(i,j,s0->chess)==0) continue; s0->record[i][j]=flag;
* new_chess->chess[i][j]=flag; new_chess->layer=s0->layer+1;
* new_chess->x=i; new_chess->y=j; new_chess->record[i][j]=flag; return
* new_chess; }
*/
new_chess->layer = -1;
return new_chess;
}
void
computer()
{
int i,
j,
k,
num = 0;
int break_now = 0;
int break_then = 0;
int go_on = 0;
point s0 = NULL,
s1 = NULL,
s2 = NULL,
max_chess = NULL;
point temps = NULL,
s01;
/*
* 堆栈的初始化
*/
stack_deep0 = 0;
s0 = malloc(sizeof(struct five_chess));
for (i = 0; i < 600; i++) /*为什么是600*/
close[i] = NULL; /*close是一个point 数组*/
close[num++] = s0;
for (i = 0; i < LENGTH; i++)
for (j = 0; j < LENGTH; j