使用C语言写一个三子棋

1.游戏开始界面

void menu()
{printf("**********************\n");printf("** 1.play    0.exit **\n");printf("**********************\n");}

}

2.游戏具体逻辑

void game()
{//存储数据 - 二维数组char board[ROW][COL];//初始化棋盘 - 初始化空格inboard(board, ROW, COL);//ROW COL 为棋盘的长和宽,在这里不直接使用3和3是因为便于修改棋盘//打印一下棋盘 - 本质是打印数组的内容displayboard(board, ROW, COL);char ret = 0;//接受游戏状态while (1){//玩家下棋playermove(board, ROW, COL);displayboard(board, ROW, COL);//判断玩家是否赢得游戏ret = Iswin(board, ROW, COL);if (ret != 'C')break;//电脑下棋computermove(board, ROW, COL);displayboard(board, ROW, COL);//判断电脑是否赢得游戏ret = Iswin(board, ROW, COL);if (ret != 'C')break;}if (ret == '*'){printf("玩家赢了\n");}else if (ret == '#'){printf("电脑赢了\n");}else{printf("平局\n");}}

3.打印开始界面,并选择是否进入游戏

void test()
{int input;//使用srand生成随机数srand((unsigned int)time(NULL));do{menu();printf("请选择>");scanf("%d", &input);switch (input){//选择1进入游戏。case 1:game();break;case 0:printf("退出游戏\n");break;default:printf("输入有误,请重新输入\n");break;}} while (input);}

4.棋盘的初始化

void inboard(char board[ROW][COL], int row, int col)
{int i = 0;int j = 0;for (i = 0; i < row; i++){for (j = 0; j < col; j++){board[i][j] = ' ';}}
}

5.打印棋盘的分隔符

void displayboard(char board[ROW][COL], int row, int  col)
{int i = 0;for (i = 0; i < row; i++){int j = 0;for (j = 0; j < col; j++){printf(" %c ", board[i][j]);if (j < col - 1)printf("|");}printf("\n");//打印分隔符if (i < row - 1){for (j = 0; j < col; j++){printf("---");if (j < col - 1)printf("|");}printf("\n");}}
}

6.打印出的棋盘

7. 玩家与电脑相互的落子

void playermove(char board[ROW][COL],int  row,int  col)
{int x = 0;int y = 0;while (1){printf("玩家走>\n");printf("请输入要下的坐标:>");scanf("%d %d", &x, &y);//判断输入坐标的合法性//x和y减一的意思是,数组为0 0的位置,玩家实际看到的坐标为1 1if (x >= 1 && x <= row && y >= 1 && y <= col){if (board[x - 1][y - 1] == ' '){  //代表如果棋盘具体坐标未落子,便在该坐标落下*board[x - 1][y - 1] = '*';break;}else{printf("该坐标已被占用!请重新输入\n");}}else{printf("坐标非法!\n");}}
}
void computermove(char board[ROW][COL], int row, int col)
{int x = 0;int y = 0;printf("电脑走>\n");//循环的意义为,如果电脑随机数的坐标被占用,则重新生成一个随机数,while (1){//将生成的随机数和棋盘的长和宽求余,获得坐标x = rand() % row;y = rand() % col;if (board[x][y] == ' '){//与玩家落子逻辑相同board[x][y] = '#';break;}}
}

 8.判断游戏是否获胜

//这里仅列举3*3棋盘的获胜判断(其余情况我不会)
char Iswin(char board[ROW][COL], int row, int col){//横三行int i = 0;for (i = 0; i < row; i++){if (board[i][0] == board[i][1] && board[i][1] == board[i][2] && board[i][0] != ' '){return board[i][1];}}//竖三列for (i = 0; i < col; i++){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[1][1] == board[2][2] && board[1][1] != ' '){return board[1][1];}if (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[1][1] != ' '){return board[1][1];}//判断是否平局int ret = IsFull(board, ROW, COL);if (ret == 1)return 'Q';return 'C';}

 9.判断棋盘是否下满

//返回0代表棋盘未满,返回1代表棋盘已满
int  IsFull(char board[ROW][COL], int row, int col)
{int i = 0;int  j = 0;for (i = 0; i < row; i++){for (j = 0; j < col; j++){if (board[i][j] == ' ')return 0;}}return 1;
}

10.函数头文件

#include
#include
#include
#define ROW 3
#define COL 3
void inboard(char board[ROW][COL], int row, int col);
void displayboard(char board[ROW][COL], int row, int  col);
void playermove(char board[ROW][COL], int row, int col);
void computermove(char board[ROW][COL],int row,int col);
char Iswin(char board[ROW][COL], int row, int col);
int  IsFull(char board[ROW][COL], int row, int col);
//判断四种状态:
//1.玩家胜利----'*'
//2.电脑获胜----'#'
//3.平局    ----'Q'
//4.继续    ----'C'

11.函数具体运行

//test函数在上方
int main()
{test();return 0;
}

 

 

 


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部