赞
踩
这里写出game.c中所有的函数:
1.void init_board 将数组中的元素初始化为空格,即' '
2.void display_board 打印出棋盘
3.void player_move 玩家下棋
4.void computer_move 电脑下棋
5.char is_win 判断谁赢
6.static int is_full 在game.c文件中用到的一个内部函数
game.h
- #pragma once
- #define ROW 3
- #define COL 3
-
- #include <stdio.h>
- #include <stdlib.h>
- #include <time.h>
- //初始化棋盘
- void init_board(char board[ROW][COL], int row, int col);
-
- //打印棋盘
- void display_board(char board[ROW][COL], int row, int col); //这只是这个函数的声明,实现在game.c中实现
-
- //玩家下棋
- void player_move(char board[ROW][COL], int row, int col);
-
- //电脑下棋
- void computer_move(char board[ROW][COL], int row, int col);
-
- //判断游戏状态
- char is_win(char board[ROW][COL], int row, int col);
![](https://csdnimg.cn/release/blogv2/dist/pc/img/newCodeMoreWhite.png)
test.c
- #define _CRT_SECURE_NO_WARNINGS 1
- //三子棋
- //test.c 测试三子棋游戏 main函数在这里
- //game.h 游戏的函数声明
- //game.c 游戏函数的实现
-
- #include"game.h"
- //先记录一下步骤:
- //1.设计一个菜单,选择玩(1)还是退出(0),通过一个menu函数来实现
- //2.主函数中设计一个do while循环,这样至少执行一次,其中while 用到了输入的input的值
- //3.用switch(input) case语句进行选择
- //4.写一个3*3的二维数组,这里再game.h头文件中定义一个行列,这样便于以后更改
- //5.打印棋盘,注意要卸载game.c中
- //6.写一个初始化棋盘的函数initboard
- //7.用display_board函数打印棋盘,这个棋盘是先输入" %c ",不是最后列,就输入|做一个间隔
- // 每一个行中间用---|---|---做间隔,也就是说最后一行不需要间隔了
- //8.棋盘打印完之后就是玩游戏的问题,写出player_move(),先考虑玩家下棋的坐标,并考虑坐标的合法性,以及坐标是否被占用
- //9.考虑电脑下棋,用computer_move
- //10.用srand生成一个随机数种子,然后用rand生成一个随机数,之后判断这个位置是否为空格,是的话就落子
- // 这里用一个while循环,电脑下的棋用符号#
- //11.解决了电脑下棋问题之后需要解决判断输赢问题,有四种状态(玩家赢,电脑赢,平局,游戏继续)用is_win函数来判断
- //12.在game.c中写出is_win函数的具体实现过程
-
- //这里写出game.c中所有的函数:
- //1.void init_board 将数组中的元素初始化为空格,即' '
- //2.void display_board 打印出棋盘
- //3.void player_move 玩家下棋
- //4.void computer_move 电脑下棋
- //5.char is_win 判断谁赢
- //6.static int is_full 在game.c文件中用到的一个内部函数
-
-
-
- void menu()
- {
- printf("************************\n");
- printf("**** 1.play *****\n");
- printf("**** 0.exit *****\n");
- printf("************************\n");
- }
-
- void game()
- {
- char ret = 0;
- //数据的存储需要一个3*3的二维数组
- char board[ROW][COL] = { 0 };
- init_board(board, ROW, COL);
- display_board(board, ROW, COL);
- //玩游戏
- while (1)
- {
- player_move(board, ROW, COL); //玩家下棋
- display_board(board, ROW, COL);//打印
- ret = is_win(board, ROW, COL); //把从is_win函数中返回的值赋给ret
- if (ret != 'C')
- break; //这里不直接进行判断的原因是因为下面还需要在写一次,不如直接跳出
-
- computer_move(board, ROW, COL);//电脑下棋
- display_board(board, ROW, COL);//打印
- ret = is_win(board, ROW, COL);
- if (ret != 'C')
- break;
-
- }
- if (ret == '*')
- {
- printf("玩家赢\n");
- }
- else if (ret == '#')
- {
- printf("电脑赢\n");
- }
- else if (ret == 'Q')
- {
- printf("平局\n");
- }
- display_board(board, ROW, COL); //到底是怎么结束的呢,最终再把棋盘打印一次
- }
-
- //玩家赢-'*'
- //电脑赢-'#'
- //平局了-'Q'
- //游戏继续-'C'
-
- int main()
- {
- int input = 0;
- srand((unsigned int)time(NULL));
- do //程序至少执行一次
- {
- menu();
- printf("请选择:>");
- scanf("%d", &input);
- switch (input)
- {
- case 1:
- game();
- break;
- case 0:
- printf("退出游戏\n");
- break;
- default:
- printf("选择错误,重新选择!\n");
- break;
- }
- } while (input);
-
- return 0;
- }
![](https://csdnimg.cn/release/blogv2/dist/pc/img/newCodeMoreWhite.png)
game.c
- #pragma once
- #define _CRT_SECURE_NO_WARNINGS 1
- //此文件用于对test.c文件中game函数用到的文件进行说明
- #include"game.h" //因为后面要用到ROW,COL
- void init_board(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] = ' ';
- }
- }
- }
-
- void display_board(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++) //注意for括号后面不要加分号,总是出错
- {
- printf(" %c ", board[i][j]);
- if (j < col - 1)
- printf("|");
- }
- printf("\n");
- //---|---|---
- if (i < row - 1) //这个if语句控制最后一行不打印
- {
- for (j = 0; j < col; j++)
- {
- printf("---");
- if (j<col-1)
- printf("|");
- }
- printf("\n");
- }
- }
- }
-
- void player_move(char board[ROW][COL], int row, int col)
- {
- int x = 0;
- int y = 0;
- printf("玩家下棋:>\n");
-
- printf("请输入要下棋的坐标:>");
- scanf("%d %d", &x, &y);
- //坐标的合法性
- //坐标是否被占用
- while(1)
- {
- if (x >= 1 && x <= row && y >= 1 && y <= col)
- {
- if (board[x - 1][y - 1]==' ')
- {
- board[x - 1][y - 1] = '*';
- break;
- }
- else
- {
- printf("该坐标已被占用,请重新输入\n");
- break;
- }
- }
- else
- {
- printf("坐标非法,重新输入\n");
- break;
- }
- }
- }
- //电脑随机下棋
- void computer_move(char board[ROW][COL],int row,int col)
- {
- printf("电脑下棋:>\n");
- while (1)
- {
- int x = rand() % row;
- int y = rand() % col;
- if (board[x][y] == ' ')
- {
- board[x][y] = '#';
- break;
- }
- }
- }
-
- //如果棋盘满了,返回1
- //不满,返回0
- static int is_full(char board[ROW][COL], int row, int col) //加上static不让其他源文件看到
- {
- int i = 0;
- for (i = 0; i < row; i++)
- {
- int j = 0;
- for (j = 0; j < col; j++)
- {
- if (' ' == board[i][j])
- {
- return 0;
- }
- }
- }
- return 1;
- }
- char is_win(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][0]; //跟前面的呼应,如果是*,人赢,如果是#,电脑赢
- }
- }
- for (i = 0; i < col; i++) //一列相同
- {
- if (board[0][i] == board[1][i] && board[1][i] == board[2][i] && board[0][i] != ' ')
- {
- return board[0][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];
- }
- //判断平局
- if (is_full(board, row,col) == 1)
- {
- return 'Q';
- }
- //继续
- return'C';
- }
-
![](https://csdnimg.cn/release/blogv2/dist/pc/img/newCodeMoreWhite.png)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。