一、井字棋
//三子棋游戏:TIC-TAC-TOE
//2022-02-25 朱文杰
//#include<game.h>
#include<stdio.h>
#include<time.h> //time 获取时间戳 头文件
#include<stdlib.h> //srand rand 函数头文件
#define ROW 3 //行
#define COL 3 //列
void Menu();//菜单函数申明
void OpenShow();//游戏开始函数申明
void OverShow();//游戏结束函数申明
void Game_Proc();//游戏处理函数申明
void Game(); //游戏函数申明
void Board_init(char Board[ROW][COL],int row,int col);//棋盘数据初始化函数申明
void Board_Display(char Board[ROW][COL],int row,int col);//棋盘打印函数申明
void Player_Turn(char Board[ROW][COL],int row,int col);//玩家操作函数申明
void Computer_Turn(char Board[ROW][COL],int row,int col);//电脑操作函数申明
char IsWin(char Board[ROW][COL],int row,int col);//胜负判断函数申明:返回4个值:游戏状态 玩家赢o 电脑赢x 平局p 继续c
int IsFull(char Board[ROW][COL],int row,int col);//判断棋盘满没满
int Scores = 0;//积分累计
int main()
{
Game_Proc();//游戏处理函数
}
void Game() //游戏函数
{
char Board[ROW][COL]={0};//定义棋盘数组
char ret = 0;//接受胜负判断返回值
Board_init(Board,ROW,COL);//棋盘初始化
Board_Display(Board,ROW,COL); //打印棋盘
while(1) //下棋循环
{
//玩家下棋
Player_Turn(Board,ROW,COL); //玩家回合:将子落到数组中去
Board_Display(Board,ROW,COL); //打印棋盘
//判断胜负
ret = IsWin(Board,ROW,COL);
if(ret!='c')
{
break;
}
//电脑下棋
Computer_Turn(Board,ROW,COL);
Board_Display(Board,ROW,COL); //打印棋盘
//判断胜负
ret = IsWin(Board,ROW,COL);
if(ret!='c')
{
break;
}
}
if(ret == 'o')
{
printf("恭喜玩家取得胜利!\0v0/ \n");
printf("您获得了666积分\n");
Scores +=666;
}
else if(ret =='x')
{
printf("惜败!壮士,请重头来过!T_T\n");
printf("您减少了250积分\n");
Scores -=250;
}
else
{
printf("您与呆头电脑博弈的难解难分!\n");
Scores -=10;
printf("您减少了10积分\n");
}
}
//判断棋盘满没满函数
//功能:判断棋盘满没满 0有空格 1 满了
int IsFull(char Board[ROW][COL],int row,int col)
{
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;// 满了
}
//胜负判断函数
//功能:胜负判断
char IsWin(char Board[ROW][COL],int row,int col)
{
int i = 0;
//行相同
for(i = 0;i < row;i++)
{
if(Board[i][0]==Board[i][1] && Board[i][1]==Board[i][2] && Board[i][1] != ' ')
{
return Board[i][0];
}
}
//列相同
for(i = 0;i < col;i++)
{
if(Board[0][i]==Board[1][i] && Board[1][i]==Board[2][i] && Board[1][i] != ' ')
{
return Board[0][i];
}
}
//斜角
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[0][0];
}
//平局:无空格,没人赢
if(1==IsFull(Board,ROW,COL))
{
return 'p';
}
return 'c';//继续游戏
}
//电脑自动落子函数
// 功能:利用时间戳产生随机坐标落子
void Computer_Turn(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] == ' ')//如果是空格子,就填一个x 如果不是就重新改生成坐标落子
{
Board[x][y] = 'x';
break;
}
}
}
//玩家操作函数
//功能;玩家操作落子
void Player_Turn(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<=3&&y>0&&y<=3)//判断落子坐标是否已经下过
{
if(Board[x-1][y-1] == ' ')//如果合法
{
Board[x-1][y-1]='o';break; //输入完就退出循环
}
else
{
printf("坐标非法:当前坐标已落子或超出棋盘范围\n例如1 1:表示第1行第1列请重新输入:\n");
}
}
else
{
printf("坐标非法:当前坐标已落子或超出棋盘范围\n例如1 1:表示第1行第1列请重新输入:\n");
}
}
}
//棋盘初始化函数
//功能: 将3*3个落子位置填空格
void Board_init(char Board[ROW][COL],int row,int col) //棋盘初始化函数,让每行每列填数据的地方为空格
{
int i = 0;
int j = 0;
for(i = 0;i<row;i++) //row行
{
for(j = 0;j<col;j++) //col列
{
Board[i][j] = ' '; //把每行每列棋子输入的地方 都输入空格
}
}
}
//棋盘打印函数
//功能:实时打印棋盘
void Board_Display(char Board[ROW][COL],int row,int col)
{
int i = 0;
int j = 0;
for(i = 0;i<row;i++)//row行
{
for(j = 0;j < col;j++)//col列 :
{
//打印一行的数据:数据|数据|数据
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 Game_Proc()
{
int input = 0;
srand((unsigned int)time(NULL)); //生产随机数种子
do
{
Menu();
printf("请做出您的选择:>\n");
scanf("%d",&input);
switch(input)
{
case 1: OpenShow();Game();
break;
case 0: OverShow();
break;
default: printf("选择错误,请重新选择^-^\n");
break;
}
}while(input); //1执行下去,0 不执行退出
}
//界********************************************面显示函数********************************************//
void Menu()//菜单函数
{
printf("***********************************\n");
printf("***** *****\n");
printf("***** Welcome to Here *****\n");
printf("***** 三子棋 *****\n");
printf("***** TIC-TAC-TOE *****\n");
printf("***** 输入1:开始游戏 *****\n");
printf("***** 输入0:退出游戏 *****\n");
printf("***** 当前您的积分为:%-5d *****\n",Scores);
printf("***** by Remained *****\n");
printf("***********************************\n");
}
void OverShow()//游戏结束函数
{
printf("***********************************\n");
printf("***** 游戏退出 *****\n");
printf("***** ^_^ Bye-Bye! *****\n");
printf("***********************************\n");
}
void OpenShow()//游戏开始函数
{
printf("***********************************\n");
printf("***** 游戏开始 *****\n");
printf("***** !^0^! !^0^! *****\n");
printf("***********************************\n\n\n");
}
二、扫雷.简易版
//扫雷游戏:Mine Sweeper/ Win Mine
//思路:布置雷->排查雷->提示/炸死
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define ROW 9 //行
#define COL 9 //列
//棋盘扩大一圈
#define ROWS 11 //行plus
#define COLS 11 //列plus
#define Number_Mine 5//10个雷
int Scores= 0;//积分累计
//界面显示函数声明
void Menu();//菜单显示声明
void OverShow();//游戏结束界面函数声明
void OpenShow();//游戏开始界面函数声明
//游戏函数声明
void Game_Proc();//游戏处理函数申明
void Game(); //游戏函数申明
//数组
void InitBoard(char Board[ROWS][COLS],int rows,int cols,char set); //数组数据初始化函数申明
void DisplayBoard(char Board[ROWS][COLS],int row,int col); //实时打印棋盘函数申明
void SetMine(char Mine[ROWS][COLS],int row,int col) ; //布置雷函数申明
void FindMine(char Mine[ROWS][COLS],char Show[ROWS][COLS],int row,int col); //扫雷函数申明
int GetMineNum(char Mine[ROWS][COLS],int x,int y); //获取周边雷个数
int main()
{
printf(" 游戏须知^-^\n>>首行首列表示x,y轴标度\n>>输入坐标后,显示的数字表示以自己为中心周边8个位置雷的个数\n");
printf("避开所有地雷即可取得游戏胜利!\n祝您游戏愉快!\n");
Game_Proc();
}
void Game() //游戏函数申明
{
//1.布置好雷的信息
char Mine[ROWS][COLS]={0};
//2。排查出雷的信息
char Show[ROWS][COLS]={0};
//初始化数组
InitBoard(Mine,ROWS,COLS,'0');
InitBoard(Show,ROWS,COLS,'*');
//打印雷区
DisplayBoard(Show,ROW,COL);
SetMine(Mine,ROW,COL);//布置雷
// DisplayBoard(Mine,ROW,COL);//显示雷
//扫雷
FindMine(Mine,Show,ROW,COL); //因为仅对中级的9行9列数组进行扫雷
}
//游戏处理函数
//功能:整个游戏过程
void Game_Proc()
{
int input = 0;
srand((unsigned int)time(NULL));
do
{
Menu();
printf("请做出您的选择:>\n");
scanf("%d",&input);
switch(input)
{
case 1: OpenShow();Game();
break;
case 0: OverShow();
break;
default: printf("选择错误,请重新选择^-^\n");
break;
}
}while(input); //1执行下去,0 不执行退出
}
int GetMineNum(char Mine[ROWS][COLS],int x,int y)//计算周边雷的个数: 算法:'1'-'0'=1
{
return (Mine[x-1][y-1]+Mine[x][y-1]+Mine[x+1][y-1]+Mine[x-1][y]+
Mine[x+1][y]+Mine[x-1][y+1]+Mine[x][y+1]+Mine[x+1][y+1]-8*'0');
}
void FindMine(char Mine[ROWS][COLS],char Show[ROWS][COLS],int row,int col)
{
int x = 0;
int y = 0;
int Win = 0;
printf("请输入排查雷的坐标:>\n");
while(Win<row*col-Number_Mine)
{
scanf("%d %d",&x,&y);//1-9 1-9
if(x>=1&&x<=row&&y>=1&&y<=col)//坐标合法
{
if(Mine[x][y]=='1')//碰到雷了
{
DisplayBoard(Mine,ROW,COL); //打印下现在的情况
printf("很遗憾,你炸了!TmT\n");
break;
}
else//不是雷 ,计算xy坐标周围几个雷
{
int count = GetMineNum(Mine,x,y);
Show[x][y]=count+'0';
DisplayBoard(Show,row,col);
Win++;
}
}
else
{
printf("坐标位置非法,请重新输入坐标\n例如:第一行第一列:1 1\n");
}
}
if(Win==row*col-Number_Mine)
{
Scores +=520;
printf("恭喜你!排雷成功!!获得520积分!\n");
}
}
void SetMine(char Board[ROWS][COLS],int row,int col)
{
int count =0;
count = Number_Mine;//10个雷
while(count)
{
int x = rand()%row+1;//1-9
int y = rand()%col+1;//1-9
if(Board[x][y] == '0')
{
Board[x][y]='1';
count --;
}
}
}
void InitBoard(char Board[ROWS][COLS],int rows,int cols,char set)
{
int i = 0;
int j = 0;
for(i=0;i<rows;i++)
{
for(j=0;j<cols;j++)
{
Board[i][j]=set;
}
}
}
//棋盘打印函数
//功能:实时打印棋盘
void DisplayBoard(char Board[ROWS][COLS],int row,int col)
{
int i = 0;
int j = 0;
for(i=0;i<=col;i++) //打印行号
{
printf("%d ",i);
}
printf("\n");
for(i=1;i<=row;i++)
{
printf("%d ",i);//打印列号
for(j=1;j<=col;j++)
{
printf("%c ",Board[i][j]);
}
printf("\n");
}
}
void Menu()//菜单函数
{
printf("***********************************\n");
printf("***** *****\n");
printf("***** Welcome to Here *****\n");
printf("***** 扫雷游戏 *****\n");
printf("***** Mine Sweeper *****\n");
printf("***** 输入1:开始游戏 *****\n");
printf("***** 输入0:退出游戏 *****\n");
printf("***** 当前您的积分为:%-5d *****\n",Scores);
printf("***** by Remained *****\n");
printf("***********************************\n");
}
void OverShow()//游戏结束函数
{
printf("***********************************\n");
printf("***** 游戏退出 *****\n");
printf("***** ^_^ Bye-Bye! *****\n");
printf("***********************************\n");
}
void OpenShow()//游戏开始函数
{
printf("***********************************\n");
printf("***** 游戏开始 *****\n");
printf("***** 本关埋了5个地雷 *****\n");
printf("***** !^0^! !^0^! *****\n");
printf("***********************************\n\n\n");
}