使用C語言實現三子棋游戲
本文實例為大家分享了C語言實現三子棋游戲的具體代碼,供大家參考,具體內容如下
先簡單介紹一下我的三子棋小游戲是怎么玩的,就是自己跟電腦pk,只不過電腦沒這么智能。自己輸入想要下的坐標,電腦隨機生成一個坐標,直到贏家產生。在這個過程中我覺得比較難的就是贏家的判定部分。在c語言中隨機數的產生也就是調用srand()函數利用時間戳來獲取隨機值。算了游戲太簡單,我想你們也都是沖著代碼來的,直接上代碼。
代碼和實現
為了代碼邏輯性更高,沒那么繁雜,主要將代碼分為三個部分,頭文件game.h,和兩個c文件,game.c放主程序,body.c放各種函數。
1.game.c
講解:游戲開始要打印一個界面,然后選擇要玩游戲還是退出,如果玩游戲就直接調用Game函數再調用各種花里胡哨的函數來實現游戲。game.c沒什么可講的,都是基本操作,有手就行。
#include "game.h"
void menu() {
printf("********************\n");
printf("****** 1.play *****\n");
printf("****** 0.exit *****\n");
printf("********************\n");
}
void Game() {
char ch;
char board[ROW][COL] = { 0 };
InitBoard(board, ROW, COL);
ShowBoard(board, ROW, COL);
while (1) {
PlayerMove(board, ROW, COL);
ShowBoard(board, ROW, COL);
ch=WhoWin(board, ROW, COL);
if (ch == '*') {
printf("玩家贏!\n");
break;
}
else if (ch == '#') {
printf("電腦贏!\n");
break;
}
else if(ch=='a') {
printf("平局!\n");
break;
}
WindowPlay(board, ROW, COL);
ShowBoard(board, ROW, COL);
ch = WhoWin(board, ROW, COL);
if (ch == '*') {
printf("玩家贏!\n");
break;
}
else if (ch == '#') {
printf("電腦贏!\n");
break;
}
else if(ch=='a') {
printf("平局!\n");
break;
}
}
}
int main() {
menu();
srand((unsigned int)time(NULL));
int input = 0;
do {
printf("請輸入:");
scanf("%d", &input);
switch (input) {
case 1:
Game();
continue;
case 0:
break;
default:
printf("輸入不合法,請從新輸入\n");
continue;
}
} while (input);
return 0;
}
2.body.c
講解:body.c里就是各種花里胡哨的函數,一個功能一個函數,不要一個函數搞太多功能,看起來比較繁雜,條理不清晰。這里的棋盤借用二維數組來實現,因為二維數組和一個棋盤的構造類似,用二維數組再合適不過,如果你夠牛逼,你來個三維數組的。包含的功能有棋盤初始化,打印棋盤,玩家下,電腦下,最后就是判斷輸贏。判斷輸贏也是比較難的一個部分。這里我用了最粗暴的方法,就是分四種情況,行,列,對角線,還有棋盤滿了。比較繁瑣但是比較實用,也沒什么可說的都是比較常用的語句。唯一可說的就是srand()函數獲取隨機值,srand()功能就是生成隨機值,還需要一個種子seed為無符號整型數??梢杂胻ime(NULL)時間戳來作為這個種子,用rand()%n來獲取你想要的數字。
#include "game.h"
//初始化棋盤
void InitBoard(char board[ROW][COL], int row, int col) {
int i = 0;
for (i = 0; i < row; i++) {
int j = 0;
for (j = 0; j < col; j++) {
board[i][j] = ' ';
}
}
}
//打印棋盤
void ShowBoard(char board[ROW][COL], int row, int col) {
int i = 0;
for (i = 0; i < row; i++) {
int j = 0;
for (j = 0; j < col; j++) {
printf(" %c ", board[i][j]);
if (j < col - 1) {
printf("|");
}
}
printf("\n");
if (i < row - 1) {
printf("---|---|---\n");
}
}
}
//玩家下
void PlayerMove(char board[ROW][COL], int row, int col) {
do {
int i;
int j;
printf("請玩家輸入:");
scanf("%d%d", &i, &j);
if (i > row && j > col && i <= 0 && j<= 0) {
printf("坐標不合法,請從新輸入\n");
continue;
}
else if (board[i-1][j-1] == ' ') {
board[i-1][j-1] = '*';
break;
}
else {
printf("該處已被占請從新輸入\n");
continue;
}
} while (1);
}
//電腦下
void WindowPlay(char board[ROW][COL], int row, int col) {
printf("等待電腦下!\n");
do {
int i = rand() % 3;
int j = rand() % 3;
if (board[i][j] == ' ') {
board[i][j] = '#';
break;
}
else {
continue;
}
} while (1);
}
//判斷輸贏
char WhoWin(char board[ROW][COL], int row, int col) {
//判斷行
for (int i = 0; i < row; i++) {
int j = 0;
if (board[i][j] == board[i][j + 1] && board[i][j + 1] == board[i][j + 2] && board[i][j]!=' ') {
if (board[i][j] == '*') {
return board[i][j];
}
else {
return board[i][j];
}
}
}
//判斷列
for (int j = 0; j < col; j++) {
int i = 0;
if (board[i][j] == board[i+1][j] && board[i+1][j] == board[i+2][j] && board[i][j] != ' ') {
if (board[i][j] == '*') {
return board[i][j];
}
else {
return board[i][j];
}
}
}
//判斷對角線
int i = 0;
int j = 0;
if (board[i][j] == board[i + 1][j + 1] && board[i + 1][j + 1] == board[i + 2][j + 2] && board[i][j] != ' ') {
if (board[i][i] == '*') {
return board[i][j];
}
else{
return board[i][j];
}
}
if (board[i][j+2] == board[i + 1][j + 1] && board[i + 1][j + 1] == board[i + 2][j] && board[i][j+2] != ' ') {
if (board[i][i] == '*') {
return board[i][j+2];
}
else{
return board[i][j+2];
}
}
//判斷棋盤是否滿
int count = 0;
//char a=0;
for (i = 0; i < row; i++) {
int j = 0;
for (j = 0; j < col; j++) {
if (board[i][j] == ' ') {
count++;
}
}
}
if (count == 0) {
return 'a';
}
}
3.game.h
講解:這里主要給大家說一下頭文件,頭文件可以把各個c語言文件聯系起來,可以定義一些全局變量,宏,函數聲明,引用一些內部庫等。一次定義多處使用,其他c文件只要引用這個頭文件就賦予了它調用某些函數的權限,調用某些變量,宏的權限。頭文件只是聲明不占用內存空間,可以不用,但是強烈建議用,因為當一個工程的代碼量很大時,沒有頭文件就相當于沒有了頭。所以是很重要的。
#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <time.h> #include <stdlib.h> #define ROW 3 #define COL 3 //初始化棋盤 void InitBoard(char board[ROW][COL],int row,int col); //打印棋盤 void ShowBoard(char board[ROW][COL],int row,int col); //玩家下 void PlayerMove(char board[ROW][COL], int row,int col); //電腦下 void WindowPlay(char board[ROW][COL], int row,int col); //判斷輸贏 char WhoWin(char board[ROW][COL],int row,int col);
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關文章
Windows安裝配置C/C++(VS2017)OpenSSL開發(fā)環(huán)境配置教程
這篇文章主要為大家詳細介紹了Windows安裝配置C/C++,OpenSSL開發(fā)環(huán)境配置教程,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-07-07

