致读者:
三子棋(井字棋)---记得小时候经常玩的就是这个游戏,虽然不是多么高大尚,但也饶有趣味!
emmmmmm.......大概就是这个样子吧
这个小游戏你还知道怎样玩吗?我们一起简单回顾一下:
将三子棋看作3x3的一个二维数组,由玩家和电脑分别填充这个数组。当行、列、叉能够达到三连时,就判断输赢。
默认玩家先行且棋子为 ‘ X ’,电脑后手棋子为 ‘ 0 ’。
《平民版》代码如下:
//项目名称:三子棋小游戏 //创建日期:2.18.4.17 //创建者: Mr.Yao #define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h> #include <time.h> enum NUMBER //枚举类型 { EXIT, PLAY }; void Printf(char a[3][3]) //打印数组也就是打印每个操作后的状态 { int i = 0, j = 0; for (i = 0; i<3; i++) { for (j = 0; j<3; j++) { printf("%c ", a[i][j]); } printf("\n"); } } void menu() //菜单 { printf("##############1.开始游戏##############\n"); printf("##############0.退出游戏##############\n"); } void fill(char a[3][3]) //填充 即玩家和电脑进行‘下棋子’ { int x = 0, y = 0; //分别表示 玩家输入的横坐标和纵坐标 int ran1 = 0, ran2 = 0; //分别表示 电脑产生的连个随机数 用来确定电脑下子的坐标 srand((unsigned)time(NULL));//随机数发生器的初始化函数。 while (1) { x = 0, y = 0; //在玩家每次下子前初始化坐标为00 printf("请输入你的坐标:"); scanf("%d%d", &x, &y); if (x>3 || x<1 || y>3 || y<1)//玩家所输入的横纵坐标都必须要在1-3之间 { printf("坐标有误,请重新输入!\n"); continue; } if (a[x - 1][y - 1] == '_') //数组初始化每个元素为_ 为真时说明该坐标还未被填充 { a[x - 1][y - 1] = 'X'; Check(a); //检查是否获胜 } else { printf("已被填充,请重新填充!\n"); continue; } while ((a[ran1 - 1][ran2 - 1] != '_')) //一直产生随机数直到 该坐标未被填充 { ran1 = rand() % 3 + 1; ran2 = rand() % 3 + 1; } a[ran1 - 1][ran2 - 1] = '0'; //电脑下子 Check(a); Printf(a); //双方下完一次后打印出结果 } } int Check(char a[3][3]) { int i, j; int count = 0; //用来标记数组中未被填充的元素个数 //共8中获胜可能 if (a[0][0] == a[0][1] && a[0][1] == a[0][2] && a[0][2] == 'X' || a[1][0] == a[1][1] && a[1][1] == a[1][2] && a[1][2] == 'X' || a[2][0] == a[2][1] && a[2][1] == a[2][2] && a[2][2] == 'X' || a[0][0] == a[1][1] && a[1][1] == a[2][2] && a[2][2] == 'X' || a[2][0] == a[1][1] && a[1][1] == a[0][2] && a[0][2] == 'X' || a[0][0] == a[1][0] && a[1][0] == a[2][0] && a[2][0] == 'X' || a[0][1] == a[1][1] && a[1][1] == a[2][1] && a[2][1] == 'X' || a[0][2] == a[1][2] && a[1][2] == a[2][2] && a[2][2] == 'X') { printf("玩家赢!\n"); system("pause"); Printf(a); exit(0); } else if (a[0][0] == a[0][1] && a[0][1] == a[0][2] && a[0][2] == '0' || a[1][0] == a[1][1] && a[1][1] == a[1][2] && a[1][2] == '0' || a[2][0] == a[2][1] && a[2][1] == a[2][2] && a[2][2] == '0' || a[0][0] == a[1][1] && a[1][1] == a[2][2] && a[2][2] == '0' || a[2][0] == a[1][1] && a[1][1] == a[0][2] && a[0][2] == '0' || a[0][0] == a[1][0] && a[1][0] == a[2][0] && a[2][0] == '0' || a[0][1] == a[1][1] && a[1][1] == a[2][1] && a[2][1] == '0' || a[0][2] == a[1][2] && a[1][2] == a[2][2] && a[2][2] == '0') { printf("电脑赢!\n"); Printf(a); system("pause"); exit(0); } else { for (i = 0; i<3; i++) { for (j = 0; j<3; j++) { if (a[i][j] == '_') count++; } } if (count == 0) { printf("和棋!\n"); Printf(a); system("pause"); exit(0); } count = 0; } } void init(char arr[3][3]) { int i = 0, j = 0; char arry[3][3] = { "___", "___", "___" }; for (i = 0; i<3; i++) { for (j = 0; j<3; j++) { arr[i][j] = arry[i][j]; printf("%c ", arr[i][j]); } printf("\n"); } } void PlayGame(char arr[3][3]) { init(arr); fill(arr); } int main() { char game[3][3] = { 0 }; int choose = 1; while (choose) { menu(); printf("请选择:"); scanf("%d", &choose); switch (choose) { case PLAY: PlayGame(game); break; case EXIT: return 0; break; default: printf("输入错误\n"); break; } } system("pause"); return 0; }
示图如下:
《豪华版》代码如下:
game.h:
//项目名称:三子棋 //编译环境:VS 2013 //创建时间:2018.4.20 #ifndef _GAME_H_ #define _GAME_H_ #include<stdio.h> #include<stdlib.h> #include<time.h> #include<string.h> typedef unsigned int uint; enum QQ { EXIT, PLAY }; #define ROW 3 #define COL 3 void init_board(char board[ROW][COL], int row, int col); void print_board(char board[ROW][COL], int row, int col); void computer_move(char board[ROW][COL], int row, int col); void player_move(char board[ROW][COL], int row, int col); char is_win(char board[ROW][COL], int row, int col); #endif
game.c:
#define _CRT_SECURE_NO_WARNINGS 1 #include"game.h" void init_board(char board[ROW][COL], int row, int col) { memset(board, ' ', row*col*sizeof(board[0][0])); } void print_board(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]); if (i != 2) { printf("---|---|---\n"); } } } void player_move(char board[ROW][COL], int row, int col) { int x = 0; int y = 0; printf("请输入坐标:\n"); while (1) { scanf("%d%d", &x, &y); if (((x > 0) && (x <= row)) && ((y > 0) && (y <= col))) { if (board[x - 1][y - 1] == ' ') { board[x - 1][y - 1] = 'X';//玩家落子 break; } else { printf("该坐标已被占用:\n"); } } else { printf("输入坐标不合法:\n"); } } } void computer_move(char board[ROW][COL], int row, int col) { int x = 0; int y = 0; while (1) { x = rand() % row; y = rand() % col; if (board[x][y] == ' ') { board[x][y] = '0'; break; } } } static int is_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; int j = 0; for (i = 0; i < row; i++) { if ((board[i][0] == board[i][1]) && (board[i][1] == board[i][2]) && (board[i][2] != ' ')) { return board[i][0]; } } for (j = 0; j < col; j++) { if ((board[0][j] == board[1][j]) && (board[1][j] == board[2][j]) && (board[2][j] != ' ')) { return board[0][j]; } } if ((board[0][0] == board[1][1]) && (board[1][1] == board[2][2]) && (board[2][2] != ' ')) { return board[0][0]; } else if ((board[0][2] == board[1][1]) && (board[1][1] == board[2][0]) && (board[1][1] != ' ')) { return board[0][2]; } else if (1 == is_full(board, ROW, COL)) { return 'Q'; } else return ' '; }
test.c
#define _CRT_SECURE_NO_WARNINGS 1 #include"game.h" void menu() { printf("***** 《三子棋游戏》 *****\n"); printf("****** 1.play *******\n"); printf("****** 0.exit *******\n"); printf("*************************\n"); printf("*************************\n"); } void game() { char ret; char board[ROW][COL]; init_board(board, ROW, COL); print_board(board, ROW, COL); while (1) { printf("玩家走:\n"); player_move(board, ROW, COL); print_board(board, ROW, COL); ret = is_win(board, ROW, COL); if (ret != ' ') break; printf("电脑走:\n"); computer_move(board, ROW, COL); print_board(board, ROW, COL); ret = is_win(board, ROW, COL); if (ret != ' ') break; } if (ret == 'X') { printf(" You Win!\n"); } else if (ret == '0') { printf(" You Lost!\n"); } else if (ret == 'Q') { printf("平局\n"); } } void test() { int input = 0; srand((uint)time(NULL)); do { menu(); printf("请选择:"); scanf("%d", &input); switch (input) { case PLAY: game(); break; case EXIT: break; default: break; } } while (input); } int main() { test(); system("pause"); return 0; }
示图如下:
不正之处,多多指正!