三子棋游戏
2018-04-08 18:11
183 查看
思路:[align=left]1.先展示一个菜单,让玩家选择,选择1后进入游戏[/align][align=left]2.进入游戏后,对创建好的二维数组进行初始化,然后展现棋盘[/align][align=left]3.玩家开始玩游戏,玩过一次之后,展现棋盘,进行判断,判断输赢,判断棋盘是否为满,之后电脑开始下棋,同理,对电脑也进行判断,这是一个循环。[/align][align=left]
[/align][align=left]总共需要三个文件:[/align][align=left]1.sanziqi.h[/align][align=left]包含所需函数的声明[/align][align=left]2.game.c包含函数的定义[/align][align=left]3.test.c包含函数的实现[/align]
[/align][align=left]总共需要三个文件:[/align][align=left]1.sanziqi.h[/align][align=left]包含所需函数的声明[/align][align=left]2.game.c包含函数的定义[/align][align=left]3.test.c包含函数的实现[/align]
//sanziqi.h #ifndef __SANZIQI_H__ //条件指示符#ifndef 的最主要目的是防止头文件的重复包含和编译 #define __SANZIQI_H__ #define ROW 3 #define COL 3 //初始化棋盘 void Init_BOard(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, 4000 int col); //电脑走棋 void ComputerMove(char board[ROW][COL], int row, int col); //判断输赢 int CheckWin(char board[ROW][COL], int row, int col); //判断棋盘是否为满 int CheckNull(char board[ROW][COL], int row, int col); #endif // !__SANZIQI_H__ //game.c #include"sanziqi.h" //初始化棋盘函数的定义 void InitBoard(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 DisplayBoard(char board[ROW][COL], int row, int col) { int i = 0; int j = 0; for (i = 0; i < col; i++) { printf("%c | %c | %c\n",board[i][0],board[i][1],board[i][2]); if (i !=2) { printf("---------\n"); } } } //玩家走棋——包含两种判断:1.在棋盘上.2.下的位置是空。是一个循环 void PlayerMove(char board[ROW][COL], int row, int col) { int x; int y; while (1) { printf("请输入坐标:\n"); scanf("%d,%d", &x, &y); if (((1 <= x) && (x <= row)) && ((1 <= y) && (y <= col))) { if (board[x - 1][y - 1] == ' ') //玩家的输入习惯从0开始,所以需要减1 { board[x - 1][y - 1] = 'O'; break; } else { printf("输入的位置已有棋子,请重新输入\n"); } } else { printf("输入错误,请重新输入\n"); } } } //电脑走棋,是随机的,需要产生随机数 void ComputerMove(char board[ROW][COL], int row, int col) { int x; int y; printf("电脑走棋\n"); while (1) { x = rand() % row; y = rand() % col; if (board[x][y] == ' ') { board[x][y] = 'X'; break; } } } //判断输赢--在一条线上就赢了,分为四种情况,然后判断是否平局 int CheckWin(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][1] != ' ')) { 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]; } if (CheckNull(board,ROW, COL)) { return 'q'; } return ' '; } //判断棋盘是否为满 int CheckNull(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; //表示棋盘已下满 } //test.c #include <stdio.h> #include<time.h> #include"sanziqi.h" void menu() { printf("*************************\n"); printf("*****1.play 0.exit*****\n"); printf("*************************\n"); } void game() { int ret = 0; char board[ROW][COL] = { 0 }; InitBoard(board, ROW, COL); DisplayBoard(board, ROW, COL); while (1) { PlayerMove(board, ROW, COL); DisplayBoard(board, ROW, COL); ret = CheckWin(board, ROW, COL); if (ret != ' ') { break; } ComputerMove(board, ROW, COL); DisplayBoard(board, ROW, COL); ret = CheckWin(board, ROW, COL); if (ret != ' ') { break; } } if (ret == 'X') { printf("电脑赢!再接再厉!\n"); } if (ret == 'O') { printf("恭喜你,你赢了!\n"); } if (ret == 'q') { printf("平局!\n"); } } int main() { int choice; srand((unsigned int) time(NULL)); menu(); //用while循环实现游戏 do { printf("请输入选择->:\n"); scanf("%d", &choice); switch (choice) { case 1: game(); break; case 0: break; default: printf("输入有误,请重新输入\n"); break; } } while (choice); return 0; }