
C语言练手
利用C语言编写的井字棋游戏,界面是由字符串组成,,用到的知识很简单,确是一个很好的练习。
可以判断该位置是否有棋子,判断胜负以及利用随机数做了一个傻瓜AI。
//
// main.c
// 123
//
// Created by 刘林 on 2018/7/16.
// Copyright © 2018年 刘林. All rights reserved.
//
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <time.h>
int main()
{
//定义三个自定义函数,欢迎、游戏和再来一局
void welcome();
void game();
void again();
welcome();
return 0;
}
//游戏模块
void game(){
//定义变量,玩家、获胜者、行、列、选择下棋位置
int player = 0; //玩家 1 或者 2
int winner = 0; // 赢家
int row = 0; // 行
int rank = 0; // 列
int choice = 0; //选择
int ai[9]={};//ai选择列表
char chessboard[3][3]={
{'1','2','3'},
{'4','5','6'},
{'7','8','9'}
}; //创建数字棋盘
printf("\n\n我们开始游戏吧!\n\n");
//开始游戏,结束条件为已经下了超过9步或者有获胜者
for (int i = 0;i < 9 && winner == 0 ;i++)
{ player = (i % 2)+1;
//打印初始化棋谱,将创建的数字棋盘中的二位数组带入
printf(" # # \n");
printf(" # # \n");
printf(" %c # %c # %c \n",chessboard[0][0],chessboard[0][1],chessboard[0][2]);
printf(" # # \n");
printf(" # # \n");
printf("##############################\n");
printf(" # # \n");
printf(" # # \n");
printf(" %c # %c # %c \n",chessboard[1][0],chessboard[1][1],chessboard[1][2]);
printf(" # # \n");
printf(" # # \n");
printf("##############################\n");
printf(" # # \n");
printf(" # # \n");
printf(" # # \n");
printf(" %c # %c # %c \n",chessboard[2][0],chessboard[2][1],chessboard[2][2]);
printf(" # # \n");
printf(" # # \n");
//游戏规则说明
if (player == 1) {
printf("现在是电脑AI开始下,使用的棋子是%c\n");
printf("正在思考中...\n");
do {
srand((unsigned) time(NULL)); //用时间做种,每次产生随机数不一样
choice = rand() % 10; //产生0-9的随机数
rank = choice % 3;
rank--;
row = choice /3;
} while ((chessboard[row][rank]=='X') || (chessboard[row][rank]=='O') || choice==0);
}else{
printf("现在是玩家%d开始下,你使用的棋子是%c\n",player,player == 1?'X':'O');
printf("请根据上面的数字选择下棋位置:\n");
there:scanf("%d",&choice);
}
//读入下棋位置
rank = choice % 3;
rank--;
row = choice /3;
//*****非法判断*****
//1、判断输入的数字是否在9以内
if(choice <1 || choice > 9)
{
printf("请输入1-9范围内的数字!\n");
goto there;
}
//2、判断该位置是否已经有棋子
if((chessboard[row][rank]=='X')||(chessboard[row][rank]=='O'))
{
printf("该位置已经有人下了,请选择其它位置!\n");
goto there;
}
//*****落子并判断*****
//相应的位置落下对应的棋子
chessboard[row][rank] = player == 1?'X':'O';
//判断对角线是否相同
if ((chessboard[0][0] == chessboard[1][1] && chessboard[0][0] == chessboard[2][2])||(chessboard[0][2]==chessboard[1][1]&& chessboard[0][2] == chessboard[2][0]))
{
winner = player;
}
//判断每一行 或者每一列是否相同
else
{
for (int line = 0; line <= 2; line++)
{
if ((chessboard[line][0]==chessboard[line][1] && chessboard[line][0]==chessboard[line][2])||(chessboard[0][line]==chessboard[1][line] && chessboard[0][line]==chessboard[2][line]))
winner = player;
}
}
}
//游戏结束 打出最后棋谱
printf("\n\n");
printf(" # # \n");
printf(" # # \n");
printf(" %c # %c # %c \n",chessboard[0][0],chessboard[0][1],chessboard[0][2]);
printf(" # # \n");
printf(" # # \n");
printf("##############################\n");
printf(" # # \n");
printf(" # # \n");
printf(" %c # %c # %c \n",chessboard[1][0],chessboard[1][1],chessboard[1][2]);
printf(" # # \n");
printf(" # # \n");
printf("##############################\n");
printf(" # # \n");
printf(" # # \n");
printf(" # # \n");
printf(" %c # %c # %c \n",chessboard[2][0],chessboard[2][1],chessboard[2][2]);
printf(" # # \n");
printf(" # # \n");
if (winner == 0)
{
printf("\n\n厉害!厉害!平局!\n");
}
else
printf("\n\n****恭喜玩家%d,获胜!****\n",winner);
again();
}
//再来一局模块
void again(){
printf("\n\n###########################\n");
printf("# #\n");
printf("# 结 束 游 戏 #\n");
printf("# #\n");
printf("###########################\n\n\n");
char start='N';
printf("请输入Y重新开始游戏!\n");
do {
start=getchar();
} while (start!='Y');
if (start=='Y') {
game();
}
}
//欢迎界面模块
void welcome(){
char start;//开始
//游戏规则
printf("#########################\n");
printf("# #\n");
printf("# 井 字 棋 #\n");
printf("# #\n");
printf("#########################\n");
printf("游戏规则:\n");
printf("欢迎来到井字棋,该游戏有两个玩家,一个打圈(O),一个打叉(✗),轮流在\n3乘3的格上打自己的符号,最先以横、直、斜连成一线则为胜。\n\n");
//进入游戏界面
printf("请输入Y开始游戏!\n");
do {
start=getchar();
} while (start!='Y');
if (start=='Y') {
game();
}
}
评论