//打印三子棋游戏
// 规则:胜负
//。 横行 竖行 或者 对角线连在一起有三个一样的图案
// 率先完成的即为胜方
// 和棋
// 图案内没有空格时且没有有连到一起的图案
// 1.首先打印一个棋盘
//| | | |
//|---|---|---|
//| | | |
//|---|---|---|
//| | | |
//2.规定电脑在空格处打印O,玩家在空格处打印X.
//3.提醒玩家先输入合法的坐标,来开始游戏
//4.轮到电脑输入,检查规则(胜负还是和棋),如果没有出现以上情况,回到第二步。
#include<stdio.h>
#include<stdlib.h>
#include"math.h"
#define ROW 3
#define COL 3
char ChessBoard[ROW][COL]={};//定义二维数组d来用来打印棋盘
void Menu() { //打印菜单
printf("*****************************\n");
printf("***** 欢迎进入三子棋界面 *****\n");
printf("*****************************\n");
printf("**** 1:开始游戏 ****\n");
printf("**** 0:退出游戏 ****\n");
printf("*****************************\n");
}
//初始化棋盘
void Init(){
for(int row = 0; row < ROW;++row){
for(int col = 0; col < COL; ++col){
ChessBoard[row][col] =' ';
}
}
}
void Print(){
//打印棋盘
int row = 0;
for (row = 0;row < ROW;row++){
printf("| %c | %c | %c |\n", ChessBoard[row][0],ChessBoard[row][1],ChessBoard[row][2]);
if(row < 2){
printf("|---|---|---|\n");
}
}
}
//规则:胜负
//。 横行 竖行 或者 对角线连在一起有三个一样的图案
// 率先完成的即为胜方
// 和棋
// 图案内没有空格时且没有有连到一起的图案
//游戏规则
char Winner(){
int row = 0;
int col = 0;
for(row = 0;row < ROW; row++){
if(ChessBoard[row][0] == ChessBoard[row][1] && ChessBoard[row][0] == ChessBoard[row][2]
&& ChessBoard[row][0]!=' '){
return 'W';
}
}
for(col = 0;col < COL; col++){
if(ChessBoard[0][col] == ChessBoard[1][col] && ChessBoard[0][col] == ChessBoard[2][col]
&& ChessBoard[0][col]!=' '){
return 'W';
}
}
if(ChessBoard[0][0] == ChessBoard[1][1] && ChessBoard[0][0] == ChessBoard[2][2] && ChessBoard[0][0]!=' '){
return 'W';
}
if(ChessBoard[0][2] == ChessBoard[1][1] && ChessBoard[0][2] == ChessBoard[2][0] && ChessBoard[0][0]!=' '){
return 'W';
}
return 0;
}
//玩家移动棋子的函数
void PlayerMove(char ChessBoard[ROW][COL]){
int row = 0;
int col = 0;
while(1){
printf("请玩家输入落子的位置:");
scanf("%d %d",&row,&col);
if(row>2||col>2||row<0||col<0){
printf("您输入的落子位置不合法,请重新输入");
}
if(ChessBoard[row][col]==' '){
ChessBoard[row][col] = 'X';
break;
}
}
}
//电脑落子函数
//void srand(unsigned seed)随机数发生器的初始化函数
//只需在主程序开始处调用srand((unsigned)time(NULL)); 后面直接用rand就可以了。不要在for等循环放置srand((unsigned)time(NULL));
#include<time.h>
void ComMove2(char ChessBoard[ROW][COL]){
int row = 0;
int col = 0;
srand((unsigned)time(NULL));
while(1){
row = rand() % 3;
col = rand() % 3;
if(ChessBoard[row][col] ==' '){
ChessBoard[row][col] = 'O';
break;
}
}
}
//void ComMove1(char ChessBoard[ROW][COL]){
// int row = 0;
// int col = 0;
//
//}
#include<time.h>
int main(int argc, const char * argv[]){
Menu();
int i;
printf("请选择:");
scanf("%d",&i);
if(i==1){
Init();
while(1){
Print();//先打印一下棋盘
PlayerMove(ChessBoard);//玩家先下,判断游戏是否结束。如果结束就退出循环
if(Winner() == 'W'){
printf("玩家胜,游戏结束");
break;
}
ComMove2(ChessBoard);//电脑下,顺便判断游戏是否结束。如果循环结束就退出循环
if(Winner() == 'W'){
printf("电脑获胜,游戏结束");
break;
}
}
}
if(i==0){
printf("退出游戏");
}
return 0;
}
05-18
2337