分为三部分入手,更轻松学会。
test.c 测试游戏的逻辑
//测试三子棋的逻辑 #include "game.h" void menu() { printf("********************\n");
printf("**** 1.play ****\n"); printf("**** 0.exit ****\n");
printf("********************\n"); } void game() { char ret = 0; //存放下棋的数据 char
board[ROW][COL] = { 0 }; //初始化棋盘为全空格 InitBoard(board, ROW, COL); //打印棋盘
DisplayBoard(board, ROW, COL); while (1) { //玩家下棋 player_move(board, ROW, COL);
DisplayBoard(board, ROW, COL); //判断输赢 ret = is_win(board, ROW, COL); if (ret !=
'C') { break; } //电脑下棋 computer_move(board, ROW, COL);//随机下棋
DisplayBoard(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"); } //DisplayBoard(board,
ROW, COL); } //什么情况下游戏结束 //玩家赢-* //电脑赢-# //平局-Q //继续-C void test() { 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); } int main() {
test(); return 0; }
game.c 游戏的实现
#include "game.h" void InitBoard(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++) {
board[i][j] = ' '; } } } //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]); // } // printf("\n"); // }
//} void DisplayBoard(char board[ROW][COL], int row, int col) { int i = 0; for
(i = 0; i < row; i++) { //打印数据 //printf(" %c | %c | %c
\n",board[i][0],board[i][1],board[i][2]); 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) //printf("---|---|---\n"); { 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"); while (1) { printf("请输入坐标:"); scanf("%d %d", &x, &y); if (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 computer_move(char
board[ROW][COL], int row, int col) { int x = 0; int y = 0; printf("电脑下棋\n");
while (1) { x = rand() % row;//0~2 y = rand() % col;//0~2 if (board[x][y] == '
') { board[x][y] = '#'; break; } } } static int if_full(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++) { 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][1] != ' ') { return board[i][1]; } } //判断列 for (i = 0;
i < row; 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 (if_full(board, row, col)
== 1) { return 'Q'; } //继续 return 'C'; }
game.h 函数声明,符号的定义
#pragma once #include <stdio.h> #include <stdlib.h> #include <time.h> #define
ROW 3 #define COL 3 //初始化棋盘 void InitBoard(char board[ROW][COL], int row, int
col); //打印棋盘 void DisplayBoard(char board[ROW][COL], int row, int col); //玩家下棋
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);