用C语言实现三子棋,自己思路是先让以菜单的形式让玩家选择进入游戏或者退出。下棋时玩家以坐标的形式将棋子放在定义的二维数组里,用o表示,电脑用随机函数将棋子放入棋盘,用x表示。每次玩家和电脑放入后都判断是否已经满足规则。
1、首先设计菜单,编写主函数。
#include "game.h" void menu() //菜单 { printf("###############################\n"); printf("############1.Play#############\n"); printf("############2.Exit#############\n"); } int main() { int c=0; do{ //用循环的形式便于玩家选择进入游戏或者退出游戏 menu(); scanf_s("%d", &c); switch (c) //用switch语句来实现进入游戏或者退出游戏 { case 1: game(); break; case 2: exit(0); default: printf("Select error!!!\n"); } } while (1); system("pause"); return 0; }
2.编写头文件,是函数调用方便,程序主体更加整齐
#ifndef __GAME_H_ #define __GAME_H_ #include <stdio.h> #include <windows.h> #include <stdlib.h> #include <time.h> #define ROW 3 //数组的行 #define COL 3 //数组的列 void game(); #pragma warning(disable:4996) #endif
3.编写游戏函数,程序的灵魂。
#include "game.h" static void displayBoard(char board[][COL], int row) //用来显示棋盘的函数 { int i = 0; for (; i < row; i++) { printf(" %c | %c | %c \n", board[i][0], board[i][1], board[i][2]); if (i < row - 1) { printf("---|---|---\n"); } } } static void playerMove(char board[][COL], int row) //玩家放棋子函数 { int x, y; do{ printf("Please Enter (x,y)\n"); 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'; //以o来表示玩家的棋子 break; }
else { printf("Please Try Another Place\n "); break; } } else { printf("Please Enter Right Place\n"); } } while (1); } static void compMove(char board[][COL], int row) //电脑移动 { srand((unsigned long)time(NULL)); //产生一个随机数 do{ int x = rand() % ROW; //使随机数在坐标范围内 int y = rand() % COL; //使随机数在坐标范围内 if (board[x][y] = ' '&&board[x][y]!='o') //判断此位置是否已经被占 { board[x][y] = 'x'; //用x表示电脑棋子 break; } } while (1); } static int isfull(char board[][COL], int row) //判断是棋盘否下满的函数 { int i = 0; for (; i < ROW; i++) { int j = 0; for (; j < COL; j++) { if (board[i][j] == ' ') //棋盘内有空格则表示未下满 { return 0; } } } return 1; } static char isWin(char board[][COL], int row) //判断是否赢了的函数 { int i = 0; for (; i < ROW; i++) //判断行是否够三个 { if (board[i][0] == board[i][1] && board[i][1] == board[i][2] && board[i][0]!=' ') { return board[i][1]; //返回够三个的棋子 } } for (; 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[0][0]!=' ') //判断右对角线是否够三个 { return board[0][0]; } if (board[2][0] == board[1][1] && board[1][1] == board[0][2] && board[2][0]!=' ') //判断左对角线是否够三个 { return board[2][0]; } if (isfull(board, row)) { return 't'; //如果平局,返回t } return ' '; } void game() { char board[ROW][COL]; memset(board, ' ', ROW*COL); //将数组全部初始化为空格 char ret; do{ system("CLS"); //清屏操作 displayBoard(board, COL); //显示棋盘 playerMove(board, COL); //玩家移动 system("CLS"); //继续清屏操作,使面板整洁 displayBoard(board, COL); //继续显示棋盘 ret = isWin(board, COL); //是否产生结果 if (ret!=' ') { break; } compMove(board, COL); system("CLS"); displayBoard(board, COL); ret = isWin(board, COL); } while (ret==' '); if (ret == 'o') //返回值为o则表示玩家赢了 { printf("nice,you win\n"); } else if (ret == 'x') //返回值为x则表示电脑赢了 { printf("you lose,try again\n"); } else if (ret == 't') //返回值为t则表示棋盘下满未产生输赢,平局 { printf("平局\n"); } }
运行程序,其中x为电脑下的棋子,o为玩家下的棋子,很惭愧输给了电脑,哈哈