学习的时候总会感到无聊,困乏,需要再适当的时间放松一下,但是玩自己做的游戏会更有成就感!这次就自己做一个井字棋来看一看吧。
目录
井字棋,最重要的就是棋盘和电脑自动下棋吧。棋盘是最开始的条件,而电脑自动下棋就是井字棋的精华所在!
大致流程:
void Initgame(char m[row][queue], int Row, int Queue);
void Printgame(char m[row][queue], int Row, int Queue);
void Playergame(char m[row][queue], int Row, int Queue);
void Computergame(char m[row][queue], int Row, int Queue);
int Victory(char m[row][queue], int Row, int Queue);
void game()
{
char n;
char m[row][queue] = { 0 };
Initgame(m, row, queue);
Printgame(m, row, queue);
while (1)
{
Playergame(m, row, queue);
Printgame(m, row, queue);
n = Victory(m, row, queue);
Computergame(m, row, queue);
Printgame(m, row, queue);
n = Victory(m, row, queue);
if (n != 'N')
{
break;
}
}
if (n == '*')
{
printf("玩家获胜\n");
}
else if (n == '#')
{
printf("电脑获胜\n");
}
else
{
printf("平局\n");
}
}
首先我们先来想办法制作,并且打印一个棋盘:
井字棋井字棋,必然是四根直线相互堆叠形成的,电脑没有很大的直线我们就用——、|代替,同时也要保证每个空格内能储存一个字符m。而打印到电脑上的m是一个平面,
所以推荐二维数组来搭建棋盘:代码如下:
//定义棋盘大小
#define row 3
#define queue 3
//打印棋盘
void Printgame(char m[row][queue], int Row, int Queue)
{
int i;
for (i = 0; i < Row; i++)
{
int j = 0;
for (j = 0; j < Queue; j++)
{
printf(" %c ", m[i][j]);
if (j < Queue - 1)
printf("|");
}
printf("\n");
j = 0;
for (j = 0; j < Queue; j++)
{
if (i < Row - 1)
printf("——");
}
printf("\n");
}
}
棋盘打印完了,就需要给二维数组初始化,并且保证美观,我们就用‘ ’来作为二维数组的初始内容,又因为是二维数组,用两个for循环即可完成!
二维数组的初始
//初始化
void Initgame(char m[row][queue], int Row, int Queue)
{
int i = 0;
for(i=0;i<Row;i++)
{
int j = 0;
for (j = 0; j < Queue; j ++ )
{
m[i][j] = ' ' ; //全部赋值为‘ ’
}
}
}
最基本的工作完成后,剩下的就是菜单、玩家下棋、电脑下棋、判断胜负的条件了;
现在我们大概拟定一下主函数的运行
//菜单
void mune()
{
printf("###############################\n");
printf("1,玩一局三子棋 2,退出游戏\n");
printf("###############################\n");
}
int main()
{
int i;
do
{
mune(); //输入菜单
scanf("%d", &i);
switch (i)
{
case 1: game(); break; //进入游戏内容
case 2: printf("欢迎下次光临~"); i = 0; break; //退出游戏
default: printf("输入错误\n~"); //如果输入其他数字就返回菜单
}
} while (i);
return 0;
}
接下来玩家决定不放水,决定自己先出,但是怎么下棋呢?
突破口就在二维数组m[][]上,通过一部分提示和判断所在地址有没有棋来进行的下棋
玩家下棋
//玩家下棋
void Playergame(char m[row][queue], int Row, int Queue)
{
int x, y, i = 1;
printf("请玩家下棋:\n");
while (i)
{
printf("请输入坐标:\n");
scanf("%d%d", &x, &y);
if (x >= 1 && x <= Row && y >= 1 && y <= Queue)
{
if (m[x - 1][y - 1] == ' ') //判断是否为‘ ’
{
m[x - 1][y - 1] = '*';
i = 0;
}
else
{
printf("此点您已下过,请重新选择"); //如果不为‘ ’就返回重下
}
}
else
{
printf("请输入 1<x<%d , 1<y<%d \n", Row, Queue);//下的范围超过棋盘大小
}
}
}
而电脑下棋就是另一个新的问题,如何让电脑全自动的下棋呢?
这时我们就会用一个时间头文件和rand函数。
电脑下棋
//头文件
#include<time.h>
//根据时间随机点
srand((unsigned int)time(NULL));
//电脑下棋
void Computergame(char m[row][queue], int Row, int Queue)
{
int x, y, i = 1;
printf("请电脑下棋\n");
while (i)
{
x = rand() % Row;
y = rand() % Queue; //保证不会超过棋盘
if (m[x][y] == ' ')
{
m[x][y] = '#';
i = 0;
}
}
}
最后就是判断胜利了!
根据井字棋的玩法,相同三个同行同列算胜利,相同三个斜线也算胜利:
我们要做到的就是胜利条件整合起来,具体如下:
//判断胜负
int Victory(char m[row][queue], int Row, int Queue)
{
int i, j;
for (i = 0; i < Row; i++)
{
if (m[i][0] == m[i][1] && m[i][1] == m[i][2] && m[i][0] != ' ')//横线
{
return m[i][1];
}
}
for (j = 0; j < Queue; j++)
{
if (m[0][j] == m[1][j] && m[1][j] == m[2][j] && m[0][j] != ' ')//竖线
{
return m[0][j];
}
}
if (m[2][2] == m[1][1] && m[1][1] == m[0][0] && m[0][0] != ' ')//斜线
return m[1][1];
if (m[0][2] == m[1][1] && m[1][1] == m[2][0] && m[0][2] != ' ')
return m[1][1];
return 'N'; //如果都不满足就返回n
}
再次进行整合优化,吧上述的所有代码段整合起来,就是我们的井字棋游戏了!
代码整和:
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include<time.h>
#include<stdlib.h>
#define row 3
#define queue 3
int Flairs(char m[row][queue], int Row, int Queue);
void Initgame(char m[row][queue], int Row, int Queue);
void Printgame(char m[row][queue], int Row, int Queue);
void Playergame(char m[row][queue], int Row, int Queue);
void Computergame(char m[row][queue], int Row, int Queue);
int Victory(char m[row][queue], int Row, int Queue);
//判断是否为满
int Flairs(char m[row][queue], int Row, int Queue)
{
int i, j;
for (i = 0; i < Row; i++)
{
for (j = 0; j < Queue; j++)
{
if (m[i][j] == ' ')
return 0;
}
}
return 1;
}
//初始化
void Initgame(char m[row][queue], int Row, int Queue)
{
int i = 0;
for (i = 0; i < Row; i++)
{
int j = 0;
for (j = 0; j < Queue; j++)
{
m[i][j] = ' ';
}
}
}
//打印棋盘
void Printgame(char m[row][queue], int Row, int Queue)
{
int i;
for (i = 0; i < Row; i++)
{
int j = 0;
for (j = 0; j < Queue; j++)
{
printf(" %c ", m[i][j]);
if (j < Queue - 1)
printf("|");
}
printf("\n");
j = 0;
for (j = 0; j < Queue; j++)
{
if (i < Row - 1)
printf("——");
}
printf("\n");
}
}
//玩家下棋
void Playergame(char m[row][queue], int Row, int Queue)
{
int x, y, i = 1;
printf("请玩家下棋:\n");
while (i)
{
printf("请输入坐标:\n");
scanf("%d%d", &x, &y);
if (x >= 1 && x <= Row && y >= 1 && y <= Queue)
{
if (m[x - 1][y - 1] == ' ')
{
m[x - 1][y - 1] = '*';
i = 0;
}
else
{
printf("此点您已下过,请重新选择");
}
}
else
{
printf("请输入 1<x<%d , 1<y<%d \n", Row, Queue);
}
}
}
//电脑下棋
void Computergame(char m[row][queue], int Row, int Queue)
{
int x, y, i = 1;
printf("请电脑下棋\n");
while (i)
{
x = rand() % Row;
y = rand() % Queue;
if (m[x][y] == ' ')
{
m[x][y] = '#';
i = 0;
}
}
}
//判断胜负
int Victory(char m[row][queue], int Row, int Queue)
{
int i, j;
for (i = 0; i < Row; i++)
{
if (m[i][0] == m[i][1] && m[i][1] == m[i][2] && m[i][0] != ' ')
{
return m[i][1];
}
}
for (j = 0; j < Queue; j++)
{
if (m[0][j] == m[1][j] && m[1][j] == m[2][j] && m[0][j] != ' ')
{
return m[0][j];
}
}
if (m[2][2] == m[1][1] && m[1][1] == m[0][0] && m[0][0] != ' ')
return m[1][1];
if (m[0][2] == m[1][1] && m[1][1] == m[2][0] && m[0][2] != ' ')
return m[1][1];
return 'N';
}
//菜单
void mune()
{
printf("###############################\n");
printf("1,玩一局三子棋 2,退出游戏\n");
printf("###############################\n");
}
//游戏执行
void game()
{
char n;
char m[row][queue] = { 0 };
Initgame(m, row, queue);
Printgame(m, row, queue);
while (1)
{
Playergame(m, row, queue);
Printgame(m, row, queue);
n = Victory(m, row, queue);
Computergame(m, row, queue);
Printgame(m, row, queue);
n = Victory(m, row, queue);
if (n != 'N')
{
break;
}
}
if (n == '*')
{
printf("玩家获胜\n");
}
else if (n == '#')
{
printf("电脑获胜\n");
}
else
{
printf("平局\n");
}
}
//测试
void quizz()
{
int i;
do
{
mune();
scanf("%d", &i);
switch (i)
{
case 1: game(); break;
case 2: printf("欢迎下次光临~"); i = 0; break;
default: printf("输入错误\n~");
}
} while (i);
}
int main()
{
srand((unsigned int)time(NULL));
quizz();
return 0;
}
感谢!