当前位置:首页 > 五金新闻 > 正文内容

C语言编对角棋,三连棋

访客11个月前 (06-13)五金新闻26

各个平台房卡都有添加客服微信:87372223

// 这是前两天刚帮人家写的,在5*5棋盘上,连成4子算赢。你自己看看代码改下好了。
// 自己编译了先跑跑看。然后试着理解代码,改成你要的样子。如果只要答案,自己不去看。
// 那怎么能学会编程呢。

#include
#include
#include // for srand((unsigned int)time(NULL))
/*===================================================================
* CONSTANTS
*/
#define BOARD_ROWS 5
#define BOARD_COLS 5
#define CONTINOUS_TO_WIN 4
#define CELL_MARK_EMPTY ' '
#define CELL_MARK_X 'X'
#define CELL_MARK_O 'O'
#define GAME_MODE_PVP 0 /* Player vs Player */
#define GAME_MOVE_PVC 1 /* Player vs Computer */
/*===================================================================
* FUNCTIONS PROTOTYPE
*/
static void init_board(void);
static void select_game_mode(void);
static void show_board(void);
static void take_move(int cell_mark);
static void player_move(int cell_mark);
static void computer_move(int cell_mark);
static int judge(int last_x, int last_y, int last_cell_mark);
static int is_board_full(void);
/*===================================================================
* VARIABLES
*/
int board[BOARD_ROWS][BOARD_COLS];
int game_mode = GAME_MODE_PVP;
int computer_mark = CELL_MARK_X; /* Only PvC mode use this */
/* Keep track of last move */
int last_r;
int last_c;
int last_mark;
/*===================================================================
* FUNCTIONS IMPLEMENTATIONS
*/
/**
* Initialize all cells of board as empty
*/
void init_board(void)
{
int r;
int c;
for (r = 0; r for (c = 0; c board[r][c] = CELL_MARK_EMPTY;
}
/**
* Let the user select game mode
*/
void select_game_mode(void)
{
int c;
printf(Select game mode: 1. PvP 2. PvCn);
while (1) {
scanf(%d, &c);
/**
* we acquire an integer, and if the user type a char,
* such as ‘a’, will cause a panic. So we need flush stdin.
*/
fflush(stdin);
if (c == 1 || c == 2) {
game_mode = (c == 1 ? GAME_MODE_PVP : GAME_MOVE_PVC);
printf(You have selected %s moden,
c == 1 ? PvP : PvC);
break;
} else {
printf(Illegal input! Try again...n);
}
}
if (game_mode == GAME_MODE_PVP)
return;
printf(Who will take the first move: 1. Player 2. Computern);
while (1) {
scanf(%d, &c);
fflush(stdin);
if (c == 1 || c == 2) {
printf(%s will take the first moven,
c == 1 ? Player : Computer);
computer_mark = (c == 1 ? CELL_MARK_O : CELL_MARK_X);
break;
} else {
printf(Illegal input! Try again...n);
}
}
}
/**
* Display board on console
*/
void show_board(void)
{
int r;
int c;
for (r = 0; r for (c = 0; c printf( %c , board[r][c]);
if (c printf(|);
}
printf(n);
if (r printf(-------------------n);
}
}
/**
* Decide it's Player's or Computer's turn to make a move
*/
void take_move(int cell_mark)
{
if (game_mode == GAME_MOVE_PVC && computer_mark == cell_mark)
/* computer take move */
computer_move(cell_mark);
else
/* player take move */
player_move(cell_mark);
}
/**
* Let the player to input coordinate to make a move
*/
void player_move(int cell_mark)
{
int r;
int c;
printf(Player %c move, please input coordinate (such as 0, 0)n,
cell_mark);
while (1) {
scanf(%d, %d, &r, &c);
fflush(stdin);
if (r BOARD_ROWS -1
|| c BOARD_COLS - 1) {
printf(Illegal coordinate (valid row/col is 0-4),
Try again...n);
} else if (board[r][c] != CELL_MARK_EMPTY) {
printf(Cell(%d, %d) is not empty! Try again...n, r, c);
} else {
board[r][c] = cell_mark;
last_r = r;
last_c = c;
last_mark = cell_mark;
break;
}
}
}
/**
* Use simple AI (according to document) to make a move
*/
void computer_move(int cell_mark)
{
int r;
int c;
int op_cell_mark;
// a
for (r = 0; r for (c = 0; c if (board[r][c] == CELL_MARK_EMPTY) {
if (judge(r, c, cell_mark) == 1) {
board[r][c] = cell_mark;
last_r = r;
last_c = c;
last_mark = cell_mark;
printf(Computer %c took (%d, %d)n,
last_mark, last_r, last_c);
return;
}
}
}
}
// b
op_cell_mark =
(cell_mark == CELL_MARK_O) ? CELL_MARK_X : CELL_MARK_O;
for (r = 0; r for (c = 0; c if (board[r][c] == CELL_MARK_EMPTY) {
if (judge(r, c, op_cell_mark) == 1) {
board[r][c] = cell_mark;
last_r = r;
last_c = c;
last_mark = cell_mark;
printf(Computer %c took (%d, %d)n,
last_mark, last_r, last_c);
return;
}
}
}
}
// !(a & b), take a random move
srand((unsigned int)time(NULL));
while (1) {
r = rand() % 5;
c = rand() % 5;
if (board[r][c] == CELL_MARK_EMPTY) {
board[r][c] = cell_mark;
last_r = r;
last_c = c;
last_mark = cell_mark;
printf(Computer %c took (%d, %d)n,
last_mark, last_r, last_c);
return;
}
}

}
/**
* judge if last move bring us a winner, return 1 on true
* Note!: Our simple AI use this function to decide how to play
*/
int judge(int last_r, int last_c, int last_cell_mark)
{
int r;
int c;
int continuous_count;
// row
continuous_count = 1;
r = last_r;
for (c = last_c - 1; c >= 0; --c) {
if (board[r][c] == last_cell_mark)
++continuous_count;
else
break;
}
for (c = last_c + 1; c if (board[r][c] == last_cell_mark)
++continuous_count;
else
break;
}
if (continuous_count >= CONTINOUS_TO_WIN)
return 1;
// col
continuous_count = 1;
c = last_c;
for (r = last_r - 1; r >=0; --r) {
if (board[r][c] == last_cell_mark)
++continuous_count;
else
break;
}
for (r = last_r + 1; r if (board[r][c] == last_cell_mark)
++continuous_count;
else
break;
}
if (continuous_count >= CONTINOUS_TO_WIN)
return 1;
// diagonal
continuous_count = 1;
for (r = last_r - 1, c = last_c - 1; r >= 0, c >=0; --r, --c) {
if (board[r][c] == last_cell_mark)
++continuous_count;
else
break;
}
for (r = last_r + 1, c = last_c + 1;
r if (board[r][c] == last_cell_mark)
++continuous_count;
else
break;
}
if (continuous_count >= CONTINOUS_TO_WIN)
return 1;
continuous_count = 1;
for (r = last_r + 1, c = last_c - 1;
r = 0; ++r, --c) {
if (board[r][c] == last_cell_mark)
++continuous_count;
else
break;
}
for (r = last_r - 1, c = last_c + 1;
r >= 0, c if (board[r][c] == last_cell_mark)
++continuous_count;
else
break;
}
if (continuous_count >= CONTINOUS_TO_WIN)
return 1;

// last move didn't bring us a winner
return 0;
}
/**
* judge if the board is full
*/
int is_board_full(void)
{
int r;
int c;
for (r = 0; r for (c = 0; c if (board[r][c] == CELL_MARK_EMPTY)
return 0;
}
}
return 1;
}
/*===================================================================
* MAIN FUNCTION
*/
int main(int argc, char **argv)
{
int current_mark = CELL_MARK_X;
select_game_mode();
init_board();
while (1) {
take_move(current_mark);
show_board();

if (judge(last_r, last_c, last_mark) == 1) {
printf(%c is a Winner!n, last_mark);
break;
}
// all full
if (is_board_full() == 1) {
printf(Board is full! Draw Game!n);
break;
}
current_mark =
(current_mark == CELL_MARK_X ? CELL_MARK_O : CELL_MARK_X);
}
return 0;
}

扫描二维码推送至手机访问。

版权声明:本文由闯荡动力五金网发布,如需转载请注明出处。

本文链接:http://kqhlw.com/wujingxinwen/35808.html

分享给朋友:

相关文章

五金网上销售平台官网(五金网上销售平台官网下载)

五金网上销售平台官网(五金网上销售平台官网下载)

一、网上报警平台官网网上110报警网站是http://m.mps.gov.cn/。在不宜使用电话语音报警的情况下,除了短信报警平台,市民还可以通过手机APP上传图片、小视频报警。二、社保网上如何缴费平台官网?个人缴费可以实现网上,手机上办理...

关于梦寻互娱大厅房卡如何购买(2023大厅房卡已更新)

关于梦寻互娱大厅房卡如何购买(2023大厅房卡已更新)

现今,越来越多的人开始关注互联网游戏,尤其是手游,在这个日新月异的世界中,梦寻互娱成为了最近最火爆的一款游戏。它采用现代化的游戏引擎技术,拥有美妙的音乐、精致的画面和独特的玩法,深受广大玩家的喜欢和追捧。在游戏中,玩家需要购买房卡才能进行游...

百得胜衣柜怎么样?求高手解答

百得胜衣柜怎么样?求高手解答

“女人的衣柜彰显着生活的品味”,作为女性的私人空间,定制衣柜从一个侧面表达了女性对于生活的追求,而一款样式新颖、物美价廉的定制衣柜也是很多人追求的对象,随着定制家具的流行,很多人选择采用定制衣柜,下面就随着王师傅了解下在选购定制衣柜的时候需...

五金宣传单(五金宣传单如何设计)

五金宣传单(五金宣传单如何设计)

一、宣传单量词?量词:张一张宣传单。宣传单(Leaflets)又称宣传单页,是商家为其宣传自己的一种印刷品,一般为单张双面印刷或单面印刷,单色或多色印刷,材质有传统的铜版纸,和现在流行的餐巾纸。传单一般分为两大类,一类是主要作用是推销产品、...

通常所说的社会福利的五金包含哪几项内容呀

通常所说的社会福利的五金包含哪几项内容呀

养老、失业、工伤、医疗、生育五项 就是 所谓的社会福利。还有一个是住房公积金,应该不能算到站里面。。。你可以去 当地 的 社会保险信息网上去看看 。。。...

汽车仪表盘上显示扳手是什么意思

汽车仪表盘上显示扳手是什么意思

一、汽车仪表盘上显示扳手是什么意思 仪表盘里出现扳手的问题其实很正常,这是仪表的保养提示,当车辆行驶里程或时间达到设定的保养要求的时候,这个小扳手就会出现,你保养以后把这个保养提示复位一下就可以了。 其实我们自己也可以进行一个机油提示灯的复...