【C】实现三子棋,看就懂!

mac2025-05-19  44

三子棋游戏俗称井字棋,棋盘共三行三列,棋子摆满任一行一列或者对角线就胜利了。 用到的知识:数组传参时发生降维,降维成该数组内元素类型的指针。因此传参时实参会通过形参的改变而改变。代码整体分6块, 1.void Init(char board[][row], int x,int y); 初始化棋盘,棋盘模拟成一个二维数组board[][] 2.void Show(char board[][row], int x, int y);显示棋盘当前状态 3.char Judge(char board[][row], int x, int y);判断游戏是否结束,之后清算输赢 4.void C_move(char board[][row], int x, int y);模拟电脑落子 5.int Firstone();模拟抛硬币,决定落子先后顺序 6.void Game();游戏的执行顺序 头文件 game.h

#ifndef __game_h__ #define __game_h__ #include<stdio.h> #include<time.h> #include<windows.h> #pragma warning(disable:4996) #define row 3 #define line 3 void Init(char board[][row], int x,int y); void Show(char board[][row], int x, int y); char Judge(char board[][row], int x, int y); void C_move(char board[][row], int x, int y); int Firstone(); void Game(); #endif

game.c

#include "game.h" void Init(char board[][row], int x, int y) { int i = 0; for (i; i < x; ++ i){ int j = 0; for (j; j < y; j++){ board[i][j] = ' '; } } } int Firstone() { int rnum = rand() % 2; printf("请猜硬币正反面决定落子顺序!\n"); for (int i = 5; i > 0; i--){ printf("正在生成硬币...........%d\r", i); Sleep(1000); } printf("硬币已生成,请猜(反面:0,正面:1):>"); int select=0; scanf("%d", &select); if (select == rnum){ printf("恭喜猜对了!\n"); return 0; } else{ printf("很遗憾猜错了\n"); return 1; } } void Show(char board[][row], int x, int y) { printf(" 1 | 2| 3\n"); printf("-------------\n"); for (int i=1; i <= x; i++){ printf("%d |",i); for (int j=1; j <= y; j++){ printf("%c |", board[i-1][j-1]); } printf("\n"); printf("-------------\n"); } } char Judge(char board[][row], int x, int y) { for (int i=0; i < line; i++){ if (board[i][0]!=' '&&board[i][0] == board[i][1] && board[i][1] == board[i][2]){ return board[i][0]; } if (board[0][i] != ' '&&board[0][i] == board[1][i] && board[1][i] == board[2][i]){ return board[0][i]; } } if (board[0][0] != ' '&&board[0][0] == board[1][1] && board[0][0] == board[2][2]) return board[0][0]; if (board[0][2] != ' '&&board[0][2] == board[1][1] && board[0][2] == board[2][0]) return board[0][2]; for (int i=0; i < x; i++){ for (int j=0; j < y; j++){ if (board[i][j] == ' ') return 'N'; } } return 'F'; } void C_move(char board[][row], int x, int y) { while (1){ int a = rand()%line; int b = rand()%row; if (board[a][b] == ' '){ board[a][b] = 'o'; break; } } } void Game() { int who=1; char board[3][3]; char result = 0; Init(board, line, row); who = Firstone(); if (who){ goto aa; } do{ int x = 0, y = 0; Show(board,line,row); printf("请落子(输入格式:x y): >"); scanf("%d %d", &x, &y); if (x <1 || x > 3 || y <1 || y > 3){ printf("输入有误,请重新输入!\n"); continue; } else if (board[x-1][y-1] != ' '){ printf("该位置已被占用,请重新输入!\n"); continue; } else board[x-1][y-1] = 'x'; result=Judge(board, line, row); if (result != 'N'){ break; } aa:C_move(board,line,row); result=Judge(board, line,row); if (result != 'N'){ break; } } while (1); if (result == 'x'){ printf("---------------------\n"); Show(board, line, row); printf("恭喜,你赢了!\n"); } else if (result == 'o'){ printf("---------------------\n"); Show(board, line, row); printf("很遗憾,你输了!\n"); } else if (result == 'F'){ printf("平局!\n"); } }

main.c

#include "game.h" void Menu() { printf("###########################\n"); printf("## 欢迎来到我的游戏厅 ##\n"); printf("## 1.play 2.exit ##\n"); printf("###########################\n"); printf("Please select >"); } int main() { srand((unsigned long)time(NULL)); int select = 0; int quit = 0; while (!quit) { Menu(); scanf("%d", &select); switch (select) { case 1: Game(); printf("玩的还不错,还要继续吗?\n"); break; case 2: quit = 1; printf("bye,bye~\n"); break; default: printf("输入有误,请重新输入!\n"); break; } } system("pause"); }
最新回复(0)