如何用python实现五子棋制作五子棋游戏

基于C语言实现五子棋游戏完整实例代码
投稿:shichen2014
字体:[ ] 类型:转载 时间:
这篇文章主要介绍了基于C语言实现五子棋游戏完整实例代码,相信对于学习游戏开发的朋友会有一定的帮助与借鉴价值,需要的朋友可以参考下
本文实例讲述了基于C语言实现五子棋游戏的方法,代码备有比较完整的注释,可以帮助读者更好的加以理解。
五子棋游戏代码如下:
* 使用键盘的上下左右键移动棋盘,空格键表示下棋,ESC键退出程序
#include &stdio.h&
#include &stdlib.h&
#include &bios.h&
#include &graphics.h&
#include&malloc.h&
* 对应键盘键的十六进制数字
#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
/************全局变量定义***************/
oldx = 240,
oldy = 240;
step_sum = 0;
chessman[LENGTH][LENGTH];
depth = 2; /* 搜索的深度 */
win_flag = 0;
typedef struct five_chess *
struct five_chess {
chess[LENGTH][LENGTH];
record[LENGTH][LENGTH];
stack_deep0 = 0;
stack_c[10];
close[600];
push(point s0)
if (stack_deep0 & 10)
stack_c[stack_deep0++] = s0;
if (stack_deep0 & 0)
return stack_c[stack_deep0 - 1];
/*else return 一个什么样的东西?*/
if (stack_deep0 & 0)
stack_deep0--;
is_empty()
if (stack_deep0 != 0)
/************函数的声明**************/
win_or_not(int x0, int y0, int who,
int chessman[LENGTH][LENGTH], int a);
set_chessman();
print_result();
/************评价函数部分************/
score_row(int i, int j, int chessman[LENGTH][LENGTH]);
score_col(int i, int j, int chessman[LENGTH][LENGTH]);
score_diag_45(int i, int j, int chessman[LENGTH][LENGTH]);
score_diag_135(int i, int j, int chessman[LENGTH][LENGTH]);
total_score(int who_running, int chessman[LENGTH][LENGTH]);
score(int chessman[LENGTH][LENGTH]);
rowdt(int i, int j, int chessman[LENGTH][LENGTH]);
coldt(int i, int j, int chessman[LENGTH][LENGTH]);
diadt(int i, int j, int chessman[LENGTH][LENGTH]);
vdiadt(int i, int j, int chessman[LENGTH][LENGTH]);
can_expand(int i, int j, int chessman[LENGTH][LENGTH]);
copy(point s1, point s0);
POW(int s, int t)
if (t &= 0)
for (i = 0; i & i++)
* 定义computer先手
expand(point s0)
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;
flag = PLAYER1;
for (i = 0; i & LENGTH; i++)
for (j = 0; j & LENGTH; j++) {
if (s0-&record[i][j])
/*如果有棋子*/
if (can_expand(i, j, s0-&chess) == 0)
/*如果有棋子,而且沿水平,树直,左上—右下,右上—左下,四个方向可以扩展*/
s0-&record[i][j] =
new_chess-&chess[i][j] =
new_chess-&layer = s0-&layer + 1;
new_chess-&x =
new_chess-&y =
new_chess-&record[i][j] =
return new_
* for(i=5;i&10;i++) for(j=5;j&10;j++){ if(s0-&record[i][j])
* if(can_expand(i,j,s0-&chess)==0) s0-&record[i][j]=
* new_chess-&x=i; new_chess-&y=j; new_chess-&record[i][j]=
* new_chess-&layer=s0-&layer+1; new_chess-&chess[i][j]= return
* new_ } for(i=2;i&12;i++) for(j=2;j&12;j++){
* if(i&4&&i&10&&j&4&&j&10) if(s0-&record[i][j])
* if(can_expand(i,j,s0-&chess)==0) s0-&record[i][j]=
* new_chess-&x=i; new_chess-&y=j; new_chess-&record[i][j]=
* new_chess-&layer=s0-&layer+1; new_chess-&chess[i][j]= return
* } for(i=0;i&LENGTH;i++) for(j=0;j&LENGTH;j++){
* if(i&1&&i&12&&j&1&&j&12) if(s0-&record[i][j])
* if(can_expand(i,j,s0-&chess)==0) s0-&record[i][j]=
* new_chess-&chess[i][j]= new_chess-&layer=s0-&layer+1;
* new_chess-&x=i; new_chess-&y=j; new_chess-&record[i][j]= return
new_chess-&layer = -1;
return new_
computer()
break_now = 0;
break_then = 0;
go_on = 0;
s0 = NULL,
s1 = NULL,
s2 = NULL,
max_chess = NULL;
temps = NULL,
* 堆栈的初始化
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++) {
s0-&chess[i][j] = chessman[i][j];
s0-&record[i][j] = chessman[i][j];
s0-&layer = 0;
s0-&value = -3000000;
s0-&score = -3000000;
while (is_empty() != 0) {
/*看是栈否为空*/
s01 = top();
/*如果不是空*/
s1 = expand(s01);
/*从栈顶开始展开*/
close[num++] = s1;
if (s1-&layer == -1) {
win_or_not((s1-&x + 1) * 30, (s1-&y + 1) * 30, 2, s1-&chess,
if (go_on == 2) {
a = (s1-&x + 1) * 30;
b = (s1-&y + 1) * 30;
break_then = 1;
win_or_not((s1-&x + 1) * 30, (s1-&y + 1) * 30, 1, s1-&chess,
if (go_on == 1) {
a = (s1-&x + 1) * 30;
b = (s1-&y + 1) * 30;
break_then = 1;
s1-&value = 30000;
while (1) {
s1 = top();
s2 = expand(s1);
if (s2-&layer == -1) {
if (s1-&value & top()-&value) {
top()-&value = s1-&
max_chess = s1;
}/*end of if*/
s2-&score = score(s2-&chess);
temps = top();
if (s2-&score & temps-&value)
temps-&value = s2-&
}/*end of whiile(1) */
if (break_then == 0) {
for (i = 0; i & LENGTH; i++) {
for (j = 0; j & LENGTH; j++)
if (max_chess-&chess[i][j] != chessman[i][j]) {
a = i * 30 + 30;
b = j * 30 + 30;
break_now = 1;
if (break_now == 1)
for (i = 0; i & 600; i++) {
if (close[i] == NULL)
free(close[i]);
/**********************************************************/
play_with_who = 1;
printf("1.Play with human\n2.Play with computer\nPlease choice: ");
scanf("%d", &play_with_who);
/*显示棋盘*/
if (play_with_who == 1) {
/*人与人玩*/
while (1) {
/*设置人与人玩的界面*/
settextstyle(0, 0, 2);
if ((step_sum + 1) % 2) {
setcolor(1);
outtextxy(500, 180, "Player2");
setcolor(4);
outtextxy(500, 180, "Player1");
setcolor(1);
outtextxy(500, 180, "Player1");
setcolor(10);
outtextxy(500, 180, "Player2");
if (bioskey(1))
* 按了一次键盘那么就true,执行下面代码,这是bios。h
key = bioskey(0);
* 返回一个键盘值,如没有按键,则一直等待
switch (key) {
case LEFT:
if (x1 & 30) {
/*显示方框*/
if (y1 & 30) {
case RIGHT:
if (x1 & 450) {
case DOWN:
if (y1 & 450) {
case BLANK:
/*按下空格键后放置棋子*/
if (chessman[x1 / 30][y1 / 30])
/*如果当前位置有棋子,不能放置,退出*/
step_sum++;
/*如果没有棋子,下一步谁走加1*/
* P1 设置棋子
if (step_sum % 2) {
setcolor(15);
/*画棋子*/
setfillstyle(SOLID_FILL, 15); /* 封闭图形,进行实体填充*/
circle(x1, y1, 10);
floodfill(x1, y1, 15);
/*填充圆*/
chessman[x1 / 30][y1 / 30] = PLAYER1;
/*设置棋盘状态*/
win_flag = win_or_not(x1, y1, 1, chessman, 0);
/*分析游戏是否结束,谁胜谁败*/
if (win_flag == 1)
outtextxy(480, 240, "P1 Win");
else if (win_flag == 3)
outtextxy(480, 240, "DOGFALL");
if (win_flag != 0) {
/*如果没人胜,游戏继续*/
while (bioskey(1) == 0);
closegraph();
/*what this mean?*/
} else { /* P2 设置棋子 */
setcolor(12);
setfillstyle(SOLID_FILL, 12);
circle(x1, y1, 10);
floodfill(x1, y1, 12);
chessman[x1 / 30][y1 / 30] = PLAYER2;
win_flag = win_or_not(x1, y1, 2, chessman, 0);
if (win_flag == 2)
outtextxy(480, 240, "P2 Win");
else if (win_flag == 3)
outtextxy(480, 240, "DOGFALL");
if (win_flag != 0) {
while (bioskey(1) == 0);
closegraph();
chessman[7][7] = COMPUTER;
/*人和电脑玩,电脑先走一步*/
setcolor(12);
setfillstyle(SOLID_FILL, 12);
circle(240, 240, 10);
floodfill(240, 240, 12);
flag_run = 0;
/*有什么用?*/
step_sum++;
/*下一步谁走?*/
while (1) {
while (1) {
if (flag_run == 1)
if (bioskey(1)) {
key = bioskey(0);
* 返回一个键盘值,如没有按键,则一直等待
switch (key) {
case LEFT:
if (x1 & 30) {
if (y1 & 30) {
case RIGHT:
if (x1 & 450) {
case DOWN:
if (y1 & 450) {
case BLANK:
if (chessman[x1 / 30 - 1][y1 / 30 - 1])
/*有棋子了不走*/
setcolor(15);
setfillstyle(SOLID_FILL, 15); /* 封闭图形,进行实体填充
circle(x1, y1, 10);
floodfill(x1, y1, 15);
/*画棋子*/
chessman[x1 / 30 - 1][y1 / 30 - 1] = PLAYER1;
flag_run = 1;
/*有什么用?*/
step_sum++;
/*下一步谁走*/
win_flag = win_or_not(x1, y1, 1, chessman, 0);
/*谁胜谁负*/
if (win_flag == 1)
outtextxy(480, 240, "P1 Win");
else if (win_flag == 3)
outtextxy(480, 240, "DOGFALL");
if (win_flag != 0) {
while (bioskey(1) == 0);
/*没有人胜则继续等待下棋*/
closegraph();
} /* switch */
computer();
/*调用智能体*/
* a,b存放的是现在电脑准备下的位置
* 返回一个a,b的结构体不是更好,用全局变量不爽啊
* struct {
setcolor(12);
setfillstyle(SOLID_FILL, 12);
circle(a, b, 10);
floodfill(a, b, 12);
chessman[a / 30 - 1][b / 30 - 1] = COMPUTER;
flag_run = 0;
step_sum++;
win_flag = win_or_not(a, b, 2, chessman, 0);
if (win_flag == 2)
outtextxy(480, 240, "ComputerWin");
else if (win_flag == 3)
outtextxy(480, 240, "DOGFALL");
if (win_flag != 0) {
while (bioskey(1) == 0);
closegraph();
* 画棋盘的过程
gdriver = DETECT,
registerbgidriver(EGAVGA_driver);
initgraph(&gdriver, &gmode, " ");
* 对显示适配器进行配置
setbkcolor(1);
for (i = 0; i & 30; i++) {
setcolor((i &= 2) ? 9 : i);
rectangle(i, i, 479 - i, 479 - i); /* 画矩形边框 */
for (i = 1; i & 14; i++)
for (j = 1; j & 14; j++) {
setcolor(14);
line(30 + 30 * i, 30, 30 + 30 * i, 449);
line(30, 30 + 30 * i, 449, 30 + 30 * i);
* 画整个图的边框
for (i = 0; i & 15; i++) {
setcolor(i);
rectangle(i, i, 640 - i, 480 - i);
line(480 - i, 15, 480 - i, 465);
* 输出屏幕右侧的信息
setcolor(4);
settextstyle(0, 0, 2);
outtextxy(500, 45, "GOBANG");
setcolor(10);
settextstyle(0, 0, 1);
outtextxy(500, 90, "Designed By");
outtextxy(514, 118, "Ye Binbin");
outtextxy(480, 140, "from class A of CS");
* 移动光标
setcolor(1);
if (oldx & 450) {
if (oldy & 30)
line(oldx + 7, oldy - 15, oldx + 15, oldy - 15);
if (oldy & 30)
line(oldx + 15, oldy - 15, oldx + 15, oldy - 7);
if (oldy & 450)
line(oldx + 15, oldy + 7, oldx + 15, oldy + 15);
if (oldy & 450)
line(oldx + 15, oldy + 15, oldx + 7, oldy + 15);
if (oldx & 30) {
if (oldy & 450)
line(oldx - 7, oldy + 15, oldx - 15, oldy + 15);
if (oldy & 450)
line(oldx - 15, oldy + 15, oldx - 15, oldy + 7);
if (oldy & 30)
line(oldx - 15, oldy - 7, oldx - 15, oldy - 15);
if (oldy & 30)
line(oldx - 15, oldy - 15, oldx - 7, oldy - 15);
setcolor(12);
if (x1 & 450) {
if (y1 & 30)
line(x1 + 7, y1 - 15, x1 + 15, y1 - 15);
if (y1 & 30)
line(x1 + 15, y1 - 15, x1 + 15, y1 - 7);
if (y1 & 450)
line(x1 + 15, y1 + 7, x1 + 15, y1 + 15);
if (y1 & 450)
line(x1 + 15, y1 + 15, x1 + 7, y1 + 15);
if (x1 & 30) {
if (y1 & 450)
line(x1 - 7, y1 + 15, x1 - 15, y1 + 15);
if (y1 & 450)
line(x1 - 15, y1 + 15, x1 - 15, y1 + 7);
if (y1 & 30)
line(x1 - 15, y1 - 7, x1 - 15, y1 - 15);
if (y1 & 30)
line(x1 - 15, y1 - 15, x1 - 7, y1 - 15);
oldx = x1;
oldy = y1;
set_chessman()
* 棋子有三种状态,0是未初始状态,1是控制方棋子,2是对方棋子
for (i = 0; i & 15; i++)
for (j = 0; j & 15; j++)
chessman[i][j] = 0;
* 0表示没有赢,1表示p1胜利,2表示p2胜利,3表示平局
win_or_not(int x0, int y0, int who, int chessman[LENGTH][LENGTH], int a)
i = x0 / 30 - 1,
j = y0 / 30 - 1;
line_sum = -1;
tmp_i = i,
if (a == 1) {
* 测试第一层扩展是否满足赢的条件
c = chessman[i][j];
chessman[i][j] = who_
while (1) {
/* 查找共行的棋子是否连接了五个 */
while (tmp_i &= 0 && line_sum != 4) {
if (chessman[tmp_i--][j] == who_run)
line_sum++;
if (line_sum == 4)
line_sum++;
while (tmp_i &= 15 && line_sum != 5) {
if (chessman[tmp_i++][j] == who_run)
line_sum++;
if (line_sum == 5) {
if (a == 1)
chessman[i][j] =
return who_
line_sum = -1;
while (1) {
/* 查找共列的棋子是否连接了五个 */
while (tmp_j &= 0 && line_sum != 4) {
if (chessman[i][tmp_j--] == who_run)
line_sum++;
if (line_sum == 4)
line_sum++;
while (tmp_j &= 15 && line_sum != 5) {
if (chessman[i][tmp_j++] == who_run)
line_sum++;
if (line_sum == 5) {
if (a == 1)
chessman[i][j] =
return who_
line_sum = -1;
while (1) {
/* 查找上对角线上是否连接了五个 */
while (line_sum != 4 && tmp_i &= 15 && tmp_j &= 0) {
if (chessman[tmp_i++][tmp_j--] == who_run)
line_sum++;
if (line_sum == 4)
line_sum++;
while (line_sum != 5 && tmp_i &= 0 && tmp_j &= 15) {
if (chessman[tmp_i--][tmp_j++] == who_run)
line_sum++;
if (line_sum == 5) {
if (a == 1)
chessman[i][j] =
return who_
line_sum = -1;
while (1) {
/* 查找下对角线上是否连接了五个 */
while (line_sum != 4 && tmp_i &= 0 && tmp_j &= 0) {
if (chessman[tmp_i--][tmp_j--] == who_run)
line_sum++;
if (line_sum == 4)
line_sum++;
while (line_sum != 5 && tmp_i &= 15 && tmp_j &= 15) {
if (chessman[tmp_i++][tmp_j++] == who_run)
line_sum++;
if (line_sum == 5) {
if (a == 1)
chessman[i][j] =
return who_
if (step_sum == 225) {
if (a == 1)
chessman[i][j] =
if (a == 1)
chessman[i][j] =
score_row(int i, int j, int chessman[LENGTH][LENGTH])
sum_chessmen = 0;
score = 0;
who_running = chessman[i][j];
if (j == LENGTH) {
while (chessman[i][j] == who_running) {
sum_chessmen++;
if (sum_chessmen &= 5)
score = 200000;
if (chessman[i][j] == 0) /* 没有下子,活的情况 */
score = 2000 / POW(10, 4 - sum_chessmen);
score = 0; /* 死的情况 */
while (chessman[i][j] == who_running && j != LENGTH) {
sum_chessmen++;
j = j - sum_chessmen - 1;
while (chessman[i][j] == who_running && j != -1) {
sum_chessmen++;
if (j &= 0 && mid_j & LENGTH) {
if (chessman[i][j] == 0 && chessman[i][mid_j] == 0)
score = 18000 / POW(50, 4 - sum_chessmen);
else if ((chessman[i][j] != 0 && chessman[i][mid_j] == 0)
|| (chessman[i][j] == 0 && chessman[i][mid_j] != 0))
score = 2000 / POW(10, 4 - sum_chessmen);
score = 0;
if (j & 0 && mid_j & LENGTH) {
if (chessman[i][mid_j] == 0)
score = 2000 / POW(10, 4 - sum_chessmen);
score = 0;
if (j &= 0 && mid_j &= LENGTH) {
if (chessman[i][j] == 0)
score = 2000 / POW(10, 4 - sum_chessmen);
score = 0;
if (j & 0 && mid_j &= LENGTH)
score = 0;
score_col(int i, int j, int chessman[LENGTH][LENGTH])
sum_chessmen = 0,
score = 0;
who_running = chessman[i][j];
if (i == LENGTH) {
while (chessman[i][j] == who_running) {
sum_chessmen++;
if (sum_chessmen &= 5)
score = 200000;
if (chessman[i][j] == 0)
score = 2000 / POW(10, 4 - sum_chessmen);
score = 0;
while (chessman[i][j] == who_running) {
sum_chessmen++;
if (i == LENGTH || chessman[i][j] != who_running) {
i = i - sum_
while (chessman[i - 1][j] == who_running) {
sum_chessmen++;
if (i &= 0) {
if (chessman[i][j] == 0 && chessman[mid_i][j] == 0)
score = 18000 / POW(50, 4 - sum_chessmen);
else if ((chessman[i][j] != 0 && chessman[mid_i][j]) == 0
|| (chessman[i][j] == 0
&& chessman[mid_i][j] != 0))
score = 2000 / POW(10, 4 - sum_chessmen);
score = 0;
if (i & 0 && mid_i & LENGTH) {
if (chessman[mid_i][j] == 0)
score = 2000 / POW(10, 4 - sum_chessmen);
score = 0;
if (i & 0 && mid_i & LENGTH) {
if (chessman[mid_i][j] == 0)
score = 2000 / POW(10, 4 - sum_chessmen);
score = 0;
if (i &= 0 && mid_i &= LENGTH) {
if (chessman[i][j] == 0)
score = 2000 / POW(10, 4 - sum_chessmen);
score = 0;
score_diag_45(int i, int j, int chessman[LENGTH][LENGTH])
sum_chessmen = 0;
score = 0;
who_running = chessman[i][j];
if (i == LENGTH || j == LENGTH) {
while (chessman[i][j] == who_running && i & 1 && j & 1) {
sum_chessmen++;
if (sum_chessmen &= 5)
score = 200000;
if (chessman[i][j] == 0)
score = 2000 / POW(10, 4 - sum_chessmen);
score = 0;
while (chessman[i][j] == who_running && i &= LENGTH && j &= LENGTH) {
sum_chessmen++;
i = i - sum_
j = j - sum_
while (chessman[i - 1][j - 1] == who_running) {
sum_chessmen++;
if (sum_chessmen &= 5)
score = 200000;
if (i &= 0 && j &= 0 && mid_i & LENGTH && mid_j & LENGTH) {
if (chessman[mid_i][mid_j] == 0 && chessman[i][j] == 0)
score = 18000 / POW(50, 4 - sum_chessmen);
else if ((chessman[mid_i][mid_j] == 0 && chessman[i][j] != 0)
|| (chessman[mid_i][mid_j] != 0
&& chessman[i][j] == 0))
score = 2000 / POW(10, 4 - sum_chessmen);
score = 0;
if (i &= 0 && j &= 0) {
if (chessman[i][j] == 0)
score = 2000 / POW(10, 4 - sum_chessmen);
score = 0;
} else if (mid_i & LENGTH && mid_j & LENGTH) {
if (chessman[mid_i][mid_j] == 0)
score = 2000 / POW(10, 4 - sum_chessmen);
score = 0;
score = 0;
score_diag_135(int i, int j, int chessman[LENGTH][LENGTH])
sum_chessmen = 0;
score = 0;
who_running = chessman[i][j];
while (chessman[i][j] == who_running && j != -1 && i & LENGTH) {
sum_chessmen++;
while (chessman[i][j] == who_running && j != LENGTH) {
sum_chessmen++;
if (sum_chessmen &= 5)
score = 200000;
if (i &= 0 && j & LENGTH && mid_j &= 0 && mid_i & LENGTH) {
if (chessman[i][j] == 0 && chessman[mid_i][mid_j] == 0)
score = 18000 / POW(50, 4 - sum_chessmen);
if ((chessman[i][j] == 0 && chessman[mid_i][mid_j] != 0)
|| (chessman[i][j] != 0
&& chessman[mid_i][mid_j] == 0))
score = 2000 / POW(10, 4 - sum_chessmen);
score = 0;
if (i &= 0 && j & LENGTH) {
if (chessman[i][j] == 0)
score = 2000 / POW(10, 4 - sum_chessmen);
score = 0;
if (mid_j &= 0 && mid_i & LENGTH) {
if (chessman[mid_i][mid_j] == 0)
score = 2000 / POW(10, 4 - sum_chessmen);
score = 0;
total_score(int who_running, int chessman[LENGTH][LENGTH])
* 统计出在该点上的得分,who_running=1表示人的棋子,2为电脑的棋子
score = 0;
for (i = 0; i & LENGTH; i++)
for (j = 0; j & LENGTH; j++) {
if (chessman[i][j] == who_running) {
score += score_row(i, j, chessman);
score += score_col(i, j, chessman);
score += score_diag_45(i, j, chessman);
score += score_diag_135(i, j, chessman);
score(int chessman[LENGTH][LENGTH])
* 计算最终的得分数,分别考虑了在这个位置放对方棋子跟自己棋子的综合
sum1 = total_score(COMPUTER, chessman);
sum2 = total_score(PLAYER1, chessman);
return sum1 - sum2;
* 扩展-----剪枝过程
rowdt(int i, int j, int chessman[LENGTH][LENGTH])
/*在树直方向*/
midjl = j - STEP,
/*当前棋子的上方*/
midjr = j + STEP + 1;
/*当前棋子的下方棋子的下方??????*/
if (midjl & 0)
midjl = 0;
if (midjr & LENGTH)
midjr = LENGTH;
for (k = k & k++)
if (chessman[i][k] != 0)
/*如果有棋子*/
coldt(int i, int j, int chessman[LENGTH][LENGTH])
/*水平方向*/
midil = i + STEP + 1,
/*当前的右边棋子的右一个*/
midiu = i - STEP;
/*当前棋子的左一个*/
if (midiu & 0)
midiu = 0;
if (midil & LENGTH)
midil = LENGTH;
for (k = k & k++)
if (chessman[k][j] != 0)
diadt(int i, int j, int chessman[LENGTH][LENGTH])
/*右上到左下方向*/
for (k = 0; k & STEP; k++) {
if (midj & 0 || midi &= LENGTH)
if (chessman[midi][midj] != 0)
for (k = 0; k & STEP; k++) {
if (i & 0 || j &= LENGTH)
if (chessman[i][j] != 0)
vdiadt(int i, int j, int chessman[LENGTH][LENGTH])
/*左上到右下方向*/
for (k = 0; k & STEP; k++) {
if (midi & 0 || midj & 0)
if (chessman[midi][midj] != 0)
for (k = 0; k & STEP; k++) {
if (j &= LENGTH || i &= LENGTH)
if (chessman[i][j] != 0)
can_expand(int i, int j, int chessman[LENGTH][LENGTH])
if (rowdt(i, j, chessman))
if (coldt(i, j, chessman))
if (diadt(i, j, chessman))
if (vdiadt(i, j, chessman))
* 如果不能扩展,返回0
/************************************************************/
您可能感兴趣的文章:
大家感兴趣的内容
12345678910
最近更新的内容
常用在线小工具想请教一下如何用python编一个五子棋小游戏。_五子棋吧_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0可签7级以上的吧50个
本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:33,201贴子:
想请教一下如何用python编一个五子棋小游戏。
用键盘或者鼠标操作都可以。希望可以有完整代码借鉴一下,谢谢。
闲来无事,刚开学两天,...
如题,刚学完C程序设计...
吴邪病了,张起灵出门买...
有趣的故事分享才有意义...
0岁,女孩出生 他爸在她...
京东五子棋热销中!每日团购,新书速度!买新款超好的书籍就在京东书城!做一个读书人!读书,爱书,藏书!京东带您环游书海!
左拐Python吧
贴吧热议榜
使用签名档&&
保存至快速回贴鹰之眸 的BLOG
用户名:鹰之眸
访问量:169
注册日期:
阅读量:5863
阅读量:12276
阅读量:353848
阅读量:1051454
51CTO推荐博文
一、问题概述五子棋又称FIR(Five in a &row )。意思是连续五个棋子在一条线上。这是一种两方对弈形式的一种益智游戏。任何一方都可以选择先开局、悔棋、重新开局和退出的基本功能游戏。获胜的标准就是任何一方先达到五个连续的棋子在一条线(包括横线、直线或者斜线)上。二、需求分析和流程设计1、需求分析人人对战五子棋主要的需求包括:(1)界面友好易于操作。(2)选择合适的控制结构、控制玩家轮流下棋。(3)动态地生成黑白棋子。(4)添加简单的悔棋、重新开始等基本功能。(5)判断输赢。2、流程图设计三、软件开发模型采用边做边改模型原因如下:1、程序设计功能相对简单。2、程序开发周期短。3、程序设计开发难度低。基于上述几点,本程序采用边做边改的模型,有助于减少设计阶段的代价。四、功能模块化设计。(1)、良好的界面设计为了给用户一个友好的游戏界面设计,直接关系到用户的体验,所以一个良好的合适的游戏界面设计是一个非常重要的第一步。这一步我利用java语言中Graphics画出简洁大方的五子棋棋盘界面。代码设计:利用Graphics中的drawLine方法分别画出行和列的网格形状。背景图片利用常用棋盘添加到面板中。 for (int i = 0; i &= R i++)g.drawLine(Margin, Margin + i * Grid_Span, Margin + Cols* Grid_Span, Margin + i * Grid_Span);for (int j = 0; j &= C j++)g.drawLine(Margin + j*Grid_Span, Margin, Margin + j * Grid_Span,Margin + Rows * Grid_Span);(2)、画出形象的黑白棋子同样用Graphics2D方法在棋盘上画出棋子,棋子落在网格交叉点上.即棋子落下的坐标。代码设计: &int xPos=chessList[i].getX()*Grid_Span+M//获得棋子落下额坐标 & int yPos=chessList[i].getY()*Grid_Span+M & g.setColor(chessList[i].getColor());//设置颜色 & colortemp=chessList[i].getColor(); & if(colortemp==Color.black){ & & & & & & & & RadialGradientPaint paint = new RadialGradientPaint(xPos-Point.Diameter/2+25, yPos-Point.Diameter/2+10, 20, new float[]{0f, 1f} & & & & & & & & , new Color[]{Color.WHITE, Color.BLACK}); & & & & & & & & ((Graphics2D) g).setPaint(paint); & & & & & & & & ((Graphics2D) g).setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); & & & & & & & & ((Graphics2D) g).setRenderingHint(RenderingHints.KEY_ALPHA_INTERPOLATION, RenderingHints.VALUE_ALPHA_INTERPOLATION_DEFAULT); & & & & & & } & & & & & & else if(colortemp==Color.white){ & & & & & & & & RadialGradientPaint paint = new RadialGradientPaint(xPos-Point.Diameter/2+25, yPos-Point.Diameter/2+10, 70, new float[]{0f, 1f} & & & & & & & & , new Color[]{Color.WHITE, Color.BLACK}); & & & & & & & & ((Graphics2D) g).setPaint(paint); & & & & & & & & ((Graphics2D) g).setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); & & & & & & & & ((Graphics2D) g).setRenderingHint(RenderingHints.KEY_ALPHA_INTERPOLATION, RenderingHints.VALUE_ALPHA_INTERPOLATION_DEFAULT); & & & & & & }(3)、判断输赢判断输赢是五子棋里面最核心的部分。五子相连算法有很多种类。这里采用用的是从8个方位进行遍历的来判断五子是否相连。这八个方位即东、东南、西、西南、南、北、西北、东北。代码设计:建一个棋子类Point ,在该类中创建一个color属性,便于算法在遍历的时候根据颜色进行相应的统计。不会出现统计混乱。private C遍历算法主要根据鼠标点击的后,获得棋子的坐标,然后根据棋子的坐标进行8个方位的遍历,只要其中一个遍历成功。就会退出遍历(在下棋中有可能会出现一个子会出现两条五子两连的情况)。这样将有利于算法的效率提高。其中一个方向的遍历代码设计: for(int x=xIndex-1;x&=0;x--){ & Color c=isBlack?Color.black:Color. & if(getChess(x,yIndex,c)!=null){ & continueCount++; & }else & & }(4)、悔棋功能这里需要借助一个棋子数组chessLsit。chesslist用来统计一共有多少以下棋子,每当悔一步棋时,就从chesslist减掉一个棋子。因为这里的chesslist采用的是先进后出的数据结构。所以每次减掉棋子都是最新下的棋子。减掉棋子的将会要求重新下棋。代码设计: & if(chessCount==0) & & chessList[chessCount-1]= & chessCount--; & if(chessCount&0){ & xIndex=chessList[chessCount-1].getX(); & yIndex=chessList[chessCount-1].getY(); & } & isBlack=!isB & repaint();五、测试和运行结果测试平台:windows+myeclipse10测试结果如下图:本文出自 “” 博客,转载请与作者联系!
了这篇文章
类别:未分类┆阅读(0)┆评论(0)

我要回帖

更多关于 python 五子棋 的文章

 

随机推荐