这个小游戏的程序由三部分代码组成,分别是头文件,游戏代码和测试代码。
头文件:game.h
#ifndef __GAME_H__ #define __GAME_H__ #include<stdio.h> #include<stdlib.h> #include<time.h> #include<string.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 ComputerMove(char board[ROW][COL], int row, int col); void PlayerMove(char board[ROW][COL], int row, int col); char IsWin(char board[ROW][COL], int row, int col); #endif //__GAME_H__
测试代码:test.c
#define _CRT_SECURE_NO_WARNINGS 1 #include "game.h" void menu()//菜单 { printf("**************************\n"); printf("**** 1. play 0. exit ****\n"); printf("**************************\n"); } void game() { int ret = 0;//返回值 int num = 0; char board[ROW][COL] = {0}; InitBoard(board, ROW, COL); printf("1.玩家先走 2.电脑先走\n"); printf("请选择;>"); scanf("%d",&num); switch(num) { case 1://选择玩家先走 { while(1) { DisplayBoard(board, ROW, COL); PlayerMove(board,ROW,COL); ret = IsWin(board,ROW,COL); if(ret != ' ')//棋盘已经走满,进行判断 { break; } DisplayBoard(board, ROW, COL); ComputerMove(board,ROW,COL); ret = IsWin(board,ROW,COL); if(ret != ' ') { break; } DisplayBoard(board, ROW, COL); } } case 2://选择电脑先走 { while(1) { ComputerMove(board,ROW,COL); ret = IsWin(board,ROW,COL); if(ret != ' ') { break; } DisplayBoard(board, ROW, COL); PlayerMove(board,ROW,COL); ret = IsWin(board,ROW,COL); if(ret != ' ') { break; } DisplayBoard(board, ROW, COL); } } default: printf("选择错误!\n"); } DisplayBoard(board, ROW, COL); //判断 if(ret == 'X') printf("电脑赢!\n"); else if(ret == 'O') printf("玩家赢!\n"); else if(ret == 'P') printf("平局!\n"); } 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"); } }while(input); } int main() { test(); return 0; }
游戏代码:game.c
#define _CRT_SECURE_NO_WARNINGS 1 #include "game.h" void InitBoard(char board[ROW][COL], int row, int col)//初始化数组 { int i = 0; int j = 0; memset(board,' ',row*col*sizeof(board[0][0])); } 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"); } } 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] = 'X';//电脑走的话输入X break; } } } void PlayerMove(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<=3) && (y>=1 && y<=3)) { if(board[x-1][y-1] == ' ') { board[x-1][y-1] = 'O'; break; } else { printf("该坐标已被占用!\n"); } } else { printf("坐标非法!\n"); } } } char IsWin(char board[ROW][COL], int row, int col) { int i = 0; int j = 0; //判断电脑和玩家的输赢 for(i=0; i<row; i++) { if((board[i][0]==board[i][1]) && (board[i][0]==board[i][2]) && board[i][0]!=' ') return board[i][0]; } for(j=0; j<col; j++) { if((board[0][j]==board[1][j]) && (board[0][j]==board[2][j]) && board[0][j]!=' ') return board[0][j]; } if((board[0][0]==board[1][1]) && (board[1][1]==board[2][2]) && board[1][1]!=' ') return board[0][0]; if((board[0][2]==board[1][1]) && (board[1][1]==board[2][0]) && board[1][1]!=' ') return board[1][1]; //判断平局 if(IsFull(board, ROW, COL)) { return 'P'; } //游戏继续 return ' '; } static int IsFull(char board[ROW][COL], int row, int col)//此函数只在game.c内部使用 { 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; }
结果展示: