想写一个三子棋小游戏,首先我们得想到实现它都需要哪些步骤:
-
首先需要一个 3*3 的棋盘,那么这个棋盘第一次需要是空的;
-
第一步就是要初始化棋盘,使棋盘为空;
-
第二步当然就是打印出这个空棋盘;
-
第三步就是要开始玩游戏下棋子了,玩家走一步,电脑走一步,直到无路可走;但是再分析,玩家走一步,我们可以把棋盘打印一次,可以看到玩家走了哪一步;那电脑走一步,我们也可以让棋盘再打印一次,棋盘每次的排布一目了然。
-
在电脑和玩家下棋子的过程中,我们需要注意几个小点:
a. 玩家和电脑走的位置不能重复
b. 当三个相同的棋子连在一起的时候则胜出,所以有横竖和斜三种情况
c. 当棋子没有分出胜负则为平局 -
整个代码我们可以分为三个部分: 头文件game.h
测试部分test.c , 游戏核心部分 game.c
初始化 3*3 棋盘
void Init(char arr[ROW][COL],int row,int col)
{
int i=0;
int j=0;
for(i=0;i<row;i++)
for(j=0;j<col;j++)
{
arr[i][j]=' ';//初始化为空格
}
}
打印出整个棋盘
void Display(char arr[ROW][COL],int row,int col)
{
int i=0;
for(i=0;i<row;i++)
{
if(i<=row-1)
{
printf("|____|____|____|\n");
}
printf("| %c |%c |%c |\n",arr[i][0],arr[i][1],arr[i][2]);
}
printf("|____|____|____|\n");
}
玩家下棋子
void Player(char arr[ROW][COL],int row,int col)
{
int x=0;
int y=0;
printf("玩家走:\n");
while(1)
{
printf("请输入坐标:\n");
scanf("%d %d",&x,&y);
if((x>=1&&x<=3)&&(y>=1&&y<=3))
{
if(arr[x-1][y-1]==' ')//玩家在棋盘空的地方下棋子
{
arr[x-1][y-1]='X';
break;
}
else
printf("坐标被占用\n");
}
else
printf("坐标非法\n");
}
}
电脑下棋子
void Computer(char arr[ROW][COL],int row,int col)
{
int x=0;
int y=0;
printf("电脑走\n");
while(1)
{
int x=rand()%row;//随机数
int y=rand()%col;
if(arr[x][y]==' ')
{
arr[x][y]='0';
break;
}
}
}
- 在这个中间,我们还需要一个判断棋盘是否满盘,如果没有则继续走棋子
int Isfull(char arr[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(arr[i][j]==' ')
return 0;
}
}
return 1;
}
判断胜出: 横 竖 斜三种情况
char Iswin(char arr[ROW][COL],int row,int col)
{
int i=0;
int j=0;
for(i=0;i<row;i++)//横
{
if(arr[i][0]==arr[i][1]&&arr[i][1]==arr[i][2]&&arr[i][0]!=' ')
return arr[i][0];
}
for(j=0;j<col;j++)//竖
{
if(arr[0][j]==arr[1][j]&&arr[1][j]==arr[2][j]&&arr[0][j]!=' ')
return arr[1][j];
}
if(arr[0][0]==arr[1][1]&&arr[1][1]==arr[2][2]&&arr[0][0]!=' ')//斜
{
return arr[1][1];
}
if(arr[0][2]==arr[1][1]&&arr[1][1]==arr[2][0]&&arr[0][2]!=' ')//斜
{
return arr[1][1];
}
if(Isfull(arr,row,col)==1)//平局
{
return 'Q';
}
return ' ';
}
- 这些就是游戏的一些流程规则
- 那么在游戏代码的开始,我们需要一个界面来开始玩游戏
int main()
{
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");
break;
}
}
while(input);
//game();
system("pause");
return 0;
}
- 那么整个游戏的代码:
game.h
#ifndef _ GAME _ H __
#define _ GAME _ H __
#include<stdio.h>
#include<string.h>
#include<time.h>
#include<stdlib.h>
#define ROW 3
#define COL 3
void Init(char arr[ROW][COL],int row,int col);
void Display(char arr[ROW][COL],int row,int col);
void Player(char arr[ROW][COL],int row,int col);
void Computer(char arr[ROW][COL],int row,int col);
char Iswin(char arr[ROW][COL],int row,int col);
int Isfull(char arr[ROW][COL],int row,int col);
#endif
test.c
#include"game.h"
void menu()
{
printf("**************************\n");
printf("**** 1 : piay ****\n");
printf("**** 0 : exit ****\n");
printf("**************************\n");
}
void game()
{
char arr[ROW][COL]={0};
char ret=' ';
Init(arr,ROW,COL);
Display(arr,ROW,COL);
while(1)
{
Player(arr,ROW,COL);
Display(arr,ROW,COL);
ret=Iswin(arr,ROW,COL);
if(ret!=' ')
break;
Computer(arr,ROW,COL);
Display(arr,ROW,COL);
ret=Iswin(arr,ROW,COL);
if(ret!=' ')
break;
}
if(ret=='X')
{
printf("恭喜你,你赢了!\n");
}
else if(ret=='0')
{
printf("很遗憾,电脑赢了\n");
}
else if(ret=='Q')
{
printf("平局呦");
}
Display(arr,ROW,COL);
}
int main()
{
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");
break;
}
}
while(input);
//game();
system("pause");
return 0;
}
game.c
#include"game.h"
void Init(char arr[ROW][COL],int row,int col)
{
int i=0;
int j=0;
for(i=0;i<row;i++)
for(j=0;j<col;j++)
{
arr[i][j]=' ';
}
}
void Display(char arr[ROW][COL],int row,int col)
{
int i=0;
for(i=0;i<row;i++)
{
if(i<=row-1)
{
printf("|____|____|____|\n");
}
printf("| %c |%c |%c |\n",arr[i][0],arr[i][1],arr[i][2]);
}
printf("|____|____|____|\n");
}
void Player(char arr[ROW][COL],int row,int col)
{
int x=0;
int y=0;
printf("玩家走:\n");
while(1)
{
printf("请输入坐标:\n");
scanf("%d %d",&x,&y);
if((x>=1&&x<=3)&&(y>=1&&y<=3))
{
if(arr[x-1][y-1]==' ')
{
arr[x-1][y-1]='X';
break;
}
else
printf("坐标被占用\n");
}
else
printf("坐标非法\n");
}
}
void Computer(char arr[ROW][COL],int row,int col)
{
int x=0;
int y=0;
printf("电脑走\n");
while(1)
{
int x=rand()%row;
int y=rand()%col;
if(arr[x][y]==' ')
{
arr[x][y]='0';
break;
}
}
}
int Isfull(char arr[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(arr[i][j]==' ')
return 0;
}
}
return 1;
}
char Iswin(char arr[ROW][COL],int row,int col)
{
int i=0;
int j=0;
for(i=0;i<row;i++)
{
if(arr[i][0]==arr[i][1]&&arr[i][1]==arr[i][2]&&arr[i][0]!=' ')
return arr[i][0];
}
for(j=0;j<col;j++)
{
if(arr[0][j]==arr[1][j]&&arr[1][j]==arr[2][j]&&arr[0][j]!=' ')
return arr[1][j];
}
if(arr[0][0]==arr[1][1]&&arr[1][1]==arr[2][2]&&arr[0][0]!=' ')
{
return arr[1][1];
}
if(arr[0][2]==arr[1][1]&&arr[1][1]==arr[2][0]&&arr[0][2]!=' ')
{
return arr[1][1];
}
if(Isfull(arr,row,col)==1)
{
return 'Q';
}
return ' ';
}