首先介绍一下三子棋游戏规则:这是一个玩家和电脑对战的三子棋游戏;
棋盘如上图所示,三个棋子连在一起则胜利;下面就是用c语言实现的方法;
创建棋盘:利用二维数组来实现一个棋盘,棋盘刚开始是没有任何棋子的,将二维数组所有元素初始化为空格即可;
玩家下棋:玩家输入棋盘中的对应坐标来下棋,下棋时需要考虑输入坐标合法性,输入坐标是否被下;若满足坐标合法,坐标未被下子,这个坐标放入棋子;若不满足,重新输入坐标直至正确为止;
电脑下棋:电脑下棋可以自己设置难度;比如,遍历棋盘找到未被下子的位置就放入棋子;本程序中电脑下棋是随机产生坐标,需要判断随机产生的坐标是否被下,若这个坐标已有棋子,重新产生随机数直至找到没有棋子的坐标,在电脑下棋之前还需要判断一下棋盘是否被下满的情况;
判断输赢:赢的情况有以下几种:判断以下几种情况即可;平局的情况要放在最后一个判断;
程序代码:
game.h
#define _CRT_SECURE_NO_DEPRECATE
#ifndef __GAME_H__
#define __GAME_H__
#define ROWS 3
#define COLS 3
enum
{
EXIT,
PLAY
};
void init_board(char board[ROWS][COLS],int rows,int cols); //初始化棋盘
void print_board(char board[ROWS][COLS], int rows, int cols); //打印棋盘
void play_game(char board[ROWS][COLS], int rows, int cols); //开始玩游戏
char who_win(char board[ROWS][COLS]); //判断输赢
void player_move(char board[ROWS][COLS]); //玩家走
void menu(); //菜单
void computer_move(char board[ROWS][COLS]); //电脑走
int is_full(char board[ROWS][COLS]); //判断棋盘是否已满
#endif //__GAME_H__
test.c
#define _CRT_SECURE_NO_DEPRECATE
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include "game.h"
game()
{
int choose = 0;
char board[ROWS][COLS];
do
{
init_board(board,ROWS,COLS);
srand((unsigned int )time(NULL));
menu();
printf("请输入选择:");
scanf("%d",&choose);
switch (choose)
{
case PLAY:
print_board(board, ROWS, COLS);
play_game(board, ROWS, COLS);
break;
case EXIT :
exit(0);
}
} while (choose);
}
game.c
#define _CRT_SECURE_NO_DEPRECATE
#include <stdio.h>
#include <windows.h>
#include "game.h"
void menu()
{
printf("*******************************\n");
printf("******* 三子棋 ***********\n");
printf("******* 1.play ***********\n");
printf("******* 0.exit ***********\n");
printf("*******************************\n");
}
void init_board(char board[ROWS][COLS], int rows, int cols)
{
int i = 0;
int j = 0;
for (i = 0; i < rows;i++) //遍历二维数组
{
for (j = 0; j < cols;j++)
{
board[i][j] = ' '; //二维数组所有元素初始化为空格;
}
}
}
void print_board(char board[ROWS][COLS], int rows, int cols)
{
int i = 0;
for (i = 0; i < rows; i++)
{
printf(" %c | %c | %c\n", board[i][0], board[i][1], board[i][2]);
if (i !=2 )
printf("---|---|---\n");
}
}
char who_win(char board[ROWS][COLS])
{
int i = 0;
int j = 0;
for (i = 0; i < ROWS;i++)
{
if ((board[i][0] == board[i][1]) && (board[i][1] == board[i][2]) && (board[i][1] != ' ') )
{
return board[i][1];
}
if ((board[0][i] == board[1][i]) && (board[1][i] == board[2][i]) && (board[1][i] != ' '))
{
return board[1][i];
}
}
if ((board[0][0] == board[1][1]) && (board[2][2] == board[1][1]) && (board[1][1] != ' '))
{
return board[1][1]; //返回那个字符代表哪一方赢
}
if ((board[0][2] == board[1][1]) && (board[2][0] == board[1][1]) && (board[1][1] != ' '))
{
return board[1][1];
}
if (is_full(board) == 1)
{
return 'q'; //字符q代表为平局;
}
}
void play_game(char board[ROWS][COLS], int rows, int cols)
{
char ret;
while (1)
{
player_move(board);
ret = who_win(board); //判断输赢
if (ret == '0' || ret == 'X' || ret == 'q')
{
break;
}
computer_move(board);
ret = who_win(board); //判断输赢
if (ret == '0' || ret == 'X' || ret == 'q')
{
break;
}
}
if (ret == '0')
{
printf("电脑赢\n");
}
else if (ret == 'X')
{
printf("玩家赢\n");
}
else
{
printf("平局\n");
}
}
void player_move(char board[ROWS][COLS])
{
int x = 0;
int y = 0;
while (1)
{
printf("请输入坐标:");
scanf("%d %d", &x, &y);
if ((x > 0 && x<=ROWS) && (y > 0 && y<= COLS)) //判断输入是否合法
{
if (board[x-1][y-1] == ' ') //判断坐标位置是否被占
{
board[x-1][y-1] = 'X';
print_board(board, ROWS, COLS);
break;
}
if (board[x - 1][y - 1] != ' ')
{
printf("坐标被下\n");
}
}
else
{
printf("坐标不合法\n");
}
}
}
int is_full(char board[ROWS][COLS]) //判断棋盘是否已满
{
int i = 0;
int j = 0;
//int count = 0;
for (i = 0; i <ROWS; i++) //遍历二维数组
{
for (j = 0; j < COLS; j++)
{
if (board[i][j] == ' ')
{
return 0;
}
}
}
return 1;
}
void computer_move(char board[ROWS][COLS])
{
int x = 0;
int y = 0;
if (is_full(board) == 1) //若满了,直接结束;
{
return;
}
while (1) //直至电脑完成下棋子结束循环;
{
x = rand() % 3;
y = rand() % 3;
if (board[x][y] == ' ')
{
board[x][y] = '0';
printf("电脑:\n");
Sleep(1000);
print_board(board, ROWS, COLS);
break;
}
}
}
平局示例:
玩家赢示例:
电脑赢示例: